do_parse_request
Позволяет полностью отключить обработку текущего запроса.
Поведение хука было улучшено в версии 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(массив|строка)
- Дополнительные переменные запроса.
Примеры
#1 Что будет если просто отключить обработку текущего запроса
add_filter( 'do_parse_request', '__return_false' );
После установки такого хука:
- Никак не будет обрабатываться текущий URL (правила перезаписи, ЧПУ). Соответственно, никакие параметры запроса WP не будут установлены - см. get_query_var().
- Базовый запрос WP не будет сделан.
- Любой УРЛ сайта будет возвращать 200 ответ и будет вести на файл шаблона
index.php. - Не сработают хуки request, parse_request.
Таким образом, будет отключено почти что все что WP делает с запросом на фронте.
После такого отключения нужно будет самостоятельно обработать URL, вернуть 404 статус (если нужно) и определить файл шаблона.
Такое поведение может пригодится, когда нужно кардинально по-другому обработать URL.
#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 | Введена. |
Где вызывается хук
if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) {