WordPress как на ладони
wordpress jino

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

Фильтрует параметры (переменные) основного запроса 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', '____filter_function_name' );
function ____filter_function_name( $query_vars ) {
	// Фильтр...

	return $query_vars;
}
$query_vars(массив)
Параметры запроса, которые нужно изменить (отфильтровать).

Примеры

#1 Изменим 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 Где какие параметры установлены

// На главной: `wptest.ru`
Array (  )

// Страница записи: http://wptest.ru/my_post_name/
Array ( [page] => [name] => my_post_name )

// Страница постоянной страницы: http://wptest.ru/my_page/
Array ( [page] => [pagename] => my_page )

// На странице рубрики: `wptest.ru/category/cars/`
Array ( [category_name] => uncategorized )

// Страница метки: http://wptest.ru/tag/eshhe-odna-metka/
Array ( [tag] => eshhe-odna-metka )

// Страница автора: http://wptest.ru/author/admin
Array ( [author_name] => admin )

// Архив даты: http://wptest.ru/2016/10/08/
Array ( [year] => 2016 [monthnum] => 10 [day] => 08 ) 

#3 Изменение адреса 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;
}

#4 Пагинация для постоянной страницы с ярлыком 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;
} );

Связи хука

Используется в: WP::parse_request()

Остальные хуки из: WP::parse_request():

Фрагменты кода хука request

Фрагмент из: wp-includes/class-wp.php VER 4.9.1
...
		foreach ( (array) $this->private_query_vars as $var) {
			if ( isset($this->extra_query_vars[$var]) )
				$this->query_vars[$var] = $this->extra_query_vars[$var];
		}

		if ( isset($error) )
			$this->query_vars['error'] = $error;

		/**
		 * Filters the array of parsed query variables.
		 *
		 * @since 2.1.0
		 *
		 * @param array $query_vars The array of requested query variables.
		 */
		$this->query_vars = apply_filters( 'request', $this->query_vars );

		/**
		 * Fires once all query variables for the current request have been parsed.
		 *
		 * @since 2.1.0
		 *
		 * @param WP $this Current WordPress environment instance (passed by reference).
		 */
		do_action_ref_array( 'parse_request', array( &$this ) );
	}

	/**
	 * Sends additional HTTP headers for caching, content type, etc.
	 *
	 * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits.
...
request Комментариев нет

    Здравствуйте, !

    Ваш комментарий
    Предпросмотр