# REST API WordPress: доступ, ключі і права

> REST API WordPress: як надати доступ через паролі застосунків, обмежити права ролей і закрити ендпоінти від чужих запитів.

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](https://www.zevshost.net/uk/kb/wordpress-bezopasnost/).

## Типові ендпоінти і рівень доступу

| Ендпоінт | Що віддає | Доступ за замовчуванням |
| --- | --- | --- |
| /wp/v2/posts | опубліковані записи | анонімний |
| /wp/v2/users | список користувачів | анонімний (імена) |
| /wp/v2/media | файли медіабібліотеки | анонімний |
| /wp/v2/posts?status=draft | чернетки | лише авторизований |

## Де застосовується REST API на практиці

Окрім самого Gutenberg, через REST API працює зв'язка WordPress із зовнішнім фронтендом: React або Vue-застосунок забирає контент за ключем застосунку і рендерить його окремо від адмінки. Докладну схему такої зв'язки описано в статті [про headless WordPress](https://www.zevshost.net/uk/kb/wordpress-headless/). Керувати паролями застосунків і правами зручно і з консолі — команди перелічено в матеріалі про [WP-CLI](https://www.zevshost.net/uk/kb/wp-cli-commands/).

## Чек-лист перед відкриттям API назовні

- Паролі застосунків видані лише тим програмам, яким вони справді потрібні, і зберігаються в менеджері паролів.
- Список користувачів через `/wp-json/wp/v2/users` закритий від анонімних запитів або віддає лише псевдоніми.
- Поля з чутливими даними прибрано з відповіді фільтром `rest_prepare_post` для ролей без прав на редагування.
- Чернетки і службові записи недоступні без авторизації.
- HTTPS увімкнено, інакше паролі застосунків не з'являться в профілі.

---

Джерело: https://www.zevshost.net/uk/kb/wordpress-rest-api/
