web-dev-qa-db-fra.com

Les messages personnalisés par page ne fonctionnent pas avec la pagination

J'ai une page dans mon modèle où je voudrais définir une posts_per_page personnalisée. Voici le code que j'ai utilisé:

<?php
global $query_string;
query_posts($query_string . '&posts_per_page=4'); 
if ( have_posts() ) : while ( have_posts() ) : the_post();
...

Maintenant, ce code ne limite que 4 éléments par page et affiche pageinate_links ci-dessous comme je l'ai écrit. Cependant, cliquer sur une autre page mènera à un 404.

Si je supprime les lignes global et query_posts, alors cela fonctionne bien.

Voici la fonction paginate_links que j'utilise:

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages,
    'prev_text' => 'Previous',
    'next_text' => 'Next',  
) );
1
Imran

Utilisez une action pre_get_posts dans votre functions.php avec balises conditionnelles et supprimez le appel à query_posts:

function wpa62751_pre_get_posts( $query ) {
    if ( is_category( 'my-category' ) && is_main_query() )
        $query->set( 'posts_per_page', 4 );
}
add_action( 'pre_get_posts', 'wpa62751_pre_get_posts' );
2
Milo

Remarque - La méthode recommandée est indiquée par @Milo. L'utilisation de pre_get_post est toujours un bon choix par rapport à query_posts.

Cependant, vous pouvez le faire fonctionner avec la pagination en passant le paramètre paged.

Exemple -

global $wp_query;
$args = array_merge( 
                $wp_query->query, // old query
                array( 
                    'posts_per_page' => 4,
                    'paged' => get_query_var('paged')
                    //  'paged' => get_query_var('page')
                ) 
        );  
query_posts( $args );
1
amit