REST API в WordPress — мощный инструмент для взаимодействия с сайтом через внешние приложения и сервисы. Однако в некоторых случаях, например, для повышения безопасности или снижения нагрузки, может возникнуть задача ограничить или полностью отключить REST API. Важно сделать это так, чтобы не нарушить работу нужных функций и плагинов, которые используют API.
Что такое REST API и зачем его отключать
WordPress REST API предоставляет стандартные маршруты для получения и изменения данных сайта через HTTP-запросы. Это удобно для мобильных приложений, редакторов и интеграций. Но если ваш сайт не использует такие возможности, оставлять REST API открытым может быть рискованно с точки зрения безопасности, а также увеличивает поверхность для DDoS-атак.
Также REST API может выдавать данные, которые вы не хотите показывать незарегистрированным пользователям, например, информацию о пользователях, записях и настройках.
Простое отключение REST API стандартными методами часто ломает работу некоторых плагинов и тем, потому нужен более гибкий подход.
Гибкое ограничение доступа к REST API в WordPress
Самый простой способ — ограничить доступ к REST API только авторизованным пользователям. Для этого достаточно использовать фильтр rest_authentication_errors. Вот пример функции, которую можно добавить в файл functions.php вашей темы или в собственный плагин:
function wpbuy_restrict_rest_api_access( $access ) {
if ( ! is_user_logged_in() ) {
return new WP_Error(
'rest_forbidden',
'Доступ к REST API разрешён только авторизованным пользователям.',
array( 'status' => 401 )
);
}
return $access;
}
add_filter( 'rest_authentication_errors', 'wpbuy_restrict_rest_api_access' );Эта функция блокирует все неавторизованные запросы к REST API, возвращая ошибку 401. Таким образом, плагинам и тем, которым нужен API для админки и зарегистрированных пользователей, ничего не мешает работать.
Исключения для определённых маршрутов REST API
Если нужно разрешить доступ к конкретным публичным маршрутам (например, получение списка записей), можно модифицировать функцию:
function wpbuy_restrict_rest_api_access( $access ) {
if ( ! is_user_logged_in() ) {
$route = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
// Разрешаем доступ к публичным маршрутам
if ( strpos( $route, '/wp/v2/posts' ) !== false || strpos( $route, '/wp/v2/categories' ) !== false ) {
return $access;
}
return new WP_Error(
'rest_forbidden',
'Доступ к REST API разрешён только авторизованным пользователям.',
array( 'status' => 401 )
);
}
return $access;
}
add_filter( 'rest_authentication_errors', 'wpbuy_restrict_rest_api_access' );Этот код разрешит доступ к маршрутам получения записей и категорий всем, а остальное — только авторизованным.
Отключение REST API для гостей с помощью плагинов
Если вы не хотите писать код, можно использовать плагины для ограничения REST API. Например:
- Clearfy Pro — в этом плагине есть опция отключения REST API для неавторизованных пользователей, а также другие инструменты оптимизации безопасности.
- Disable REST API — бесплатный плагин, который полностью отключает API, но при этом может ломать некоторые функции.
Рекомендуется использовать именно частичное ограничение доступа, а не полное отключение.
Диагностика проблем после ограничения REST API
После внесения изменений обязательно проверьте работу административной части сайта и плагинов, которые могут использовать REST API. Особенно это касается конструкторов страниц, форм, плагинов кеширования и SEO.
Для отладки можно использовать консоль браузера (Network → XHR) и проверять ответы на запросы к /wp-json/. Если видите ошибки 401 или 403 там, значит нужно добавить исключения для нужных маршрутов или временно отключить фильтр.
Пример расширенного ограничения с проверкой user capabilities
function wpbuy_restrict_rest_api_access( $access ) {
if ( ! is_user_logged_in() ) {
$route = $_SERVER['REQUEST_URI'] ?? '';
// Разрешаем публичный доступ к записям и страницам
if ( strpos( $route, '/wp/v2/posts' ) !== false || strpos( $route, '/wp/v2/pages' ) !== false ) {
return $access;
}
return new WP_Error(
'rest_forbidden',
'Доступ к REST API разрешён только авторизованным пользователям.',
array( 'status' => 401 )
);
} else {
// Для авторизованных проверяем права
$user = wp_get_current_user();
if ( in_array( 'administrator', (array) $user->roles ) ) {
return $access; // Админы имеют полный доступ
} elseif ( in_array( 'editor', (array) $user->roles ) ) {
// Можно добавить ограничение для редакторов
return $access;
} else {
// Остальные ограничены
return new WP_Error(
'rest_forbidden',
'Доступ ограничен.',
array( 'status' => 403 )
);
}
}
}
add_filter( 'rest_authentication_errors', 'wpbuy_restrict_rest_api_access' );Такой подход даёт гибкий контроль, позволяя не блокировать полезный функционал.
Итоги и рекомендации
Отключение REST API в WordPress — задача, требующая аккуратности и понимания, какие части сайта и плагины используют этот интерфейс. Полное отключение редко оправдано, лучше ограничить доступ для гостей и оставить API доступным для авторизованных пользователей и публичных запросов.
Для удобства используйте проверенные плагины, например Clearfy Pro, которые позволяют настроить ограничения без ошибок.
Обязательно тестируйте сайт после внесения изменений и мониторьте логи ошибок. Если появятся проблемы с плагинами, попробуйте расширить список разрешённых маршрутов в фильтре или временно отключить ограничение.