Mostrare un numero diverso di post nella prima pagina

25 lug 2014, 12:40:37
Visualizzazioni: 15.2K
Voti: 16

Ho bisogno di mostrare un numero diverso di post per pagina nella prima pagina rispetto alle altre pagine.

Ad esempio, ecco ciò che mi serve:

  • Totale post: 6
  • Prima pagina: mostra 3 post
  • Pagine successive: mostra 2 post per pagina

Ecco il mio codice:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // limite prima pagina
$limit = 2; // limite pagine successive
$offset = 0; // offset predefinito

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, // rimuovi post sticky
    '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);

// loop base
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // loop archivio
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

Nella prima pagina dell'archivio, questo codice presuppone:

Bene, 6 post totali e 3 post per pagina. Quindi ho bisogno di 2 pagine di archivio e la paginazione che ti mostro è:

[1] [2]

Tuttavia, in qualsiasi altra pagina dell'archivio il codice presuppone:

Bene, 6 post totali e 2 post per pagina. Quindi ho bisogno di 3 pagine di archivio e la paginazione che ti mostro è:

[1] [2] [3]

Ho bisogno di un piccolo aiuto per risolvere questo problema.

7
Commenti

Se solo potessi dire a WP_pagenavi quanti post mostrare nella prima pagina e quanti nel resto...

norixxx norixxx
25 lug 2014 12:59:43

Perché esattamente hai bisogno di farlo in questo modo? C'è qualche motivo particolare?

Pieter Goosen Pieter Goosen
25 lug 2014 13:06:32

Solo il capriccio del mio cliente. In realtà a me non interessa se uso wp_pagenavi o meno. C'è qualche altra tecnica che posso usare?

norixxx norixxx
25 lug 2014 13:12:53

Innanzitutto 'caller_ get_ posts' contiene spazi e non è valido. In secondo luogo, è deprecato. Usa invece ignore_sticky_posts.

kaiser kaiser
25 lug 2014 15:22:21

La tua home page, è una normale homepage o è impostata come front page?

Pieter Goosen Pieter Goosen
25 lug 2014 15:48:46

Non sapevo che caller_get_posts fosse deprecato...

norixxx norixxx
26 lug 2014 02:50:10

Dovresti impostare debug a true durante lo sviluppo. Debug ti avrebbe mostrato questo

Pieter Goosen Pieter Goosen
26 lug 2014 07:45:14
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 3
1
25

MODIFICA - RISPOSTA RIVISTA

Ho lavorato su un'altra soluzione che in realtà è migliore della risposta originale. Questo non coinvolge alcuna query personalizzata e penso che per tutti gli scopi la mia risposta originale possa essere scartata ma mantenuta a scopo informativo

Credo ancora che tu sia nella homepage e la tratterò come tale. Quindi questa è la mia nuova soluzione

PASSO 1

Rimuovi la query personalizzata dalla homepage e sostituiscila con il loop predefinito

<?php

        if ( have_posts() ) :
            // Inizia il Loop.
            while ( have_posts() ) : the_post();

                ///<---IL TUO LOOP--->

            endwhile;

                //<---LA TUA PAGINAZIONE--->   

            else : 

                //NESSUN POST TROVATO O QUALCOSA   

            endif; 

    ?>

PASSO 2

Usa pre_get_posts per modificare la query principale per aggiungere la tua tassonomia personalizzata alla query principale da visualizzare nella homepage.

PASSO 3

Ora, ottieni l'opzione posts_per_page impostata dal backend (che presumo sia 2) e imposta anche il tuo offset che useremo. Sarà 1 poiché avrai bisogno di 3 post nella prima pagina e 2 nelle altre

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

PASSO 4

Nella prima pagina, dovrai aggiungere l'offset a posts_per_page che sommerà fino a 3 per ottenere i tuoi tre post nella prima pagina.

$query->set('posts_per_page', $offset + $ppp);

PASSO 5

Devi applicare il tuo offset a tutte le pagine successive, altrimenti otterrai una ripetizione dell'ultimo post della pagina nella pagina successiva

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

PASSO 6

Infine, devi sottrarre il tuo offset da found_posts altrimenti la tua paginazione nell'ultima pagina sarà sbagliata e ti darà un errore 404 poiché l'ultimo post mancherà a causa del conteggio errato dei post

NOTA: Questo pezzo di codice ha interrotto la paginazione nella pagina di ricerca. Ora è stato risolto, vedi il codice aggiornato

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 );

TUTTO INSIEME

Ecco come sarà la tua query completa che dovrebbe andare in 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 );
25 lug 2014 17:11:06
Commenti

Un altro modo è evitare di usare l'offset e utilizzare 'post__not_in' escludendo il primo post dalle query nelle pagine !== 0.

Luca Reghellin Luca Reghellin
4 dic 2020 19:10:32
1

So che è passato un secolo, ma per chiunque stia cercando questa soluzione mentre utilizza una query personalizzata, ecco come fare. In questo esempio la prima pagina necessitava di 10 post e ogni pagina successiva di 9.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

e poi nell'array usa questo:

'posts_per_page' => $limit,

Ora sei a posto.

21 feb 2018 12:57:39
Commenti

Questo non funzionerà. In questo modo il post #10 verrà visualizzato due volte. Quando si passa alla seconda pagina, il sistema "penserà" che la prima pagina abbia già mostrato 9 post e quindi inizierà a mostrare il post #10 anche se è già stato visualizzato nella prima pagina.

norman.lol norman.lol
9 mag 2019 09:24:56
0

Kiel era molto vicino alla soluzione. Avevo bisogno di 3 articoli nella prima pagina e 12 nelle pagine successive, questo è il codice che ho ottenuto:

<?php 
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$current_cat = get_category($cat);

$limit = 12; // Imposta il limite di articoli su tutte le pagine tranne la prima
$offset = 3; // Imposta questo al numero di articoli nella prima pagina

if( $paged == 1 ) {
   $offset = 0; // Nessun offset nella prima pagina
   $limit = 3; // Numero di articoli nella prima pagina
} else {
   $offset = (($paged - 2) * $limit) + $offset; // Qui avviene la magia
}

$args = array(
    'post_type' => 'post',
    'category_name' => $current_cat->slug,
    'paged' => $paged,
    'offset' => $offset,
    'posts_per_page' => $limit,
    'orderby' => 'date',
    'order' => 'DESC',
);
?>
12 apr 2022 21:38:00