WordPress
Переменный основной цикл (фильтр pre_get_posts)
Поиск…
Синтаксис
- 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
}