Mają różną liczbę postów na pierwszej stronie

12

Muszę mieć inną liczbę postów na stronie na pierwszej stronie niż na innych stronach.

Na przykład tego potrzebuję

  • Wszystkich postów: 6
  • Pierwsza strona: pokazano 3 posty
  • Następująca strona: pokazano 2 posty na stronie

Oto mój kod:

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

Na pierwszej stronie w archiwum kod zakłada:

Cóż, łącznie 6 postów i 3 posty na stronie. Potrzebuję więc 2 stron archiwum, a stronicowanie, które wam przedstawiam, to:

[1] [2]

Jednak każda inna strona w archiwum kodu zakłada:

Łącznie 6 postów i 2 posty na stronie. Potrzebuję więc 3 stron archiwum, a stronicowanie, które wam przedstawiam, to:

[1] [2] [3]

Potrzebujesz pomocy, aby to naprawić.

norixxx
źródło
Gdybym tylko mógł powiedzieć WP_pagenavi, ile postów na 1. stronie, a reszta ...
norixxx,
Dlaczego dokładnie musisz to zrobić w ten sposób. Jakikolwiek szczególny powód
Pieter Goosen
Samolubstwo mojego klienta. Właściwie to nie obchodzi mnie, czy użyję wp_pagenavi, czy nie. Jakieś inne techniki, których mogę użyć?
norixxx
2
Po pierwsze 'caller_ get_ posts'zawiera spacje i jest niepoprawny. Po drugie, jest przestarzałe. Użyj ignore_sticky_postszamiast tego.
kaiser
Twoja strona główna, czy jest to zwykła strona główna, czy też ustawiona jako strona główna
Pieter Goosen,

Odpowiedzi:

22

EDYCJA - ODPOWIEDŹ ZMIENIONA

Pracuję nad innym rozwiązaniem, które w rzeczywistości jest lepszą oryginalną odpowiedzią. Nie wiąże się to z żadnym niestandardowym zapytaniem i myślę, że do wszystkich celów moja oryginalna odpowiedź może zostać usunięta, ale zachowana w celach informacyjnych

Nadal uważam, że jesteś na stronie głównej i tak też to potraktuje. To jest moje nowe rozwiązanie

KROK 1

Usuń niestandardowe zapytanie ze strony głównej i zastąp je domyślną pętlą

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

KROK 2

Służy pre_get_postsdo zmiany głównego zapytania, aby dodać niestandardową taksonomię do głównego zapytania wyświetlanego na stronie głównej.

KROK 3

Teraz pobierz posts_per_pagezestaw opcji z zaplecza (który, jak zakładam, wynosi 2), a także ustaw swój, offsetktórego będziemy używać. Tak będzie, 1ponieważ będziesz potrzebował 3 postów na pierwszej stronie i 2 na pozostałych

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

KROK 4

Na pierwszej stronie musisz dodać, offsetaby posts_per_pagedodać maksymalnie 3, aby uzyskać trzy posty na pierwszej stronie.

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

KROK 5

Musisz zastosować swoje offsetna wszystkich kolejnych stronach, w przeciwnym razie otrzymasz powtórzenie ostatniego postu strony na następnej stronie

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

KROK 6

Na koniec musisz odjąć swoje przesunięcie od, w found_postsprzeciwnym razie twoje paginacja na ostatniej stronie będzie błędna i da ci 404błąd, ponieważ ostatni post zostanie pominięty z powodu nieprawidłowej liczby postów

UWAGA: ten fragment kodu złamał podział na strony na stronie wyszukiwania. Jest to teraz naprawione, zobacz zaktualizowany kod

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

WSZYSCY RAZEM

Tak będzie wyglądać twoje pełne zapytanie, które powinno przejść do 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
źródło
4

Wiem, że pochodzi to z 1000 lat temu, ale inne rozwiązanie dla każdego, kto szuka tego rozwiązania podczas korzystania z niestandardowego zapytania, oto jak to zrobić. W tym przykładzie pierwsza strona potrzebowała 10 postów, a każda następna strona potrzebuje 9.

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

a następnie w tablicy użyj tego:

'posts_per_page' => $limit,

Teraz możesz już iść.

Kiel Fleming
źródło
2
To nie zadziała. Dzięki temu post nr 10 będzie wyświetlany dwukrotnie. Ponieważ wchodząc na drugą stronę, „pomyśli”, że na pierwszej stronie wyświetlono również 9 postów i dlatego zacznie się wyświetlać post nr 10, chociaż już był wyświetlany na pierwszej stronie.
leymannx,