Tym razem pytanie od znajomego otrzymane bezpośrednio. Mam jednak wrażenie, że z tym problemem spotkać można się dość często, a dotyczy ono modyfikowania liczby wpisów wyświetlanych na stronie w zależności od tego, na jakiej stronie aktualnie jesteśmy. Ale po kolei – zacznijmy od pytania:

Na stronie głównej 4 wpisy wyświetlam w sliderze, a potem resztę normalnie. Co zrobić, żeby paginacja działała poprawnie?

Podejrzewam, że przyda się kilka dodatkowych wyjaśnień. Na czym dokładnie polegał problem? Otóż na stronie listy wpisów wyświetlane było po 9 wpisów. Na stronie głównej bloga, wyświetlać miał się slider, a w nim 4 najnowsze wpisy, a poniżej 9 następnych wpisów (razem 13). Gdy przechodziliśmy na stronę drugą, to niektóre wpisy wyświetlały się ponownie.

Jak to naprawić? Prosto – musimy wytłumaczyć WordPressowi, ile wpisów gdzie chcemy wyświetlać. A możemy to zrobić tak:

function prefiks_change_posts_number_on_home( $query ) {
    if ( is_home() && $query->is_main_query() ) {
        $posts_per_page = get_query_var('posts_per_page', get_option('posts_per_page'));  // <- domyślna liczba wpisów do wyświetlenia
        $additional_posts = 4;  // <- liczba dodatkowych wpisów na pierwszej stronie

        if ( get_query_var('paged') < 2 ) {
            $query->set( 'posts_per_page', $posts_per_page + $additional_posts );
        } else {
            $query->set( 'offset', $additional_posts + ( get_query_var( 'paged' ) - 1 ) * $posts_per_page );
        }
    }
}
add_action( 'pre_get_posts', 'prefiks_change_posts_number_on_home' );

Dodatkowe warianty i pytania

Czy mogę ten sam trik zastosować np. na stronie kategorii?

Oczywiście. Wystarczy odpowiednio zmodyfikować pierwszy warunek (ten z is_home()). Jeśli chcesz, aby pierwsza strona archiwum kategorii działała tak samo, jak strona główna, powinien on wyglądać tak:

if ( ( is_home() || is_category() ) && $query->is_main_query() ) {
        ...

Obecnie mam już na stronie wtyczkę/kod, która zmienia liczbę wpisów wyświetlanych na stronie głównej przy użyciu akcji pre_get_posts. Jak sprawić, żeby te rozwiązania ze sobą nie kolidowały?

Powyższa funkcja uwzględnia liczbę wpisów, która została ustawiona wcześniej. Wystarczy więc zapewnić, że funkcje te zostaną wykonane w odpowiedniej kolejności. Tutaj z pomocą przychodzi priorytet akcji. Określamy go podczas podpinania naszej funkcji pod dany hook:

add_action( 'pre_get_posts', 'prefiks_change_posts_number_on_home', PRIORYTET );

Domyślnie nasze funkcje podpinane są z priorytetem 10. Im większa ta liczba, tym później zostanie wykonana nasza akcja.

Change consents