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

11

J'ai besoin d'avoir un nombre différent de messages par page sur la première page que sur les autres pages.

Par exemple, c'est ce dont j'ai besoin

  • Nombre total de messages: 6
  • Première page: affichage de 3 messages
  • Page suivante: affichage de 2 articles 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();

À la première page des archives, ce code suppose:

Eh bien, 6 publications au total et 3 publications par page. J'ai donc besoin de 2 pages d'archives et la pagination que je vous présente est:

[1] [2]

Cependant, toute autre page d'archive que le code suppose:

Eh bien, 6 publications au total et 2 publications par page. J'ai donc besoin de 3 pages d'archives et la pagination que je vous présente est:

[1] [2] [3]

Besoin d'un peu d'aide pour résoudre ce problème.

norixxx
la source
Si seulement je pouvais dire à WP_pagenavi combien de messages sur la 1ère page et le reste ...
norixxx
Pourquoi avez-vous exactement besoin de le faire de cette façon. Toute raison particulière
Pieter Goosen
Juste l'égoïsme de mon client. En fait, je m'en fiche si j'utilise wp_pagenavi ou non. Toute autre technique que je peux utiliser?
norixxx
2
Le premier 'caller_ get_ posts'contient des espaces et n'est pas valide. Deuxièmement, il est obsolète. Utilisez ignore_sticky_postsplutôt.
kaiser
Votre page d'accueil, est-ce une page d'accueil normale ou définie comme une page d'accueil
Pieter Goosen

Réponses:

21

MODIFICATION - RÉPONSE REVISITÉE

J'ai travaillé sur une autre solution qui est en fait mieux 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 pense toujours que vous êtes sur la page d'accueil et que vous le traiterez également comme tel. Voici donc ma nouvelle solution

ÉTAPE 1

Supprimez la requête personnalisée de la page d'accueil et remplacez-la 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_postspour modifier la requête principale pour ajouter votre taxonomie personnalisée à la requête principale à afficher sur la page d'accueil.

ÉTAPE 3

Maintenant, obtenez l' posts_per_pageoption définie à partir du back-end (qui je suppose est 2) et définissez également la offsetque nous allons utiliser. Ce sera 1comme vous aurez besoin de 3 messages sur la première page et 2 sur le reste

$ppg = get_option('posts_per_page');
$offset = 1;

ÉTAPE 4

Sur la première page, vous devrez ajouter le offsetà posts_per_pageajoutera jusqu'à 3 pour obtenir vos trois messages 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 sur la page suivante

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

ÉTAPE 6

Enfin, vous devez soustraire votre décalage found_postssinon votre pagination sur la dernière page sera erronée et vous donnera une 404erreur car le dernier message sera manquant en raison du nombre de messages incorrect

REMARQUE: ce morceau de code a rompu 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 );
Pieter Goosen
la source
3

Je sais que cela date d'il y a 1000 ans, mais une autre solution pour quiconque cherche cette solution tout en utilisant une requête personnalisée, voici comment le faire. Dans cet exemple, la 1ère page avait besoin de 10 publications et chaque page suivante en avait besoin de 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,

Vous êtes maintenant prêt à partir.

Kiel Fleming
la source
2
Ça ne marchera pas. Avec cela, le post # 10 sera affiché deux fois. Depuis lors de la deuxième page, il "pensera" que la première page avait également 9 messages affichés et commencera donc à afficher le message # 10 bien qu'il ait déjà été affiché sur la première page.
leymannx