WordPress
Naprzemienna pętla główna (filtr pre_get_posts)
Szukaj…
Składnia
- działanie dodatkowe („pre_get_posts”, „callback_function_name”);
- funkcja callback_function_name ($ query) {}
- // dla PHP 5.3.0 lub nowszego
- działanie dodatkowe („pre_get_posts”, funkcja ($ query) {});
Parametry
Parametr | Detale |
---|---|
$ zapytanie | (WP_Query) Obiekt pętli |
Uwagi
Jeśli używasz PHP 5.3.0 lub nowszego, możesz użyć zamknięć ( funkcje anonimowe )
add_action( 'pre_get_posts', function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
});
Jeszcze bardziej szczegółowe celowanie w pętli
Powiedzmy, że chcemy zmienić główną pętlę , tylko dla określonej taksonomii lub typu postu.
Kierowanie tylko na główną pętlę na stronie archiwum typu book
.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
if( !is_post_type_archive( 'book' ) ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
// - and we are on 'book' post type archive page
}
Możesz także sprawdzić kategorię, znacznik lub niestandardową stronę archiwum systematyki, używając is_category()
, is_tag()
i is_tax()
.
Możesz użyć dowolnego znacznika warunkowego dostępnego w WordPress.
Pokaż posty tylko z jednej kategorii
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
Pozyskiwanie postów filtruje podstawowe użycie
Czasami chcesz zmienić główne zapytanie WordPress.
Filtruj pre_get_posts
to droga.
Na przykład za pomocą pre_get_posts
możesz powiedzieć głównej pętli, aby wyświetlała tylko 5 postów. Lub, aby wyświetlać posty tylko z jednej kategorii lub wykluczając dowolną kategorię itp.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
Jak widać, przekazujemy obiekt zapytania pętli głównej do naszego argumentu funkcji zwrotnej.
Ważna uwaga tutaj: przekazujemy argument jako odniesienie . Oznacza to, że nie musimy zwracać zapytania ani ustawiać żadnych globałów, aby działało. Ponieważ $query
jest odniesieniem do głównego obiektu zapytania, wszystkie zmiany, które wprowadzamy w naszym obiekcie, są natychmiast odzwierciedlane w obiekcie głównej pętli.
Wyklucz kategorię z udziału w edycji listy wpisów
add_action( 'pre_get_posts', 'single_category_exclude' );
function single_category_exclude( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '-1' );
return;
}
Zmień post_per_page dla głównej pętli
Wszystko, co musimy zrobić, to użyć metody set()
obiektu $query
.
Wymaga dwóch argumentów, po pierwsze, co chcemy ustawić, a po drugie, jaką wartość ustawić.
add_action( 'pre_get_posts', 'change_posts_per_page' );
function change_posts_per_page( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'posts_per_page', 5 );
return;
}
Kierowanie tylko na główną pętlę WordPress
WordPress stosuje filtr pre_get_posts
do dosłownie każdej generowanej przez siebie pętli. Oznacza to, że wszystkie zmiany, które wprowadzamy w naszej funkcji wywołania zwrotnego, są stosowane do wszystkich wychodzących pętli.
Oczywiście nie jest to, czego chcemy w większości scenariuszy.
W większości przypadków chcielibyśmy kierować reklamy tylko na główną pętlę i tylko dla ekranów nieadministracyjnych.
Możemy użyć is_main_query()
metoda i is_admin()
funkcję globalnego aby sprawdzić, czy jesteśmy we właściwym miejscu.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
}