Afișează un număr diferit de articole pe prima pagină

25 iul. 2014, 12:40:37
Vizualizări: 15.2K
Voturi: 16

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ă.

7
Comentarii

Dacă aș putea să-i spun WP_pagenavi câte articole să afișeze pe prima pagină și câte pe restul...

norixxx norixxx
25 iul. 2014 12:59:43

De ce anume ai nevoie să faci asta în acest fel? Există vreun motiv anume?

Pieter Goosen Pieter Goosen
25 iul. 2014 13:06:32

Doar egoismul clientului meu. De fapt, nu-mi pasă dacă folosesc wp_pagenavi sau nu. Există vreo altă tehnică pe care aș putea-o folosi?

norixxx norixxx
25 iul. 2014 13:12:53

În primul rând, 'caller_ get_ posts' conține spații și nu este valid. În al doilea rând, este învechit. Folosește ignore_sticky_posts în loc.

kaiser kaiser
25 iul. 2014 15:22:21

Pagina ta principală, este o pagină principală normală sau este setată ca pagină de start

Pieter Goosen Pieter Goosen
25 iul. 2014 15:48:46

Nu știam că caller_get_posts este învechit...

norixxx norixxx
26 iul. 2014 02:50:10

Ar trebui să activezi modul de depanare (debug) când lucrezi la dezvoltare. Depanarea ar fi afișat această eroare.

Pieter Goosen Pieter Goosen
26 iul. 2014 07:45:14
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 3
1
25

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 );
25 iul. 2014 17:11:06
Comentarii

O altă metodă este să eviți utilizarea offset și să folosești 'post__not_in' pentru a exclude primul articol din interogări pe paginile !== 0.

Luca Reghellin Luca Reghellin
4 dec. 2020 19:10:32
1

Ș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.

21 feb. 2018 12:57:39
Comentarii

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ă.

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

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',
);
?>
12 apr. 2022 21:38:00