request
Фильтрует параметры (переменные) основного запроса WordPress.
Основной запрос - это запрос связанный с текущей страницей. Например, на странице рубрики одни переменные запроса, на странице поиска другие...
Когда срабатывает хук request
Во время построения основного запроса, который строится после события init. Давайте разберем по частям.
Основной запрос строиться функцией wp(), в основе которой лежит метод WP::main() по сути он и есть все что написано про функцию wp() - он устанавливает среду WordPress. Посмотрим на код, как устанавливается среда:
// public function main($query_args = '') { $this->init(); // устанавливает текущего пользователя $this->parse_request($query_args); // разбирает указанные параметры запроса и параметры URL (ЧПУ) $this->send_headers(); // устанавливает header() заголовки $this->query_posts(); // получает записи по параметрам запроса $this->handle_404(); // выставляет статус 404, если записей по запросу не найдено $this->register_globals(); // устанавливает глобальные переменные WordPress: // $query_string, $posts, $post, $request, $more, $single, $authordata // фильтр среды WordPress после того как она была установлена do_action_ref_array( 'wp', array( &$this ) ); }
Что происходит в коде, описано в коде. Так вот, фильтр request
срабатывает в конце метода WP::parse_request() и позволяет изменить свойство WP::query_vars, которое содержит переменные запроса используемые в методе WP::query_posts(), который в свою очередь получает записи.
Другой фильтр: parse_request - расширенная копия фильтра request
do_action_ref_array( 'parse_request', array( &$this ) );
Только он передает весь класс WP по ссылке и через него мы можем изменить не только переменную класса $query_vars, но и другие переменные. Хотя, как правило, нам нужно менять именно переменную $query_vars.
Еще одни фильтр: pre_get_posts - аналог фильтра request
Фильтр pre_get_posts.
pre_get_posts срабатывает абсолютно для всех запросов, не только для основного. Он срабатывает всякий раз когда вызывается функция get_posts(), query_posts() или WP_Query.
Для основного запроса (из кода выше) он срабатывает во время вызова метода WP::query_posts(), т.е. после фильтра request
.
Использование
add_filter( 'request', 'wp_kama_request_filter' ); /** * Function for `request` filter-hook. * * @param array $query_vars The array of requested query variables. * * @return array */ function wp_kama_request_filter( $query_vars ){ // filter... return $query_vars; }
- $query_vars(массив)
- Параметры запроса, которые нужно изменить (отфильтровать).
Примеры
#1 Где какие параметры установлены
// На главной: `example.com` Array ( ) // Страница записи: http://example.com/my_post_name/ Array ( [page] => [name] => my_post_name ) // Страница постоянной страницы: http://example.com/my_page/ Array ( [page] => [pagename] => my_page ) // На странице рубрики: `example.com/category/cars/` Array ( [category_name] => uncategorized ) // Страница метки: http://example.com/tag/eshhe-odna-metka/ Array ( [tag] => eshhe-odna-metka ) // Страница автора: http://example.com/author/admin Array ( [author_name] => admin ) // Архив даты: http://example.com/2016/10/08/ Array ( [year] => 2016 [monthnum] => 10 [day] => 08 )
#2 Изменение адреса RSS ленты на любое другое
Можно создать любой фид, например atom. Для этого создаем страницу и меняем её запрос. В этом пример страница называется 'feed-yandex-zen'.
add_filter( 'request', 'zen_url_replace' ); function zen_url_replace( $query_vars ) { if ( isset( $query_vars['pagename'] ) && $query_vars['pagename'] == 'feed-yandex-zen' ) { unset( $query_vars ); $query_vars['feed'] = 'zen'; } return $query_vars; }
#3 Пагинация для постоянной страницы с ярлыком category
Изменяет запрос, чтобы работала пагинация на странице category. Страница (page) category должна быть создана в админке и указана в настройках чтения, как "Страница записей".
В шаблоне страницы должен быть стандартный цикл ВП.
/** * Изменяет запрос, чтобы работала пагинация на странице category. * * Страница (page) category должна быть создана в админке * и указана в настройках чтения, как "Страница записей" * * $param array $query_vars * * @return array */ add_filter( 'request', function ( $query_vars ) { if ( isset( $query_vars['category_name'] ) ) { $page = explode( '/', $query_vars['category_name'] ); if ( $page[0] == 'page' ) { $paged = isset( $page[1] ) && is_numeric( $page[1] ) ? (int) $page[1] : 0; $query_vars['page'] = ''; $query_vars['pagename'] = 'category'; $query_vars['paged'] = $paged; unset( $query_vars['category_name'] ); } } return $query_vars; } );
#4 Функционал "Показать записи" на указанной статической странице
add_filter( 'request', function ( $query_vars ) { $page_id = 484; $page_slug = 'all-articles'; if ( isset( $query_vars['pagename'] ) && $query_vars['pagename'] === $page_slug ) { add_filter( "pre_option_page_for_posts", function () { return $page_id; } ); } return $query_vars; } );
#5 По указанной ссылке показать стандартный feed
Есть сервисы, которым нужно отдавать фид с расширением xml, к примеру news.xml
. Сделаем стандартный фид WordPress доступный по такой ссылке.
add_filter( 'request', function ( $query_vars ) { // Идет запрос по адресу домен/news.xml if ( [ 'page' => '', 'name' => 'news.xml' ] === $query_vars ) { // Подменяем переменные запросы на такие же, как по адресу домен/feed/ $query_vars = [ 'feed' => 'feed' ]; // Подменяем REQUEST_URI, иначе будет редирект на пустой фид домен/news.xml/feed/ $_SERVER['REQUEST_URI'] = '/feed/'; } return $query_vars; } );
Тоже самое можно сделать на хуке init:
add_filter( 'init', function () { if ( $_SERVER['REQUEST_URI'] === '/news.xml' ) { $_SERVER['REQUEST_URI'] = '/feed/'; } } );
#6 Откроем доступ к странице sitemap по адресу sitemap.html
Пусть на сайте ЧПУ вида /%postname%/
, но нужно отдавать страницу с html картой сайта по адресу example.com/sitemap.html. Создадим страницу со slug = sitemap, которая с помощью плагина или своих наработок будет генерировать html карту сайта, остальное сделает код:
add_filter( 'request', 'add_sitemap_html' ); function add_sitemap_html( $query_vars ) { // Проверяем, запрошена ли страница sitemap.html if ( isset( $query_vars['name'] ) && $query_vars['name'] == 'sitemap.html' ) { // Подменяем запрос данными от страницы со slug = sitemap $query_vars = [ 'page' => '', 'pagename' => 'sitemap', ]; // Удаляем перенаправление на url со слешем на конце remove_action( 'template_redirect', 'redirect_canonical' ); } return $query_vars; }
#7 Изменим URL рубрики
Допустим, у нас есть рубрика /category/cars/ и нам нужно чтобы по URL /category/cars/super-cars/ открывалась все та же рубрика /category/cars/.
add_filter( 'request', 'my_request' ); function my_request( $query_vars ){ $request = urldecode($_SERVER['REQUEST_URI']); if( $request == '/category/cars/super-cars/' ){ $query_vars['category_name'] = 'cars'; } return $query_vars; }
Список изменений
С версии 2.1.0 | Введена. |
Где вызывается хук
$this->query_vars = apply_filters( 'request', $this->query_vars );
Где используется хук в WordPress
add_filter( 'request', '_post_format_request' );