web-dev-qa-db-fra.com

Les pages paginées affichent un contenu correct, mais les liens de pagination ne le sont pas.

J'utilise un WP_Query personnalisé pour afficher des messages sur une page d'accueil statique. et générer des liens de pagination numérotés avec des fonctions paginate_links. C'est le code que j'ai ...

$latest_args = array(
    'post_type' => 'post',
    'category__not_in' => array( 3 ),
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
);

$latest_query = new WP_Query( $latest_args );

if ( $latest_query->have_posts() ) :

    while ( $latest_query->have_posts() ) : $latest_query->the_post();
        get_template_part( 'content', get_post_format() );
    endwhile;

    if ( $latest_query->max_num_pages > 1 ) :
        $big = 999999999;
        echo '<div class="pagination">';
        echo paginate_links( array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format' => '?paged=%#%',
            'current' => max( 1, get_query_var('paged') ),
            'total' => $latest_query->max_num_pages
        ) );
        echo '</div>';
    endif;

endif;

wp_reset_postdata();

Mais lorsque je l'utilise sur mon static front page, il affiche toujours le contenu de la première page sur toutes les autres pages également. Mais cela a été corrigé en ajoutant un paramètre paginé à la requête comme suggéré dans le codex .

if ( get_query_var('paged') ) {
  $paged = get_query_var('paged');
} elseif ( get_query_var('page') ) {
  $paged = get_query_var('page');
} else {
  $paged = 1;
}

Ce qui a corrigé le contenu en double sur les pages paginées, mais les liens de pagination basés sur les numéros restent toujours en première page Il affiche toujours le premier lien (1) comme actuel, ce qui rend difficile la navigation dans le reste des pages.

Bien que ce code fonctionne bien si je l’utilise sur une autre page que static front page.

Toute solution à ce problème.

EDIT: mettre à jour

J'ai essayé de désactiver tous les plugins et de supprimer toutes les fonctions développées sur mesure de functions.php mais le problème persiste. Donc, je suppose que cela doit faire quelque chose avec la façon dont j'utilise la fonction WP_Query ou paginate_links.

Il devrait y avoir une erreur dans ce code.

1
Robert hue

Les pages statiques ne fonctionnent pas avec la variable de requête paged, elles ont besoin de la variable page.

C'est la raison pour laquelle votre deuxième bloc de code rend la requête opérationnelle: il utilise la variable page var lorsqu'elle est disponible.

Cependant, votre code de liens paginés utilise toujours paged:

...
'format' => '?paged=%#%',
...

Donc, vous envoyez paged requête var mais recherche page var.

La solution consiste à faire en sorte que votre argument format envoie la requête page var si elle est utilisée à partir d'une page statique.

if ( $latest_query->max_num_pages > 1 ) :

    $var = is_page() ? 'page' : 'paged'; // <-- choose var here   

    $big = 999999999;
    echo '<div class="pagination">';
    echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),

        'format' => '?' . $var . '=%#%', // <-- use var here  

        'current' => max( 1, get_query_var($var) ), // <-- use var here 
        'total' => $latest_query->max_num_pages
    ) );
    echo '</div>';
endif;

Non testé .

3
gmazzap