Je dois avoir un nombre différent de messages par page sur la première page que sur les autres pages.
Par exemple, voici ce dont j'ai besoin
Voici mon code:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset
if( $paged == 1 ) {
$limit = $fp_limit;
} else {
$offset = $fp_limit + ( ($paged - 2) * $limit );
}
$args = array(
'post_type' => 'my_post_type',
'post_status' => 'publish',
'offset' => $offset,
'posts_per_page' => $limit,
'caller_ get_ posts' => -1, // remove sticky post
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
)
);
$my_query = null;
$my_query = new WP_Query($args);
// basic loop
if( $my_query->have_posts() ) :
while ($my_query->have_posts()) : $my_query->the_post();
...
endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }
wp_reset_query();
En première page d'archive, ce code suppose:
Eh bien, 6 messages au total et 3 messages par page. Il me faut donc 2 pages d'archives et la pagination que je vous présente est la suivante:
[1] [2]
Cependant, toute autre page dans les archives du code suppose:
Eh bien, 6 messages au total et 2 messages par page. Il me faut donc 3 pages d'archives et la pagination que je vous présente est la suivante:
[1] [2] [3]
Besoin d'un peu d'aide pour résoudre ce problème.
EDIT - RÉPONSE REVISITÉ
Je travaille sur une autre solution qui est en fait meilleure que la réponse originale. Cela n'implique aucune requête personnalisée et je pense qu'à toutes fins utiles, ma réponse d'origine peut être supprimée mais conservée à des fins d'information.
Je crois toujours que vous êtes sur la page d'accueil et traitera également cela comme tel. C'est donc ma nouvelle solution
ÉTAPE 1
Supprimer la requête personnalisée de la page d'accueil et la remplacer par la boucle par défaut
<?php
if ( have_posts() ) :
// Start the Loop.
while ( have_posts() ) : the_post();
///<---YOUR LOOP--->
endwhile;
//<---YOUR PAGINATION--->
else :
//NO POSTS FOUND OR SOMETHING
endif;
?>
ÉTAPE 2
Utilisez pre_get_posts
pour modifier la requête principale afin d'ajouter votre taxonomie personnalisée à la requête principale à afficher sur la page d'accueil.
ÉTAPE 3
Maintenant, obtenez le jeu d’options posts_per_page
à partir de l’arrière (ce qui, je suppose, est 2) et définissez également votre offset
que nous allons utiliser. Ce sera 1
car vous aurez besoin de 3 posts sur la première page et de 2 sur le reste
$ppg = get_option('posts_per_page');
$offset = 1;
ÉTAPE 4
Sur la première page, vous devrez ajouter la variable offset
à posts_per_page
et ajouter jusqu'à 3 pour afficher vos trois publications sur la première page.
$query->set('posts_per_page', $offset + $ppp);
ÉTAPE 5
Vous devez appliquer votre offset
à toutes les pages suivantes, sinon vous obtiendrez une répétition du dernier message de la page de la page suivante.
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
ETAPE 6
Enfin, vous devez soustraire votre décalage de found_posts
sinon votre pagination sur la dernière page sera erronée et vous donnera une erreur 404
car le dernier message sera manquant à cause du compte incorrect.
NOTE: Ce morceau de code a cassé la pagination sur la page de recherche. Ceci est maintenant corrigé, voir le code mis à jour
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
TOUS ENSEMBLE
Voici à quoi ressemblera votre requête complète qui devrait aller dans functions.php
function tax_and_offset_homepage( $query ) {
if ($query->is_home() && $query->is_main_query() && !is_admin()) {
$query->set( 'post_type', 'my_post_type' );
$query->set( 'post_status', 'publish' );
$query->set( 'ignore_sticky_posts', '-1' );
$tax_query = array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
);
$query->set( 'tax_query', $tax_query );
$ppp = get_option('posts_per_page');
$offset = 1;
if (!$query->is_paged()) {
$query->set('posts_per_page',$offset + $ppp);
} else {
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
}
}
}
add_action('pre_get_posts','tax_and_offset_homepage');
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
Je sais que cela remonte à 1000 ans, mais il existe une autre solution pour ceux qui recherchent cette solution tout en utilisant une requête personnalisée: voici comment procéder. Dans cet exemple, la 1ère page avait besoin de 10 posts et chaque page suivante en avait 9.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
$limit = 10;
} else {
$limit = 9;
}
puis dans le tableau, utilisez ceci:
'posts_per_page' => $limit,
Maintenant vous êtes prêt à partir.