La page d'accueil de mon site est configurée pour afficher les 9 derniers messages (via le paramètre situé dans la zone d'administration), puis au bas de la page, j'ai les liens de pagination standard qui permettent aux visiteurs de voir davantage de messages.
Je voudrais avoir la page d'accueil (et seulement la page d'accueil) montrer 7 derniers messages, mais ensuite sur les pages suivantes - 2, 3, 4 etc ont 9 messages montrant. Je veux aussi que les catégories et les archives affichent aussi 9 articles.
Toutes les méthodes que j’ai essayées jusqu’à présent aboutissent soit à des messages manquants et dupliqués, soit à une page supplémentaire dans la pagination, ce qui donne un 404.
Jusqu'à présent, j'ai essayé différentes variantes de la réponse publiée ici:
La pagination retourne 404 après la page 20
Et aussi ici (cas n ° 2: décalage conditionnel):
Paramètre 'posts_per_page' différent pour le premier et reste des pages paginées?
Ni l'un ni l'autre ne semble fonctionner pour ce que je veux réaliser, mais je sens que je suis sur le point de trouver une solution et que je risque de manquer quelque chose d'évident.
Voici la version la plus récente du code que j'ai essayé (ajoutée à functions.php), ce qui a généré trop de liens de pagination (le dernier lien a provoqué un 404):
function home_paged_offset( $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
if( !is_paged() ) {
$query->set( 'posts_per_page', $first_page_ppp );
} else {
$paged_offset = $first_page_ppp + ( ($paged - 2) * $ppp );
$query->set( 'offset', $paged_offset );
}
}
}
add_action( 'pre_get_posts', 'home_paged_offset' );
function home_adjust_paged_offset_pagination( $found_posts, $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
if( !is_paged() ) {
return( $found_posts );
} else {
return( $found_posts - ($first_page_ppp - $ppp) );
}
}
return $found_posts;
}
add_filter( 'found_posts', 'home_adjust_paged_offset_pagination', 10, 2 );
Ok c'était vraiment difficile. Jusqu'à présent, j'ai réussi à contourner le problème en mentant au $wp_query
global de WordPress. Voici comment.
Dans le functions.php
de votre thème, vous pouvez ajouter ces fonctions pour afficher 7 messages sur la première page et 9 messages sur une autre page.
Ok, ce code fonctionne jusqu'à présent, mais vous remarquerez que la pagination est incorrecte sur la première page. Pourquoi? En effet, WordPress utilise les publications par page de la première page (soit 7) et obtient le nombre de pages en divisant comme (1000/7) = nombre total de publications. Mais nous devons faire en sorte que la pagination prenne en compte le fait que 9 pages par page seront affichées, et non pas 7. Avec les filtres, vous ne pouvez pas le faire, mais si vous ajoutez ce hack à votre modèle juste avant the_posts_pagination()
Vous travaillerez comme vous le souhaitez.
L'astuce consiste à remplacer la variable globale max_num_pages
de $ wp_query par notre valeur personnalisée et à ignorer le calcul de WP pendant l'affichage des liens de pagination uniquement pour la première page.
global $wp_query;
// Needed for first page only
if ( ! $wp_query->is_paged ) {
$all_posts_except_fp = ( $wp_query->found_posts - 7 ); // Get us the found posts except those on first page
$wp_query->max_num_pages = ceil( $all_posts_except_fp / 9 ) + 1; // + 1 the first page we have containing 7 posts
}
Et ceci est le code à mettre dans functions.php pour filtrer la requête.
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {
if ( ! $query->is_home() ) {
return;
}
$fp = 7;
$ppp = 9;
if ( $query->is_paged ) {
$offset = $fp + ( ($query->query_vars['paged'] - 2) * $ppp );
$query->set('offset', $offset );
$query->set('posts_per_page', $ppp );
} else {
$query->set('posts_per_page', $fp );
}
}
add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {
$fp = 7;
$ppp = 9;
if ( $query->is_home() ) {
if ( $query->is_paged ) {
return ( $found_posts + ( $ppp - $fp ) );
}
}
return $found_posts;
}
pagination de fonctions ($ query_string) {global $ posts_per_page, $ paged; $ my_query = new WP_Query ($ query_string. "& posts_per_page = -1"); $ total_posts = $ my_query-> post_count; if (vide ($ paginé)) $ paginé = 1; $ prev = $ paginé - 1; $ next = $ paginé + 1; $ range = 5; $ showitems = ($ range * 2) +1; $ pages = ceil ($ total_posts/$ posts_per_page); if (1! = $ pages) {echo ''; echo ($ paged> 1 && $ showitems <$ pages)? '' ': ""; for ($ i = 1; $ i <= $ pages; $ i ++) {si (1! = $ pages && (! ($ i> = $ paginé + $ intervalle-0 || $ i <= $ paginé- $ intervalle -1) || $ pages <= $ showitems)) {echo ($ paginé == $ i)? ''. $ i. '': ''. $ i. '';}} echo ($ paginé <$ pages && $ showitems <$ pages)? '"':" "; Echo"\n ";}}