Как скрыть Rest API маршрут из списка маршрутов WP JSON?
Создал маршрут в WordPress через register_rest_route();, хочу скрыть его из общего списка маршрутов /wp-json/
Можно ли как-то его оттуда убрать, не закрывая полностью Rest API для публичного доступа?
Дополнительно:
Разве аргумент show_in_index не делает то, что вы просите?
Так же, при помощи permission_callback можно сделать ограничение на использование
- show_in_index то, что нужно, спасибо!
/bitrix24/v1/lead скрылКак можно убрать из списка /bitrix24/v1?
- Илья Петров, по такому же принципу не получается скрыть?
- Не получилось
Код:
add_action('rest_api_init', function(){ register_rest_route('bitrix24/v1', '', [ 'methods' => 'GET', 'callback' => '__return_true', 'permission_callback' => '__return_true', 'show_in_index' => false, ]); });
add_action('rest_api_init', function(){ register_rest_route('bitrix24/v1', '', [ 'methods' => 'GET', 'callback' => '__return_true', 'permission_callback' => '__return_true', 'show_in_index' => false, ]); });
- Илья Петров, можно попробовать удалить его отображение хуком, но на работоспособность не проверял:
add_filter('rest_index', function ($routes) { if (isset($routes['bitrix24/v1'])) { unset($routes['bitrix24/v1']); } return $routes; });
add_filter('rest_index', function ($routes) { if (isset($routes['bitrix24/v1'])) { unset($routes['bitrix24/v1']); } return $routes; });
- maksam07, выдает критическую ошибку
- maksam07, поправил чуть-чуть — заработало!
add_filter('rest_index', function ($routes){ if (isset($routes->data['routes']['/lead/v1'])){ unset( $routes->data['routes']['/lead/v1'] ); } return $routes; });
add_filter('rest_index', function ($routes){ if (isset($routes->data['routes']['/lead/v1'])){ unset( $routes->data['routes']['/lead/v1'] ); } return $routes; });
- Илья Петров, рад, что помог. отметьте решением
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Чтобы скрыть конкретный REST API route из общего индекса
/wp-json/, обычно достаточно параметраshow_in_index => falseпри регистрации маршрута. Это скрывает маршрут из списка, но не запрещает обращаться к нему напрямую.register_rest_route('bitrix24/v1', '/lead', [ 'methods' => 'POST', 'callback' => 'my_create_lead', 'permission_callback' => '__return_true', 'show_in_index' => false, ]);
Если нужно скрыть namespace
/bitrix24/v1из корневого индекса, одного route может быть мало: WordPress всё равно может показывать namespace, если внутри него есть маршруты. Тогда можно отфильтровать индекс:add_filter('rest_index', function ($response) { $data = $response->get_data(); unset($data['routes']['/bitrix24/v1']); unset($data['routes']['/bitrix24/v1/lead']); if (!empty($data['namespaces'])) { $data['namespaces'] = array_values(array_diff($data['namespaces'], ['bitrix24/v1'])); } $response->set_data($data); return $response; });
Но важно понимать: скрытие из индекса не является защитой. Любой, кто знает URL, сможет обратиться к route, если
permission_callbackразрешает доступ. Для приватного маршрута обязательно проверяйте nonce, подпись, токен, IP или права пользователя.То есть
show_in_index— это косметика. Безопасность делается черезpermission_callbackи валидацию входящих данных.Если маршрут принимает лиды из внешнего сервиса, лучше использовать секретный токен в заголовке или HMAC-подпись тела запроса. Тогда даже если URL кто-то увидит, он не сможет отправлять мусорные заявки. Логи ошибок тоже нужны: скрытый route сложнее отлаживать, поэтому записывайте неуспешные запросы без персональных данных.