web-dev-qa-db-ja.com

WP_Queryを使ったページ付けはバグがあります - あるページではうまくいきますが、他のページではうまくいきません

私はページネーションに関して非常に独特のバグを抱えています:(私はスラッグ "lastest-news"を持つカテゴリのためにページごとに4の投稿を表示しようとしています。

ページ付け機能は正しく機能しているようです。 33投稿ありますページ付けは、9ページと次の形式のリンクで正しく作成されます。/ category/lastest-news/page //

おもしろいことに、1-4ページから(1ページに4つの投稿を表示します)正しく動作するということです。ただし、5〜9ページではまったく機能しません。それはテンプレートを提供するようにさえ思えません...私が見つけることができる唯一の誤りは「カテゴリLastest-news Page 5のために何も見つからない」と言っているページです。

それがまったく機能しないのであれば私は理解するでしょう、しかしランダムに4ページでそれ以上ではないのですか?

私は本当にどんな助けにでも本当に感謝するでしょう!私は4時間以上かけて何が悪いのかを突き止めようとしていて、それは私を悩ませています。

手伝ってくれてありがとう :)

私はクエリに次のコードを使用しています。

<?php 
$page = get_query_var('paged');
$posts_on_page = new WP_Query("posts_per_page=4&category_name=lastest-news&paged=".$page);

//loop to display every one of 4 posts

//pagination
pagination($posts_on_page->max_num_pages);
?>

私はこの記事から改ページ機能を使っています: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

これは関数です(これはうまくいくようです):

function pagination($pages = '', $range = 2){  
 $showitems = ($range * 2)+1;  

 global $paged;
 if(empty($paged)) $paged = 1;

 if($pages == '')
 {
     global $wp_query;
     $pages = $wp_query->max_num_pages;
     if(!$pages)
     {
         $pages = 1;
     }
 }   

 if(1 != $pages)
 {
     echo "<div class='pagination'>";
     if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo;</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo;</a>";

     for ($i=1; $i <= $pages; $i++)
     {
         if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
         {
             echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
         }
     }

     if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>&rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>&raquo;</a>";
     echo "</div>\n";
 }
}
4
dashaluna

WordPressは各ページに対して独自のクエリを実行します。新しいクエリを作成するのではなく、そのクエリを変更する必要があります。今起こることはWordPressが10のページあたりの標準の投稿で質問をするということです、しかし、あなたはこれらの結果に関して何もしないで、あなた自身の質問をします。これはうまくいきます... WordPressがページ番号4にあるポスト#33を超えるまで。

  1. WordPressは1〜10のクエリ、テンプレートは1〜4のクエリ
  2. WordPressは11〜20をクエリし、テンプレートは5〜8をクエリします。
  3. WordPressは21〜30をクエリし、テンプレートは9〜12をクエリします。
  4. WordPressは31〜40をクエリし、テンプレートは13〜16をクエリします。
  5. WordPressは41から50まで問い合わせますが、結果が得られないため404が返されます。テンプレートはロードされません。

そのため、代わりにWordPressが実行する標準的なクエリをfunctions.phpまたはプラグインに配置して修正する必要があります。

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
    if ( $wp_query->is_category && 'latest-news' == $wp_query->get_queried_object()->slug ) {
        $wp_query->set( 'posts_per_page', 4 );
    }
}
6
Jan Fabry

@ Jan Fabryの回答に基づいて、構文を少し変更しました。それはうまくいきます。説明をありがとうJan。

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
  if ($wp_query->query_vars['category_name'] == 'latest-news'){
    $wp_query->query_vars['posts_per_page'] = 4;
  }
}
1
dashaluna