query_posts()與WP_Query()分頁不正確的問題困擾了我大半天,百度+谷歌數(shù)小時(shí)也無果,大多數(shù)解決方案都沒有注意到posts_per_page值過小不能覆蓋后臺(tái)閱讀中的設(shè)置,正當(dāng)要放棄的時(shí)候找到了解決辦法.
首先應(yīng)該清楚,query_posts()應(yīng)用于主循環(huán),而WP_Query()用于生成次級(jí)循環(huán).
不理解?比如,我有一個(gè)特殊的分類頁面需要指定顯示一定數(shù)量的文章,這個(gè)顯示數(shù)量與其他分類不同,不能用后臺(tái)的“設(shè)置→閱讀→博客頁面至多顯示”來統(tǒng)一設(shè)置,那么就需要給這個(gè)特殊分類寫一個(gè)模板,例如:category-wordpress-themes.php,此時(shí)需要用到query_posts()函數(shù),通過參數(shù):posts_per_page來實(shí)現(xiàn)控制顯示的文章數(shù)量.
如果只是想在邊欄等列出某分類文章列表或最新文章之類的文章列表,那么應(yīng)該使用WP_Query()函數(shù)而不是query_posts(),一個(gè)頁面應(yīng)該最多只出現(xiàn)一次主循環(huán).
按照上例所述,當(dāng)我們制作了這樣一個(gè)分類頁后,如果需要翻頁功能,就需要這樣一行代碼:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
這是用來獲取當(dāng)前頁碼的,還需要在query_posts()中添加參數(shù)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;
看上去似乎沒什么問題,可以正常翻頁了,事實(shí)不然,當(dāng)我們把posts_per_page的值改為5,而后臺(tái)“設(shè)置→閱讀→博客頁面至多顯示”的值默認(rèn)是10,翻頁就會(huì)變得不正常。
雖然這樣的情況極難發(fā)生,但為了代碼更完美無錯(cuò),我們可以在function.php中添加如下代碼解決這個(gè)問題:
- 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');
這里設(shè)置的posts_per_page值需與query_posts()函數(shù)中的相同,注意判斷部分,僅在我需要的分類模板中應(yīng)用,且判斷了是否為主循環(huán),否則會(huì)影響次級(jí)循環(huán)的輸出結(jié)果.
請(qǐng)注意:使用query_posts()之后必須使用wp_reset_query()重置循環(huán),否則會(huì)影響到其他循環(huán)的輸出結(jié)果,wp_reset_query()應(yīng)添加在翻頁代碼的后面.
如果你非要使用WP_Query(),同時(shí)也需要具有翻頁功能,那么就要修改你的翻頁代碼,通常翻頁代碼都封裝在一個(gè)函數(shù)內(nèi),那么就要給這個(gè)函數(shù)傳遞參數(shù),當(dāng)前對(duì)象,例如以下代碼:
- $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傳遞給翻頁函數(shù),替代默認(rèn)的$wp_query,使用WP_Query()之后必須使用wp_reset_postdata();重置循環(huán).
新聞熱點(diǎn)
疑難解答
圖片精選