wp_queryとのページネーションはバギーです - いくつかのページで働いていますが、他のページではありません

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7687

  •  16-10-2019
  •  | 
  •  

質問

パジネーションと非常に独特なバグがあります:(スラッグ「Last-News」を備えたカテゴリのページごとに4つの投稿を表示しようとしています。

ページネーション関数は正しく機能しているようです。 33の投稿があります。ページネーションは、9ページと次の形式のリンクで正しく構築されます:/category/last-est-news //

興味深いのは、ページ1〜4を含むページから正しく機能する(ページごとに4つの投稿を表示する)ことです。ただし、5〜9ページではまったく機能しません。テンプレートを提供しているようには見えません...私が見つけることができる唯一のエラーは、「カテゴリの最新のページ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";
 }
}
役に立ちましたか?

解決

WordPressは、すべてのページで独自のクエリを実行します。新しいクエリを作成する代わりに、そのクエリを変更する必要があります。現在起こっているのは、WordPressが10ページあたりの標準投稿でクエリを行うことですが、これらの結果で何もしておらず、独自のクエリを行います。これは機能します... WordPressが投稿#33を超えるまで、ページ番号4にあります。

  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 );
    }
}

他のヒント

@Jan Fabryの返信に基づいて、構文を少し変更しました。うまくいきます。説明ありがとう1月!!!

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;
  }
}
ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top