web-dev-qa-db-fra.com

Pagination additionnelle des messages supplémentaires uniquement à la page 2

Après avoir été si près de clouer mon thème, j'ai franchi le dernier obstacle. J'ai essentiellement trois zones différentes sur ma page d'accueil:

  1. La dernière publication apparaît dans l'en-tête et est stylée comme une publication sélectionnée.
  2. Deux messages ci-dessous qui ont été stylés comme des messages récents
  3. Les autres postes (10) sont classés par ordre de date en dessous de ceux

Le dernier message (1) et les deux suivants (2) sont affichés à l'aide d'un WP_Query personnalisé et les dix autres messages (3) sont affichés à l'aide de la boucle standard avec une fonction offset qui résout également la pagination MAIS ... il y a un hoquet avec page 2. Pour une raison quelconque, ajoute-t-il trois articles supplémentaires en haut de la liste des articles (3)? Après cela, à partir de la page 3, tout va bien et fonctionne comme il se doit. Je devrais également mentionner que les messages les plus récents et les plus récents (1 et 2) doivent être affichés en haut à tout moment au fur et à mesure que vous parcourez les pages.

Voici la mise en page avec les différentes zones et numéros de poste:

Layout

Voici le code utilisé pour la fonction qui gère les posts principaux (3) et le correctif de pagination (le décalage sert à ignorer les posts les plus récents et les plus récents affichés ci-dessus):

function offset_main_query ( $query ) {
     if ( $query->is_home() && $query->is_main_query() && !$query->is_paged() ) {
         $query->set( 'offset', '3' );
    }
 }
add_action( 'pre_get_posts', 'offset_main_query' );

Toute aide serait formidable, car c’est le dernier geste qui m’a fait trébucher.

Merci :)

2
Garry Aylott

Voici une suggestion pour un moyen général de supporter un nombre différent de messages sur lepage d'accueilque sur leautres pages paginées. Nous devrions utiliser lerequête principaleau lieu desous-requêtes, si possible.

Formule

Il semble logique de prendre leoffsetpour les pages paginées comme:

offset_op = ( paged - 1 ) * pp_op + ( pp_fp - pp_op ) + offset_fp           
          = ( paged - 2 ) * pp_op + pp_fp + offset_fp 

paged (pagination), pp_fp (messages par première page), pp_op (messages par autres pages) et offset_fp (offset pour la première page) sont des entiers non négatifs.

Pour paged=1 le décalage est offset_fp, sinon c'est offset_op pour les autres pages.

Exemple # 1:

Nous calculons d’abord le décalage de quelques pages pour mieux comprendre ceci:

For paged=1:
    offset_fp = 0

For paged=2:
    offset_op = (2-2)*10 + 13 + 0
              = 13

For paged=3:
    offset_op = (3-2)*10 + 13 + 0
              = 10+13
              = 23
...

Voici une liste d'indices de publication sur chaque page:

0,1,2,3,4,5,6,7,8,9,10,11,12    (offset_fp=0,  pp_fp=13, paged=1)
13,14,15,16,17,18,19,20,21,22   (offset_op=13, pp_op=10, paged=2)
23,24,25,26, 27,28,29,30,31,32  (offset_op=23, pp_op=10, paged=3)
...

Nous pouvons voir que le décalage correspond aux indices.

Exemple # 2:

Prenons pp_fp = 3, pp_op = 5, offset_fp=4 et calculons leoffset_op:

For paged=1:
    offset_fp = 4

For paged=2:
    offset_op = (2-2)*5 + 3 + 4
              = 7

For paged=3:
    offset_op = (3-2)*5 + 3 + 4
              = 5+3+4
              = 12
...

et le comparer aux indices:

4,5,6          (offset_fp=4,  pp_fp=3,  paged=1)
7,8,9,10,11    (offset_op=7,  pp_op=5,  paged=2)
12,13,14,15,16 (offset_op=12, pp_op=5,  paged=3)
...

Démo Plugin

Voici une implémentation de démonstration:

/**
 * Plugin Name: WPSE demo
 */
add_action( 'pre_get_posts', function( \WP_Query $query ) 
{
    // Nothing to do if backend or not home page or not the main query
    if ( is_admin() || ! $query->is_home() || ! $query->is_main_query() )
        return;

    // Get current pagination
    $paged = get_query_var( 'paged', 1 );

    // Modify sticky posts display
    $query->set( 'ignore_sticky_posts', true );

    // Modify post status
    $query->set( 'post_status', 'publish' );

    // Edit to your needs
    $pp_fp      = 13; // posts per first page
    $pp_op      = 10; // posts per other pages
    $offset_fp  = 0;  // offset for the first page

    // Offset for other pages than the first page
    $offset_op = ( $paged - 2 ) * $pp_op + $pp_fp + $offset_fp;

    // Modify offset
    $query->set( 'offset', $query->is_paged() ? $offset_op : $offset_fp );

    // Modify posts per page
    $query->set( 'posts_per_page', $query->is_paged() ? $pp_op : $pp_fp );  
} );

J'espère que vous pourrez l'adapter à vos besoins!

2
birgire

J'essaierais probablement sans la && !$query->is_paged() (vous avez déjà 2 conditions qui devraient suffire, même la première devrait fonctionner en réalité) et si cela ne fonctionne pas, essayez de sortir la valeur $paged et de voir comment vous pouvez affiner la fonction .

Quelques idées de débogage:

// get current page we are on. If not set we can assume we are on page 1.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// are we on page one?
if(1 == $paged) {
    //true
}
0
The J