web-dev-qa-db-fra.com

Pourquoi la pagination est-elle toujours interrompue lorsqu’elle est utilisée sur une page d’accueil?

Pourquoi la pagination WP s'interrompt-elle lorsqu'elle est utilisée sur la page d'accueil?

Si vous prenez le code ci-dessous et que vous l’utilisez dans un modèle de page, cela fonctionne parfaitement (assurez-vous d’avoir au moins 3 messages). Cependant, dès que vous utilisez le même code sur home.php, front-page.php, index.php ou même en tant que modèle de page, mais défini comme une page d'accueil statique, il se rompt.

L'URL indique /page/2/ mais vous obtenez une page 404. Si vous modifiez l'URL en /?page=2, cela fonctionne.

J'ai vu tellement de questions liées à cela partout, mais aucune solution ne fonctionne.

Par souci de simplicité, j’ai simplifié la boucle ci-dessous et j’utilise les liens WP par défaut et les posts précédents. Je ne souhaite pas utiliser un plugin tel que WP-PageNavi ou similaire.

<?php get_header(); ?>

    <?php

        // taken from https://codex.wordpress.org/Pagination
        if ( get_query_var('paged') ) { 
            $paged = get_query_var('paged'); 
        } 
        else if ( get_query_var('page') ) {
            $paged = get_query_var('page'); 
        } 
        else {
            $paged = 1;
        }

        $wp_query = new WP_Query( array( 
            'posts_per_page' => 2,
            'paged' => $paged
        ));

    ?>

    <?php if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

         <?php the_title(); ?>

    <?php endwhile; endif; ?>

    <?php previous_posts_link(); ?>
    <?php next_posts_link(); ?>

    <?php wp_reset_query(); ?>

<?php get_footer(); ?>
3
Andrew

La solution consiste à ne pas modifier la requête principale dans le modèle. La requête par défaut se produit avant que le modèle ne soit chargé. Par conséquent, l'interrogation dans le modèle remplace la requête d'origine, ce qui représente un gaspillage de ressources. Voir l'exemple dans codex sous pre_get_posts pour savoir comment modifier correctement la requête par défaut sans problème de pagination.

7
Milo

Également de codex.wordpress.com/Pagination (Sous "Étapes de dépannage avancées"> "Suppression de query_posts de la boucle principale") en ce qui concerne la modification la requête principale via l'action pre_get_posts mentionnée par Milo:

[...] ajoutez la requête pour votre page d'accueil et votre page de catégorie dans le fichier functions.php de votre thème:

function my_post_queries( $query ) {
     // do not alter the query on wp-admin pages and only alter it if it's the main query
    if (!is_admin() && $query->is_main_query()){
        // alter the query for the home and category pages 

        if(is_home()){
           $query->set('posts_per_page', 3);
        }

        if(is_category()){
            $query->set('posts_per_page', 3);
        }
    }
}
add_action( 'pre_get_posts', 'my_post_queries' );

Donc, votre mise en œuvre pourrait ressembler à quelque chose comme

function modify_query( $query ) {
    if( !$query->is_main_query() )
        return;  //Only wish to modify the main query

    //Modify the query vars for the home and front pages
    if( is_home() || is_front_page() ) {
        $paged = get_query_var('page');

        //If the 'page' query var isn't set, or didn't return an integer, default to 1
        $paged = !isset( $paged ) || !is_int( $paged ) ? $paged : 1;

        $query->set( 'paged', $paged );
        $query->set( 'posts_per_page', 2 );
    }
}
add_action( 'pre_get_posts', 'modify_query' );        
2
bosco