Afișează un număr diferit de articole pe prima pagină
Am nevoie să afișez un număr diferit de articole pe pagină pentru prima pagină față de celelalte pagini.
De exemplu, iată ce vreau să obțin:
- Total articole: 6
- Prima pagină: afișează 3 articole
- Pagina următoare: afișează 2 articole pe pagină
Iată codul meu:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$fp_limit = 3; // limită pentru prima pagină
$limit = 2; // limită pentru paginile următoare
$offset = 0; // offset implicit
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, // elimină postările 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);
// buclă de bază
if( $my_query->have_posts() ) :
while ($my_query->have_posts()) : $my_query->the_post();
...
endwhile; endif; // buclă de arhivă
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }
wp_reset_query();
Pe prima pagină din arhivă, acest cod presupune:
Avem 6 articole în total și 3 articole pe pagină. Deci avem nevoie de 2 pagini de arhivă și paginarea afișată este:
[1] [2]
Însă pe oricare altă pagină din arhivă, codul presupune:
Avem 6 articole în total și 2 articole pe pagină. Deci avem nevoie de 3 pagini de arhivă și paginarea afișată este:
[1] [2] [3]
Am nevoie de puțin ajutor pentru a rezolva această problemă.

EDITARE - RĂSPUNS REVIZUIT
Am lucrat la o altă soluție care este de fapt mai bună decât răspunsul original. Aceasta nu implică nicio interogare personalizată și cred că pentru toate scopurile, răspunsul meu original poate fi abandonat, dar păstrat în scop informativ.
Încă cred că ești pe pagina de start și o voi trata ca atare. Deci, aceasta este noua mea soluție.
PASUL 1
Elimină interogarea personalizată de pe pagina de start și înlocuiește-o cu bucla implicită.
<?php
if ( have_posts() ) :
// Începe bucla.
while ( have_posts() ) : the_post();
///<---BUCLA TA--->
endwhile;
//<---PAGINAREA TA--->
else :
//NU S-AU GĂSIT POSTĂRI SAU ALTE CEVA
endif;
?>
PASUL 2
Folosește pre_get_posts
pentru a modifica interogarea principală și a adăuga taxonomia personalizată la interogarea principală pentru afișare pe pagina de start.
PASUL 3
Acum, obține opțiunea posts_per_page
setată din panoul de administrare (pe care presupun că este 2) și setează și offset
-ul pe care îl vom folosi. Acesta va fi 1
, deoarece vei avea nevoie de 3 postări pe prima pagină și 2 pe restul.
$ppg = get_option('posts_per_page');
$offset = 1;
PASUL 4
Pe prima pagină, va trebui să adaugi offset
la posts_per_page
, ceea ce va adăuga până la 3 pentru a obține cele trei postări pe prima pagină.
$query->set('posts_per_page', $offset + $ppp);
PASUL 5
Trebuie să aplici offset
-ul pe toate paginile ulterioare, altfel vei obține o repetare a ultimei postări de pe pagină pe următoarea pagină.
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
PASUL 6
În final, trebuie să scazi offset-ul din found_posts
, altfel paginarea de pe ultima pagină va fi greșită și va genera o eroare 404
, deoarece ultima postare va lipsi din cauza numărului incorect de postări.
NOTĂ: Această bucată de cod a stricat paginarea pe pagina de căutare. Acum este reparată, vezi codul actualizat.
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 );
TOTUL LA UN LOC
Iată cum ar trebui să arate întreaga interogare care ar trebui introdusă în 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 );

Știu că această soluție este veche de 1000 de ani, dar pentru oricine altcineva care caută această soluție în timp ce folosește o interogare personalizată, iată cum se poate face. În acest exemplu, prima pagină avea nevoie de 10 articole și fiecare pagină ulterioară avea nevoie de 9.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
$limit = 10;
} else {
$limit = 9;
}
și apoi în matrice folosește asta:
'posts_per_page' => $limit,
Acum ești pregătit să mergi mai departe.

Acest lucru nu va funcționa. Cu această abordare, postarea #10 va fi afișată de două ori. Când se merge pe a doua pagină, sistemul va "crede" că prima pagină a avut deja 9 postări afișate și va începe să afișeze postarea #10 din nou, deși aceasta a fost deja afișată pe prima pagină.

Kiel a fost aproape. Aveam nevoie de 3 articole pe prima pagină și 12 pe paginile următoare, iar aici am ajuns:
<?php
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$current_cat = get_category($cat);
$limit = 12; // Setează limita de articole pe toate paginile în afară de prima
$offset = 3; // Setează acest lucru la numărul de articole de pe prima pagină
if( $paged == 1 ) {
$offset = 0; // Fără offset pe prima pagină
$limit = 3; // Numărul de articole pe prima pagină
} else {
$offset = (($paged - 2) * $limit) + $offset; // Magia se întâmplă aici
}
$args = array(
'post_type' => 'post',
'category_name' => $current_cat->slug,
'paged' => $paged,
'offset' => $offset,
'posts_per_page' => $limit,
'orderby' => 'date',
'order' => 'DESC',
);
?>
