web-dev-qa-db-fra.com

La pagination avec les types de publication personnalisés posent 404 problèmes

J'ai un index.php très simple:

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

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

Et mon content.php ressemble à peu près à ceci:

<?
$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 ?>

Il y a 14 articles au total, mais les "prochains" articles sont toujours redirigés vers un 404 sur /page/2 au lieu d'afficher les 7 articles restants.

Edit: Si j'utilise un WP_Query personnalisé au lieu de query_posts, les liens suivant et précédent ne s'afficheront même pas. https://Gist.github.com/elclanrs/4782705

J'essaie de trouver une solution à ce problème depuis hier. Je suis au courant de toutes les autres questions similaires à celle-ci, mais pour ma configuration particulière, aucune des solutions que j'ai trouvées n'a fonctionné, notamment:

Je connais aussi pre_get_posts mais j'aimerais savoir quel est le problème avec ma configuration actuelle. Des idées?

2
elclanrs

Au moment où vous atteignez le modèle, WordPress a déjà interrogé la base de données et décidé quoi afficher en fonction de ces résultats.

Vous voyez une erreur 404 car, en fonction de la requête principale par défaut, il n'y a plus de messages à afficher.

Lorsque vous appelez query_posts dans le modèle, vous écrasez cette requête d'origine. Malgré le fait que vos résultats de requête nouveau _ contiennent plus de publications, WordPress n’a aucune connaissance de cette requête modifiée.

C'est pourquoi vous devriez ne jamais utiliser query_posts dans le modèle . Vous avez déjà fourni la solution à votre problème, utilisez l'action pre_get_posts pour modifier la requête principale avant cela se produit.

4
Milo