Як вимкнути/закрити 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