query_posts()與WP_Query()分頁不正確的問題困擾了我大半天,百度+谷歌數小時也無果,大多數解決方案都沒有注意到posts_per_page值過小不能覆蓋后臺閱讀中的設置,正當要放棄的時候找到了解決辦法.
首先應該清楚,query_posts()應用于主循環,而WP_Query()用于生成次級循環.
不理解?比如,我有一個特殊的分類頁面需要指定顯示一定數量的文章,這個顯示數量與其他分類不同,不能用后臺的“設置→閱讀→博客頁面至多顯示”來統一設置,那么就需要給這個特殊分類寫一個模板,例如:category-wordpress-themes.php,此時需要用到query_posts()函數,通過參數:posts_per_page來實現控制顯示的文章數量.
如果只是想在邊欄等列出某分類文章列表或最新文章之類的文章列表,那么應該使用WP_Query()函數而不是query_posts(),一個頁面應該最多只出現一次主循環.
按照上例所述,當我們制作了這樣一個分類頁后,如果需要翻頁功能,就需要這樣一行代碼:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
這是用來獲取當前頁碼的,還需要在query_posts()中添加參數paged,代碼片段如下:
- $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
- $args = array(
- 'posts_per_page' => 20,
- 'paged' => $paged,
- 'post_status' => 'publish',
- 'cat' => $cat,
- );
- query_posts($args);
- while (have_posts()) : the_post();
- echo '<li>';
- echo '<a href="' . get_permalink() . '">' . the_title_attribute('echo=0') . '</a>';
- echo '</li>';
- endwhile;
看上去似乎沒什么問題,可以正常翻頁了,事實不然,當我們把posts_per_page的值改為5,而后臺“設置→閱讀→博客頁面至多顯示”的值默認是10,翻頁就會變得不正常。
雖然這樣的情況極難發生,但為了代碼更完美無錯,我們可以在function.php中添加如下代碼解決這個問題:
- function custom_posts_per_page($query){
- if( is_category('wordpress-themes') && $query->is_main_query() ) {
- $query->set('posts_per_page', 20);
- }
- }
- add_action('pre_get_posts', 'custom_posts_per_page');
這里設置的posts_per_page值需與query_posts()函數中的相同,注意判斷部分,僅在我需要的分類模板中應用,且判斷了是否為主循環,否則會影響次級循環的輸出結果.
請注意:使用query_posts()之后必須使用wp_reset_query()重置循環,否則會影響到其他循環的輸出結果,wp_reset_query()應添加在翻頁代碼的后面.
如果你非要使用WP_Query(),同時也需要具有翻頁功能,那么就要修改你的翻頁代碼,通常翻頁代碼都封裝在一個函數內,那么就要給這個函數傳遞參數,當前對象,例如以下代碼:
- $args = array(
- 'cat' => $cat,
- 'posts_per_page' => 10,
- );
- $my_query = new WP_Query($args);
- while ($my_query->have_posts() ) : $my_query->the_post();
- echo '<li><a href="' . get_permalink() . '" rel="bookmark">' . the_title_attribute('echo=0') . '</a></li>';
- endwhile;
需要將$my_query傳遞給翻頁函數,替代默認的$wp_query,使用WP_Query()之后必須使用wp_reset_postdata();重置循環.
新聞熱點
疑難解答
圖片精選