Фильтр request
в WordPress предоставляет разработчикам возможность модифицировать массив переменных запроса перед выполнением основного SQL-запроса. Это позволяет гибко управлять выводом контента, изменяя параметры запроса до того, как они будут переданы в базу данных.
apply_filters( ‘request’, array $query_vars )
Хук request
срабатывает в процессе построения основного запроса WordPress, сразу после добавления дополнительных приватных переменных. С помощью него можно настроить SQL-запрос и отфильтровать вывод данных, например, чтобы исключить определённые записи из результатов или включить кастомные типы записей в запрос. Хук особенно полезен, поскольку он позволяет оптимизировать количество запросов к базе данных.
Пример использования:
add_filter( 'request', 'customize_request' );
function customize_request( $query_vars ) {
// Добавляем условие для главной страницы
if ( isset( $query_vars['is_home'] ) ) {
$query_vars['category_name'] = 'news'; // Показываем только категорию 'news'
}
return $query_vars;
}
Пример 1: Показ определённой категории на главной странице
Этот пример показывает, как с помощью request
можно настроить вывод только определённой категории на главной странице.
add_filter( 'request', 'show_specific_category_on_home' );
function show_specific_category_on_home( $query_vars ) {
if ( isset( $query_vars['is_home'] ) ) {
$query_vars['category_name'] = 'events'; // Показываем только категорию 'events'
}
return $query_vars;
}
Пример 2: Настройка параметров RSS-ленты
Иногда требуется создавать уникальные RSS-ленты для определённых категорий или форматов контента. Следующий пример демонстрирует, как изменить URL RSS-ленты с помощью request
.
add_filter( 'request', 'custom_feed_request' );
function custom_feed_request( $query_vars ) {
if ( isset( $query_vars['pagename'] ) && $query_vars['pagename'] === 'custom-feed' ) {
unset( $query_vars );
$query_vars['feed'] = 'custom';
}
return $query_vars;
}
Пример 3: Пагинация на статической странице категории
В этом примере используется фильтр request
для настройки пагинации на статической странице категории.
add_filter( 'request', 'pagination_for_category_page' );
function pagination_for_category_page( $query_vars ) {
if ( isset( $query_vars['category_name'] ) && $query_vars['category_name'] === 'reviews' ) {
$query_vars['paged'] = max( 1, get_query_var('paged') );
}
return $query_vars;
}
Пример 4: Исключение страницы из результатов поиска
Если нужно исключить определённую страницу из результатов поиска, можно использовать фильтр request
для исключения её ID.
add_filter( 'request', 'exclude_page_from_search_results' );
function exclude_page_from_search_results( $query_vars ) {
if ( isset( $query_vars['is_search'] ) ) {
$query_vars['post__not_in'] = array( 42 ); // ID страницы, которую нужно исключить
}
return $query_vars;
}
Пример 5: Изменение URL категории с подкатегорией
В следующем примере изменяем URL подкатегории, чтобы при запросе /category/cars/sport-cars/
отображались записи основной категории /category/cars/
.
add_filter( 'request', 'redirect_subcategory_to_main' );
function redirect_subcategory_to_main( $query_vars ) {
$request = urldecode( $_SERVER['REQUEST_URI'] );
if ( $request == '/category/cars/sport-cars/' ) {
$query_vars['category_name'] = 'cars';
}
return $query_vars;
}
Пример 6: Создание HTML карты сайта по адресу /sitemap.html
Для создания карты сайта, доступной по определённому URL (например, /sitemap.html
), используем фильтр request
, чтобы изменить запрос и подставить параметры страницы с картой сайта.
add_filter( 'request', 'html_sitemap_request' );
function html_sitemap_request( $query_vars ) {
if ( isset( $query_vars['name'] ) && $query_vars['name'] === 'sitemap.html' ) {
$query_vars = array(
'page' => '',
'pagename' => 'sitemap',
);
remove_action( 'template_redirect', 'redirect_canonical' ); // Убираем редирект
}
return $query_vars;
}
Заключение
Использование фильтра request
предоставляет гибкий способ управления запросами в WordPress. Он помогает выполнять фильтрацию контента до обращения к базе данных, что позволяет оптимизировать производительность сайта и настроить вывод данных для различных типов страниц.