web-dev-qa-db-fra.com

La pagination revient 404 après la page 20

J'ai une boucle paginée qui extrait 4 messages par page à partir d'un type de message personnalisé. Cela fonctionne très bien, avec le seul inconvénient que la pagination ne va pas sur le page/20 tout ce qui suit est 404, et le posts_nav_link ne montrera pas du tout la flèche suivante. Comme les pages ne sont tout simplement pas là.

Au total, 119 articles publiés dans le type d'article personnalisé. Si je change le posts_per_page en 6, par exemple, je pourrai accéder à plus de messages de la fin, mais cela s'arrêtera également au page/20.

Sur le site de production, la pagination s'arrête à 21, car la base de données dynamique contient plus d'entrées.

Le paramètre "Afficher les pages de blog au plus" est défini sur 6.

Voici la boucle que j'utilise:

<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args  = array(
    'posts_per_page' => 4,
    'orderby'        => 'modified',
    'post_type'      => "projekte",
    'paged'          => $paged
);
$custom_query = new WP_Query($args);
$c = 0;
while($custom_query->have_posts()) :
    $custom_query->the_post();
    ?>
    <article>...</article>
    <?php
endwhile;
wp_reset_postdata(); // reset the query
?>

J'ai parcouru le functions.php un million de fois à la recherche d'un filtre get_pre_posts limitant, mais je ne peux rien voir.

J'ai également reçu une configuration du journal des erreurs et rien n'y est renvoyé, je l'ai testé pour vérifier qu'il fonctionne.

Aucune suggestion?

4
any_h

Ce que vous vivez est tout à fait normal et attendu. C’est l’une des principales raisons pour lesquelles j’ai toujours martelé sur ce point: ne jamais utiliser de requêtes personnalisées pour remplacer la requête principale sur la page d’accueil ou tout type de page d’archive. Ils résolvent un problème mais en créent beaucoup d'autres

Regardons ce que vous avez et pourquoi vous obtenez ces résultats:

Bases

Bien que vous ne voyiez pas la sortie sur votre page d’archive, la requête principale s’exécute au chargement de every page et renvoie un tableau de publications, quelle que soit leur origine. La suppression de la boucle n'empêche pas l'exécution de la requête principale. La boucle affiche simplement ce qui est récupéré par la requête principale. Donc, ce qui se passe fondamentalement, vous récupérez deux ensembles de publications par chargement de page si vous remplacez la boucle par défaut par une boucle personnalisée. Les publications récupérées par la requête principale et les publications récupérées par la requête personnalisée. Si vous voulez tester cela, ajoutez la ligne de code suivante en dehors de la boucle sur votre page d'archive dans les balises php

?><pre><?php var_dump( $wp_query->posts ); ?></pre><?php

Ceci affichera le tableau des articles récupérés par la requête principale sur cette page spécifique.

Cela rend les requêtes personnalisées très inefficaces lorsqu’il remplace la requête principale. C'est comme si vous remplaciez un pneu gonflé qui est en parfait état par un pneu crevé et usé.

VOTRE SCÉNARIO

Vous avez le scénario suivant

  • 119 messages de votre type de message personnalisé

  • Le nombre d'options d'affichage par page dans l'administrateur est de 6

  • La requête personnalisée est configurée pour récupérer 4 messages par page

LES MATHS

Votre requête principale renverra 20 pages que vous pourrez tester avec echo $wp_query->max_num_pages;. Le calcul est facile, vous avez 119 articles, que vous pouvez également vérifier avec echo $wp_query->found_posts;, messages par page est défini à 6 dans admin, donc le plafond de 119/6 = 20

En ce qui concerne la requête personnalisée, vous pouvez accéder aux mêmes informations que ci-dessus en remplaçant $wp_query par $custom_query. Vous verrez que vous avez encore 119 articles, mais vous aurez 30 pages, car le nombre de messages par page est maintenant fixé à 4. Le plafond de 119/4 = 30

404 À LA PAGE 21

Chaque fois qu'il n'y a aucune publication à afficher dans la requête principale, un 404 est déclenché et c'est ce que vous voyez. Il y a assez de messages pour remplir 20 pages, pas 21 ou plus. Donc, quand vous allez à la page 21, la requête principale 404 est simplement parce qu'il n'y a plus de publications à afficher, que vous ayez encore beaucoup à faire avec votre requête personnalisée.

J'ai vu des publications où la solution est simple, changez simplement le nombre de publications par page dans la page d'administration pour qu'elles correspondent à celles de votre requête personnalisée. Ne fais jamais ça . Oui, cela résout le problème, mais cela élimine le problème réel suivant: vous ne devez pas remplacer la requête principale par une requête personnalisée. Et BTW, la vraie solution au problème est assez simple, propre et constitue la bonne méthode pour obtenir ce dont vous avez besoin.

POURQUOI LA RECHERCHE PERSONNALISÉE

Vous avez décidé de choisir une requête personnalisée à cause de deux choses

  • Quantité différente de messages par page sur votre page d’archive de type message personnalisée que le reste du site

  • Avoir les messages triés par date modifiée et non la date de publication par défaut

Comme vous pouvez le constater, vous avez résolu deux problèmes avec votre requête personnalisée, mais vous en avez créé d'autres.

LA SOLUTION

C'est la méthode correcte et simple pour résoudre votre problème. Utilisez pre_get_posts pour modifier la requête principale avant son exécution. pre_get_posts modifie les variables de requête en conséquence, ce qui permet de calculer la requête SQL pour la requête de page spécifique.

Vous devez faire deux choses ici, la première serait de supprimer votre requête personnalisée sur votre page d'archive et de la remplacer par la boucle par défaut. Une fois que vous avez fait cela, vous verrez 6 messages par page classés par date de publication comme il se doit.

Maintenant, ouvrez functions.php et utilisez pre_get_posts pour corriger le nombre de publications par page et ordre de tri.

add_action( 'pre_get_posts', function ( $q ) 
{
    if(    !is_admin() 
        && $q->is_main_query() 
        && $q->is_post_type_archive( 'projekte' ) 
    ) {
        $q->set( 'posts_per_page', 4          );
        $q->set( 'orderby',        'modified' );
    }
});

Vous devriez maintenant voir 4 articles par page, classés par date de modification, correctement paginés sur votre page d'archive de type d'article personnalisée projekte

LECTURE SUPPLEMENTAIRE

Vous devriez également lire le post suivant que j'avais écrit sur un problème similaire il y a quelque temps, ainsi que tous les posts que j'ai liés à ce post spécifique

MODIFIER

Pour ceux coincés dans les versions php de dinosaures qui ne supportent pas les fermetures, voici la version de secours de l'action pre_get_posts

add_action( 'pre_get_posts', 'wpse176347_pre_get_posts' );
function wpse176347_pre_get_posts( $q ) 
{
    if(    !is_admin() 
        && $q->is_main_query() 
        && $q->is_post_type_archive( 'projekte' ) 
    ) {
        $q->set( 'posts_per_page', 4          );
        $q->set( 'orderby',        'modified' );
    }
}
18
Pieter Goosen