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.