Mostrare un numero diverso di post nella prima pagina
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.

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

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.

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.

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',
);
?>
