Как в шаблоне CMS WordPress правильно получить текущий маршрут (rest_route) из глобального объекта $wp?
В WordPress глобальный объект `$wp` содержит информацию о текущем запросе, включая параметры запроса, query vars и маршруты REST API. Чтобы получить текущий маршрут (`rest_route`) из этого объекта, необходимо понимать, как WordPress обрабатывает REST-запросы.
## Как работает $wp и rest_route
Когда поступает REST API запрос, WordPress парсит URL и сохраняет маршрут в query var `rest_route`. Глобальный объект `$wp` хранит все query vars в свойстве `$wp->query_vars`.
## Способ 1: Через $wp->query_vars
php
global $wp;
if ( isset( $wp->query_vars[‘rest_route’] ) ) {
$current_route = $wp->query_vars[‘rest_route’];
echo esc_html( $current_route );
}
Этот способ является наиболее прямым и надёжным. Свойство `query_vars` заполняется после того, как WordPress обработал входящий запрос.
## Способ 2: Через функцию get_query_var()
php
$current_route = get_query_var( ‘rest_route’ );
if ( ! empty( $current_route ) ) {
echo esc_html( $current_route );
}
Функция `get_query_var()` внутри себя обращается к тому же объекту `$wp`, поэтому результат идентичен первому способу.
## Способ 3: Через $wp->request
php
global $wp;
$request = $wp->request; // Возвращает путь без параметров
Однако `$wp->request` содержит весь путь запроса, а не только REST-маршрут, поэтому для точного получения именно `rest_route` предпочтительнее первые два способа.
## Важные нюансы
1. **Момент вызова**: Объект `$wp` заполняется после хука `parse_request`. Если вы обращаетесь к `rest_route` слишком рано (например, в `functions.php` до инициализации), значение может быть пустым.
2. **Проверка REST-запроса**: Перед получением маршрута рекомендуется убедиться, что текущий запрос является REST-запросом:
php
if ( defined( ‘REST_REQUEST’ ) && REST_REQUEST ) {
global $wp;
$route = isset( $wp->query_vars[‘rest_route’] )
? $wp->query_vars[‘rest_route’]
: »;
}
3. **Нормализация маршрута**: Маршрут может начинаться с `/` или без него в зависимости от конфигурации. Используйте `trailingslashit()` или `ltrim()` для нормализации:
php
$route = ‘/’ . ltrim( $wp->query_vars[‘rest_route’], ‘/’ );
4. **Использование в шаблонах**: В обычных шаблонах (page.php, single.php) REST-маршрут, как правило, не задан, так как это обычный фронтенд-запрос. `rest_route` актуален только при прямых обращениях к `/wp-json/`.
## Рекомендуемый итоговый код
php
global $wp;
$rest_route = isset( $wp->query_vars[‘rest_route’] )
? trim( $wp->query_vars[‘rest_route’], ‘/’ )
: »;
if ( $rest_route ) {
// Обработка маршрута
echo ‘Текущий REST-маршрут: ‘ . esc_html( $rest_route );
}
Такой подход безопасен, совместим со всеми актуальными версиями WordPress и не вызывает ошибок при обычных фронтенд-запросах.
