web-dev-qa-db-ja.com

カスタムwp_queryページ付け - next_posts_link()またはwp_pagenavi()は常に空です

私はこれが死について議論されたトピックであることを知っています、しかし、私は多くの解決策を読みました、そしてなぜ私のページ付けが単にうまくいかないか理解することができません。

非常にシンプルなカスタムwp_queryがあります。

$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1;

$project_query = new WP_query(array(
  'post_type' => 'project',
  'paged' => $current_page,
  'posts_per_page' => 50
));

そこには2000プロジェクトがありますので、間違いなくページがあります。

これは私のテーマのindex.phpにあります。

とにかく、URL /p/pagenoは404を返します。関数next_posts_link('Older Entries »', $project_query->max_num_pages);は常に空です。

私はいくつかの同様の質問を読んで、試してみました。

  1. ページ付けを確実に開始するために、一度に最大1件の投稿を表示するように読み取り設定を設定します。
  2. Wp_pagenaviのインストール - 同じ結果
  3. カスタムページテンプレートでこのコードを使ってホームページを静的ページに設定する - これはややうまくいく(/p/2など404はしないでください)が、next_posts_link()は2ページ目で停止し、それ以上は進みません。
  4. カスタムページテンプレートのget_query_var('paged')get_query_var('page')に変更
  5. $project_query$wp_queryに名前変更

迷っていますが、これはとても単純なはずですが、ページネーション常にがWordpressで作業するときに私を殺してしまうことのようです。

1
waffl

ページネーションの問題のほとんどは、テンプレートファイル内のコードを実行する前に行われるクエリとテンプレートの読み込みプロセスの誤解に起因していると思います。

誰かがページを要求したとき:

  1. WordPressはリクエストを解析し、着信URLに基​​づいてそれが何のためにあるのかを決定します。たとえば、メインのルートページなのか、categoryで始まるのか、単一の投稿のパターンと一致するのか、ページ番号があるのか​​などです。正しいクエリ変数は、このプロセスから設定されます。

  2. WordPressは、最後の手順で設定したクエリ変数を使用して、データベースに対してメインクエリを実行します。

  3. WordPressはメインクエリの結果を見て、それが成功したかどうか、または結果が生成されなかったかどうかを判断します。それが成功した場合、WordPressはその種類のリクエストに適したテンプレートをロードします。そうでなければ404テンプレートをロードします。

それで、上記のすべてが期待通りに行けば、あなたはついにテンプレートの中に入ります。しかし、今、私たちは一つの問題の原因を見ることができます - そのメインクエリが結果を生成しなかったなら、あなたはあなたのカスタムクエリを実行するためにテンプレートに達することは決してないでしょう。そのメインクエリは、テンプレート内のカスタムクエリとは関係ありません。カスタムクエリにそのページ番号の結果があるかどうかは、メインクエリに対応するページがない場合は関係ありません。この場合の答えは、メインクエリが起こる前にpre_get_posts で修正することです。そのクエリは、テンプレート内で別のクエリを実行する代わりに、必要な結果を得ます。

あなたがあなたの質問で言及するもう一つの選択肢は、静的なページを使うことです。これは、メインクエリに関する上記の動作の例外です。スタティックページは、URLに設定したページ番号に関係なく、その単一ページのコンテンツを返します。これが、メインクエリで404の問題を回避する方法です。その場合、Kaiserが彼の答えで述べているように、next/previous postsリンク機能を使用するときには正しいクエリーオブジェクトを参照しなければなりません。

2
Milo

あなたの主な問題は以下のとおりです。

  • エラー報告/デバッグが有効になっていません:WP_Query vs. WP_query..
  • あなたの投稿リンク呼び出しの中で、あなたはあなたのカスタムクエリの代わりにメインクエリを参照しています。

これを見てください。

$project_query = new WP_Query( array(
  'post_type'      => 'project',
  'paged'          => get_query_var('paged') ? get_query_var('paged') : 1,
  'posts_per_page' => 50
) );
var_dump( get_next_posts_link( "Older Entries →", $project_query->max_num_pages ) );
1
kaiser