web-dev-qa-db-fra.com

Avoir un nombre différent de messages sur la première page

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

  • Nombre de messages: 6
  • Première page: montrant 3 posts
  • Page suivante: affiche 2 messages par page

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.

11
norixxx

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 );
19
Pieter Goosen

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.

3
Kiel Fleming