2013-04-15 197 views
3

在我的主頁上使用WordPress我希望能夠對隨機帖子進行查詢,這些帖子在整個分頁中保持一致,而貼紙仍然會首先顯示。我已經儘可能創造出一致的流程,但我錯過了像其他帖子那樣隨機出現的貼圖。一致隨機設置貼子的帖子

function custom_query($query) { 
    global $custom_query; 
    if ($custom_query && strpos($query, 'ORDER BY RAND()') !== false) { 
     $query = str_replace('ORDER BY RAND()', $custom_query, $query); 
    } 
    return $query; 
} 

add_filter('query', 'custom_query'); 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
$seed = $_SESSION['seed']; 

if (empty($seed)) { 
    $seed = rand(); 
    $_SESSION['seed'] = $seed; 
} 

global $custom_query; 
$custom_query = " ORDER BY rand($seed) "; 

$args = array(
    'caller_get_posts' => 1, 
    'orderby' => 'rand', 
    'paged' => $paged, 
); 

query_posts($args); 
$custom_query = ''; 

編輯:根據你的建議,我設法用下面的代碼用它來解決:

$sticky_post_ids = get_option('sticky_posts'); 
function mam_posts_query($query) { 
    global $mam_posts_query; 
    if ($mam_posts_query && strpos($query, 'ORDER BY RAND()') !== false) { 
     $query = str_replace('ORDER BY RAND()', $mam_posts_query, $query); 
    } 
    return $query; 
} 
add_filter('query','mam_posts_query'); 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
$seed = date('Ymdh'); // Sets an hourly random cache 
global $mam_posts_query; 
$mam_posts_query = " ORDER BY rand($seed) "; 

$args = array(
    'orderby' => 'rand', 
    'paged' => $paged, 
    'post__not_in' => get_option('sticky_posts') 
); 
$projects = query_posts($args); 
$mam_posts_query = ''; 

if ($paged === 1) { 
    $stickies = get_posts(array('include' => $sticky_post_ids)); 
    $projects = array_merge($stickies, $projects); 
} 

謝謝你的建議!

+1

我會避免查詢中的ORDER BY RAND(),這是一個相當慢的查詢參數。你可以隨意使用php來代替...你想讓所有的貼紙都在每一頁上面嗎?或者只是在那個恰好位於該特定頁面的隨機custom_query中的粘貼文章? – hexalys

+0

謝謝你指出。是的,所有膠粘物都在輸出中。 –

回答

2

我知道,在codex wp_query pag E中的描述是有點混亂,但我相信,所有你需要做的是設置

'ignore_sticky_posts' => 0

,在我的實驗工作,但當然,在處理問題,我不知道在哪裏或在另一個位置可能查詢有變更時..

無論如何,如果不爲你工作,你也可以用

$sticky = get_option('sticky_posts');

得到膠粘物,然後設置類似這樣的查詢:

'post__in' => get_option('sticky_posts')

或即便如此:(注意not_in

$query->set('post__not_in', get_option('sticky_posts')); 

請注意,默認情況下,膠粘物只能顯示在主頁。

您還可以使用一個雙循環的方法:

$stickyQuery = new WP_Query(array(
     'cat'     => $your_category,// example 
     'ignore_sticky_posts' => 0, 
     'post__in'    => get_option('sticky_posts'), 
     'posts_per_page'   => -1    //Get ALL and ONLY the stickies, or how many you want 
    ); 
while($stickyQuery->have_posts()) : $stickyQuery->the_post(); 

    //... (Sticky Posts should show) 

endwhile; 
wp_reset_query(); 

//... (Continue main query or start a new one excluding the last....) 
1

如果你不介意顯示相同的隨機職位,所有遊客,你可以使用一個短暫的get_posts():

$my_random_posts = get_transient('my_random_posts'); 
if (!$my_random_posts) { 
    $sticky_post_ids = get_option('sticky_posts'); 
    $my_random_posts = get_posts(array(
           'exclude' => $sticky_post_ids, 
           'orderby' => 'rand', 
           )); 

    if ($sticky_post_ids) { 
    $sticky_posts = get_posts(array(
           'include' => $sticky_post_ids, 
           )); 
    $my_random_posts = array_merge($sticky_posts, $my_random_posts); 
    } 

    set_transient('my_random_posts', $my_random_posts , 900); # 15 minutes 
} 
+0

這看起來很有趣,以前從未聽說過瞬變。我如何將這個應用到查詢中?嘗試運行它,但它只是輸出隨機帖子(也重新出現)。 –

+0

經過實際測試後,我稍微編輯了代碼以修復$ sticky_post_ids爲空時的問題。否則它在我的最後工作正常。瞬變有點像選項,只是它們駐留在持久對象緩存(而不是數據庫)中(如果有的話)。因此,你可以設置一個到期時間(在我的例子中是15分鐘) –

+0

順便說一句,我不確定你應該如何應用這個查詢的意思。 '$ my_random_posts'非常像'$ WP_Query'那樣返回帖子,例如用於小部件等。 –