web-dev-qa-db-ja.com

カスタム投稿タイプのページ付けで404件の問題が発生する

私はとてもシンプルなindex.phpを持っています:

<div id="content">
  <? get_template_part('content', get_post_format()) ?>
</div>

<div id="pagination">
  <? previous_posts_link() ?>
  <? next_posts_link() ?>
</div>

そして私のcontent.phpはだいたいこんな感じになります:

<?
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
query_posts([
  'post_type' => ['articles', 'projects', 'tips'],
  'orderby' => 'date',
  'posts_per_page' => 7,
  'paged' => $paged
]);
?>

<? while(have_posts()): the_post() ?>
  <article class="post">
    <h2><? the_title() ?></h2>
    <p><? the_excerpt() ?></p>
    <ul>
      <? foreach($categories as $cat): ?>
      <li class="category"><a href="#"><?= $cat->name ?></a></li>
      <? endforeach ?>
    </ul>
  </article>
<? endwhile ?>

合計14の投稿がありますが、 "次の"投稿は常に残りの7つの投稿を表示するのではなく、/page/2上の404にリダイレクトしています。

編集:私がWP_Queryの代わりにカスタムのquery_postsを使った場合、次と前のリンクは表示されません。 https://Gist.github.com/elclanrs/4782705

私は昨日からこの問題の解決策を見つけようとしていました。私はこれと同じような他のすべての質問を知っています、しかし私の特定の設定のために私がうまくいった解決策のどれも含んでいませんでした。

私はpre_get_postsも知っていますが、私の現在の設定で何が問題なのか知りたいのですが。何か案は?

2
elclanrs

あなたがテンプレートにたどり着くまでに、WordPressはすでにデータベースに問い合わせをし、それらの結果に基づいて何を表示するかを決めました。

デフォルトのメインクエリに基づいて表示する投稿がこれ以上ないため、404エラーが発生しています。

テンプレートでquery_postsを呼び出すと、元のクエリが上書きされます。あなたの new クエリの結果にもっと多くの投稿が含まれているという事実にもかかわらず、WordPressはこの修正されたクエリを認識していません。

これががテンプレートの中でquery_postsを決して使わない理由です。あなたはすでにあなたの問題に対する解決策を提供しています、 pre_get_posts アクションを使用してメインクエリの前に変更してください。

4
Milo