WordPress как на ладони
rgbcode is looking for WordPress developers. Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

requestхук-фильтрWP 2.1.0

Фильтрует параметры (переменные) основного запроса 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(массив)
Параметры запроса, которые нужно изменить (отфильтровать).

Примеры

0

#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 ) 
0

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

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

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

#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/';
	}
} );
0

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

#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 Введена.

Где вызывается хук

WP::parse_request()
request
wp-includes/class-wp.php 409
$this->query_vars = apply_filters( 'request', $this->query_vars );

Где используется хук в WordPress

wp-includes/default-filters.php 553
add_filter( 'request', '_post_format_request' );
2 комментария
    Войти