Як вимкнути/закрити REST API від публічного доступу?
Я вже відповідав на питання, як повністю відключити REST API.
Однак розробники WordPress настійно НЕ рекомендують повністю відключати REST API, тому що це поламає працездатність WordPress в адмінці з 5 версії, там REST використовується для Блокового редактора контенту запису.
Щоб залишити REST API працездатним, але закрити всі маршрути від публічного доступу, можна використовувати хуки. Тут є кілька варіантів:
Варіант 1:
# Закриває всі маршрути REST API від публічного доступу
add_filter( 'rest_authentication_errors', function( $result ){
if( is_null( $result ) && ! current_user_can('edit_others_posts') ){
return new WP_Error( 'rest_forbidden', 'You not currently logged in.', [ 'status'=>401 ] );
}
return $result;
} );Код можна вставити у файл теми functions.php або ще кудись.
Цей код дозволяє доступ до API REST тільки для авторизованих користувачів з правами редактора і вище.
Перевірку ! current_user_can('edit_others_posts')можна замінити більш підходящою для вашого сайту. Наприклад, її можна спростити і зробити REST API доступним для всіх авторизованих користувачів (не будь-які права). Для цього замініть перевірку на ! is_user_logged_in().
ВАЖЛИВО! Закривати маршрути таким чином небезпечно, тому що на сайті можуть бути маршрути для користувачів, наприклад, самбміт форми на фронті. Цей метод закриє абсолютно всі маршрути, у тому числі й ті, які можуть бути створені плагінами або темою для неавторизованих користувачів. Тому рекомендую використовувати варіант нижче через хук rest_pre_dispatch , він дозволяє закрити зазначені маршрути і не чіпати інших.
Варіант 2:
Дуже схожий на перший, але там ми не маємо доступу до запиту і класу REST сервера.
Відразу після хука об’єкт запиту ($ request).
add_filter( 'rest_pre_dispatch', 'close_rest_api_routes', 10, 3);
/**
* Close REST API routes from public access.
*
* @param WP_REST_Response|WP_Error|null $result
* @param WP_REST_Server $rest_server
* @param WP_REST_Request $request
*
* @return WP_Error
*/
function close_rest_api_routes( $result, $rest_server, $request ){
// Maybe authentication error already set
if( ! is_null( $result ) ){
return $result;
}
if(
// only for `/wp/v2` namespace
'/wp/v2' === substr( $request->get_route(), 0, 6 )
// Administrator
&&! current_user_can( 'manage_options' )
) {
return new WP_Error( 'rest_not_logged_in', 'Your capability is low.', [ 'status' => 401 ] );
}
return $result;
}
Варіант 3:
Використовуйте плагін Disable WP REST API