Поиск…


Синтаксис

  • add_action ('pre_get_posts', 'callback_function_name');
  • function callback_function_name ($ query) {}
  • // для PHP 5.3.0 или выше
  • add_action ('pre_get_posts', function ($ query) {});

параметры

параметр подробности
$ запрос (WP_Query) Объект Loop

замечания

Если вы используете PHP 5.3.0 или выше, вы можете использовать закрытие ( анонимные функции )

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
});

Еще более специфический таргетинг на контуры

Предположим, мы хотим изменить основной цикл , только для конкретной таксономии или типа сообщения.

Ориентация только на основной цикл 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
}

Вы также можете проверить категорию, тег или пользовательскую страницу архива таксономии, используя is_category() , is_tag() и is_tax() .

Вы можете использовать любой условный тег, доступный в WordPress.

Показывать сообщения из одной категории

add_action( 'pre_get_posts', 'single_category' );

function single_category( $query ) {
    if( !$query->is_main_query() || is_admin() ) return;

    $query->set( 'cat', '1' );
    return;
}

Предварительное получение базового использования фильтра сообщений

Иногда вы хотите изменить основной запрос WordPress.

Фильтр pre_get_posts - это путь.

Например, используя pre_get_posts вы можете указать основной цикл, чтобы показать только 5 сообщений. Или показывать сообщения только из одной категории или исключая любую категорию и т. Д.

add_action( 'pre_get_posts', 'my_callback_function' );

function my_callback_function( $query ) {
    // here goes logic of your filter
}

Как вы можете видеть, мы передаем объект запроса основного цикла в наш аргумент функции обратного вызова.

Важное замечание здесь: мы передаем аргумент как ссылку . Это означает, что нам не нужно возвращать запрос или устанавливать любые глобальные переменные, чтобы заставить его работать. Поскольку $query является ссылкой на основной объект запроса, все изменения, которые мы делаем на нашем объекте, немедленно отражаются в основном объекте цикла.

Исключить категорию из списка сообщений изменить долю

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;
}

Изменить posts_per_page для основного цикла

Все, что нам нужно сделать, это использовать метод set() объекта $query .

Он принимает два аргумента, сначала то, что мы хотим установить, и второе значение, которое нужно установить.

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;
}

Ориентация только основного цикла WordPress

WordPress применяет фильтр pre_get_posts буквально к любому циклу, который он создает. Это означает, что все изменения, которые мы делаем в нашей функции обратного вызова, применяются ко всем выходящим циклам.

Очевидно, что это не то, что мы хотим в большинстве сценариев.

В большинстве случаев мы хотели бы настроить только основной цикл и только для экранов без администратора.

Мы можем использовать is_main_query() метод и is_admin() глобальную функцию , чтобы проверить , если мы находимся в правильном месте.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow