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',
) );
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' );
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 );