do_parse_requestхук-фильтрWP 3.5.0

Позволяет полностью отключить обработку текущего запроса.

Поведение хука было улучшено в версии 6.0, смотрите заметку.

Хук срабатывает в функции WP::parse_request(), и если он вернет 'false', то функция не будет парсить текущие параметры запроса и также вернет 'false'. В свою очередь это отменит основной запрос в БД, обработку 404 страницы и установку глобальных параметров запроса:

class WP {
	// ...

	public function main( $query_args = '' ) {
		$this->init();

		$parsed = $this->parse_request( $query_args );

		$this->send_headers();

		if ( $parsed ) {
			$this->query_posts();
			$this->handle_404();
			$this->register_globals();
		}

		do_action_ref_array( 'wp', array( &$this ) );
	}

	// ...
}

До WP 6.0 разработчики плагинов и тем использовали этот фильтр для отключения дефолтного парсинга параметров запроса и устанавливали свои параметры запроса. При этом все равно выполнялись ненужные запросы на получение постов и проверку 404 страниц. Как следствие, делались ненужные SQL-запросы.

Использование

add_filter( 'do_parse_request', 'wp_kama_do_parse_request_filter', 10, 3 );

/**
 * Function for `do_parse_request` filter-hook.
 * 
 * @param bool         $bool             Whether or not to parse the request.
 * @param WP           $wp               Current WordPress environment instance.
 * @param array|string $extra_query_vars Extra passed query variables.
 *
 * @return bool
 */
function wp_kama_do_parse_request_filter( $bool, $wp, $extra_query_vars ){

	// filter...
	return $bool;
}
$bool(true|false)
Разбирать или нет запрос.
По умолчанию: true
$wp(WP)
Текущий экземпляр окружения WordPress - класс WP.
$extra_query_vars(массив|строка)
Дополнительные переменные запроса.

Примеры

0

#1 Что будет если просто отключить обработку текущего запроса

add_filter( 'do_parse_request', '__return_false' );

После установки такого хука:

  • Никак не будет обрабатываться текущий URL (правила перезаписи, ЧПУ). Соответственно, никакие параметры запроса WP не будут установлены - см. get_query_var().
  • Базовый запрос WP не будет сделан.
  • Любой УРЛ сайта будет возвращать 200 ответ и будет вести на файл шаблона index.php.
  • Не сработают хуки request, parse_request.

Таким образом, будет отключено почти что все что WP делает с запросом на фронте.

После такого отключения нужно будет самостоятельно обработать URL, вернуть 404 статус (если нужно) и определить файл шаблона.

Такое поведение может пригодится, когда нужно кардинально по-другому обработать URL.

0

#2 Пример использования фильтра

Если нужно полностью отключить обработку текущего URL и сделать свою обработку, то за основу можно взять такой код:

add_filter( 'do_parse_request', 'wp_kama_add_custom_query', 10, 3 );

function wp_kama_add_custom_query( $do_parse, $wp, $extra_query_vars ) {

	if ( str_starts_with( $_SERVER['REQUEST_URI'], '/myroute' ) ) {

		add_action( 'wp', 'my_parse_request' );

		return false;
	}

	return $do_parse;
}

function my_parse_request( $wp ){

	// делаем что нужно
	// die( print_r( $wp ) );
}

После установки этого кода при переходе на URL https://example.com/myroute/foo... WP не будет никак обрабатывать URL и мы сможем это сделать самостоятельно в нашей функции my_parse_request().

Список изменений

С версии 3.5.0 Введена.

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

WP::parse_request()
do_parse_request
wp-includes/class-wp.php 147
if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) {

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

Использование не найдено.