REST API WordPress віддає вміст сайту у форматі JSON за адресами виду /wp-json/wp/v2/posts. Його використовує сам редактор Gutenberg, мобільні застосунки і зовнішні фронтенди. Розберемо, як видати доступ стороннім програмам, обмежити права і закрити зайві дані від сторонніх запитів.
Де розташований REST API і як його перевірити
Базова адреса API — https://site.example/wp-json/. Список записів віддає /wp-json/wp/v2/posts, сторінок — /wp-json/wp/v2/pages, користувачів — /wp-json/wp/v2/users. Перевірити, що API увімкнено, можна однією командою.
curl -s https://site.example/wp-json/wp/v2/posts | head -c 300
Якщо замість JSON приходить сторінка 404, значить не працюють ЧПУ-правила — зайдіть у «Налаштування → Постійні посилання» і збережіть форму заново, нічого не змінюючи.
Як видати доступ через пароль застосунку
З версії 5.6 у WordPress вбудовано Application Passwords — окремі паролі для програм, які не збігаються з паролем від адмінки. Створити пароль можна в профілі користувача, в розділі «Паролі застосунків»: вкажіть назву програми і натисніть кнопку створення. Ключ показується один раз, одразу збережіть його в менеджері паролів.
curl -u "editor:xxxx xxxx xxxx xxxx xxxx xxxx" -X POST https://site.example/wp-json/wp/v2/posts -d "title=Чернетка статті" -d "status=draft"
Пробіли всередині пароля застосунку — частина формату, їх не потрібно прибирати. Якщо паролі застосунків приховані в профілі, значить на сайті немає HTTPS: WordPress вимикає цю функцію для сайтів без TLS-сертифіката.
Як обмежити права ролей і ендпоінтів
За замовчуванням REST API дотримується тих самих прав, що і решта WordPress: автор бачить лише свої чернетки, підписник не публікує записи. Для тоншого налаштування застосуйте фільтр rest_prepare_post і перевірку можливостей через current_user_can.
<?php
add_filter('rest_prepare_post', function ($response, $post, $request) {
if (!current_user_can('edit_posts')) {
unset($response->data['content']);
}
return $response;
}, 10, 3);
Такий код прибирає повний текст запису з відповіді API для всіх, хто не має права на редагування, залишаючи лише заголовок і опис.
Як закрити API від анонімних запитів
Частина сайтів не повинна показувати дані без авторизації взагалі. Для цього підходить фільтр rest_authentication_errors, який блокує запит до того, як він дійде до конкретного ендпоінта.
<?php
add_filter('rest_authentication_errors', function ($result) {
if (!empty($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_forbidden',
'Доступ лише для авторизованих запитів',
array('status' => 401)
);
}
return $result;
});
Після такого фільтра список користувачів через /wp-json/wp/v2/users — часта ціль сканерів для підбору логінів — перестане віддаватися анонімно. Докладний розбір загальних заходів захисту зібрано в статті про безпеку WordPress.
Типові ендпоінти і рівень доступу
| Ендпоінт | Що віддає | Доступ за замовчуванням |
|---|---|---|
| /wp/v2/posts | опубліковані записи | анонімний |
| /wp/v2/users | список користувачів | анонімний (імена) |
| /wp/v2/media | файли медіабібліотеки | анонімний |
| /wp/v2/posts?status=draft | чернетки | лише авторизований |
Де застосовується REST API на практиці
Окрім самого Gutenberg, через REST API працює зв'язка WordPress із зовнішнім фронтендом: React або Vue-застосунок забирає контент за ключем застосунку і рендерить його окремо від адмінки. Докладну схему такої зв'язки описано в статті про headless WordPress. Керувати паролями застосунків і правами зручно і з консолі — команди перелічено в матеріалі про WP-CLI.
Чек-лист перед відкриттям API назовні
- Паролі застосунків видані лише тим програмам, яким вони справді потрібні, і зберігаються в менеджері паролів.
- Список користувачів через
/wp-json/wp/v2/usersзакритий від анонімних запитів або віддає лише псевдоніми. - Поля з чутливими даними прибрано з відповіді фільтром
rest_prepare_postдля ролей без прав на редагування. - Чернетки і службові записи недоступні без авторизації.
- HTTPS увімкнено, інакше паролі застосунків не з'являться в профілі.