29 10 10 Kontekstowa zmiany liczby wyświetlanych wpisów w Wordpresie
W Wordpresie istnieje opcja gdzie można ustawić ile wpisów ma zostać wyświetlonych na pojedyńczej stronie bloga (niezależnie od lokacji). Co jedenak, gdy chcemy wyświetlić różną liczbę wpisów na stronie indeksu, archiwów, tagów i kategorii ? Nieniejszy wpis ma na celu przedstawić jak zróżnicować liczbę wyświetlanych wpisów w zależności od tego w której części bloga jesteśmy.
W zakładce Ustawienia -> Czytanie panelu administracyjnego bloga mamy możliwość ustawienia ile wpisów będzie jednorazowo wyświetlanych na stronie. Wartość ta odnosi się do indeksu bloga, jego archiwum, kategorii i tagów. W bazie danych Wordpresa liczba wyświetlanych postów jest zapisana w tabeli wp_options i nosi nazwę posts_per_page.
Co więc zrobić jeżeli na stronie archiwów chcemy mieć wszystkie wpisy dla danego miesiąca oraz po 50 na każdej stronie dla archiwum roku a na głównej stronie wyświetlać po 10 wpisów ? W sieci można znaleźć rozwiązanie tego problemu. Wiele osób proponuje zdefiniowanie nowego zapytania z pomocą klasy WP_Query lub funkcji query_posts ( rezultat jest ten sam ). W tym miejscu chciałbym jasno powiedzieć, że nie jest to dobre rozwiązanie.
Powższa metoda służy do ściągania innych danych niż te domyślne dla danej lokacji. Jeżeli wykorzystujemy ją aby zmienić rezultat domyślnego zapytania do bazy danych dla strony, wówczas tylko dodatkowo spowalniamy działanie naszej witryny.
Zamist więc podwójnie obciążać serwer bazy danych, lepiej jest zmodyfikować pierwotne ( wynikające z lokalizacji ) zapytanie tuż przed jego wykonaniem.
Aby tego dokonać posłużę się akcją o nazwie pre_get_posts (pisałem już o niej w kontekście tego wpisu).
Załóżmy więc, że chcemy aby na stronie głównej było wyświetlane tyle wpisów ile ustawiliśmy sobie w panelu administracyjnym ( Ustawienia -> Czytanie ). Na stronach archiwów dla miesięcy chcemy wyświetlić wszystkie wpisy dla danego miesiąca jednocześnie, natomiast dla wszystkich pozostałych lokacji (archiwa lat, tagi, kategorie ), chcemy mieć po 30 wpisów na stronie. Kod, który pomoże nam to osiągnąć może wyglądać jak następuje:
add_action('pre_get_posts','custom_post_counts_by_location');
function custom_post_counts_by_location(){
global $wp_query;
if(is_month()){
$wp_query -> set('posts_per_page',-1);
}elseif(is_home()){
$wp_query -> set('posts_per_page',get_bloginfo('posts_per_page'));
}else{
$wp_query -> set('posts_per_page',30);
}
}
Powyższy kod należy umieścić w pliku functions.php.
Wszystkie funkcje i metody podłączone pod akcje pre_get_posts są uruchamiane tuż przed stworzeniem domyślnego zapytania do bazy danych. Funkcja custom_post_counts_by_location wykorzystuje możliwość ustawienia własności obiektu $wp_query o nazwie posts_per_page (znajoma nazwa) i robi to w nieco odmienny sposób w zależności od tego na której stronie bloga zostanie wywołana.
Innymi słowy, zamiast wysyłać dwa zapytania tylko po to by zmienić liczbę wyświetlanych wpisów, zmieniamy nieco to pierwsze oszczędzając na czasie ładowania strony, zużyciu procesora serwera i pewnie jeszcze paru innych rzeczach.
Kod powyżej można sobie dowolnie zmodyfikować dodają na przykład przypadek dla strony tagów czy wybranej kategorii:
add_action('pre_get_posts','custom_post_counts_by_location');
function custom_post_counts_by_location(){
global $wp_query;
if(is_category('my-sample-category')){
$wp_query -> set('posts_per_page',20);
}elseif(is_tag()){
$wp_query -> set('posts_per_page',-1);
}else{
$wp_query -> set('posts_per_page',30);
}
}
Tytułem uzupełnienia dodam, że ustawienie własności posts_per_page do wartości -1 spowoduje ściągnięcie wszystkich wpisów z bazy danych ( oczywiście dla danej lokacji ).
Warto także nadminić, że w czasie wykonywania kodu dla akcji pre_get_posts wszystkie wartości, na których polegają warunkowe funkcje motywów (is_category, is_tag etc.) są już ustawione i można ich śmiało używać.
Akcja pre_get_posts jest bardzo użyteczna, warto o niej pamiętać. Jakiś czas temu pisałem o niej w kontekście innego zastosowania, zaprasza do zapoznania się z tym tekstem.
Autor wpisu jest blogerem, programistą PHP, administratorem Linux oraz twórcą blogów
RSS Subskrybuj wpisy bloga