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
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow