REST API WordPress: что это и как использовать — простыми словами для новичков

REST API WordPress: что это и как использовать — простыми словами для новичков

Быстрый ответ: REST API WordPress — это встроенный набор HTTP-эндпоинтов, через которые можно читать и изменять контент сайта (записи, страницы, пользователей, медиа) из любых внешних приложений. Он есть в ядре WordPress начиная с версии 4.7 и доступен по адресу https://ваш-сайт.ru/wp-json/wp/v2/. Для чтения публичных данных авторизация не нужна; для создания и изменения контента требуется авторизация (Basic Auth через app password, nonce или OAuth). Новичку проще всего начать с GET-запросов к /wp/v2/posts, а затем перейти к созданию собственных маршрутов через функцию register_rest_route().

Если вы уже освоили разработку на WordPress и умеете работать с шорткодами, то REST API — следующий логичный шаг. Он открывает доступ к данным сайта извне: можно писать мобильные приложения, отдельные фронтенды, интеграции со сторонними сервисами и панели автоматизации. В этой статье разберём REST API простыми словами, с примерами кода, которые можно скопировать и запустить.

Что такое REST API и зачем он разработчику

API (Application Programming Interface) — это «дверь», через которую одна программа общается с другой. REST (Representational State Transfer) — архитектурный стиль, при котором данные передаются по HTTP в формате JSON, а каждая сущность (запись, страница, пользователь) имеет свой адрес-эндпоинт.

WordPress REST API — конкретная реализация этой «двери» внутри WordPress. Любая установка WordPress автоматически отдаёт данные по маршруту /wp-json/. Например, список последних записей сайта delai-sait.ru можно получить, открыв в браузере:

https://delai-sait.ru/wp-json/wp/v2/posts?per_page=3

Ответ придёт в виде JSON — обычного текста, который легко разобрать в любом языке программирования. Главные сценарии использования: headless-фронтенд (React/Vue вместо стандартных шаблонов), мобильные приложения, импорт и экспорт контента, интеграции с CRM и сервисами рассылок, а также собственные ajax-обработчики без admin-ajax.php.

Как устроены эндпоинты WordPress REST API

Базовый путь всех маршрутов — /wp-json/wp/v2/. Дальше идёт название сущности. Основные эндпоинты:

Эндпоинт Что делает
GET /wp/v2/posts Список записей
GET /wp/v2/posts/{id} Одна запись по ID
POST /wp/v2/posts Создать запись (нужна авторизация)
GET /wp/v2/pages Список страниц
GET /wp/v2/media Список медиафайлов
GET /wp/v2/users Список пользователей
GET /wp/v2/categories Список рубрик

Полный список маршрутов можно посмотреть по адресу /wp-json/ (индекс API) или /wp-json/wp/v2. Этого набора достаточно для большинства задач новичка: читать контент, создавать записи, управлять медиа.

Как получать данные: fetch, axios и wp_remote_get

Самый простой способ — обычный fetch в браузере. Пример получения трёх последних записей:

fetch('https://delai-sait.ru/wp-json/wp/v2/posts?per_page=3')
  .then(res => res.json())
  .then(posts => {
    posts.forEach(post => {
      console.log(post.id, post.title.rendered, post.link);
    });
  });

В Node.js удобнее использовать библиотеку axios:

const axios = require('axios');

axios.get('https://delai-sait.ru/wp-json/wp/v2/posts', {
  params: { per_page: 5, _fields: 'id,title,link' }
}).then(response => {
  console.log(response.data);
});

Внутри самого WordPress для HTTP-запросов используют wp_remote_get():

$response = wp_remote_get('https://delai-sait.ru/wp-json/wp/v2/posts?per_page=3');
if (is_wp_error($response)) {
    return;
}
$posts = json_decode(wp_remote_retrieve_body($response), true);
foreach ($posts as $post) {
    echo esc_html($post['title']['rendered']);
}

Обратите внимание на параметр _fields: он возвращает только указанные поля, что сильно уменьшает размер ответа. Это важный приём для скорости — не тяните весь JSON, если нужен только заголовок.

Как создавать контент через REST API

Чтение доступно всем, а для записи нужна авторизация. Самый простой вариант для собственного сайта — Basic Auth с app password (пароль приложения), который создаётся в админке в разделе «Пользователи → Профиль». App password работает только при включённом HTTPS.

Пример создания записи через fetch с Basic Auth:

const credentials = btoa('username:app_password');

fetch('https://delai-sait.ru/wp-json/wp/v2/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Basic ' + credentials
  },
  body: JSON.stringify({
    title: 'Новая запись через REST API',
    slug: 'novaya-zapis-cherez-rest-api',
    content: '<p>Текст записи</p>',
    status: 'publish',
    categories: [148]
  })
})
.then(res => res.json())
.then(post => console.log('Создан пост', post.id, post.link));

В PHP удобнее работать с wp_remote_post():

$body = array(
    'title'      => 'Новая запись через REST API',
    'slug'       => 'novaya-zapis-cherez-rest-api',
    'content'    => '<p>Текст записи</p>',
    'status'     => 'publish',
    'categories' => array(148),
);

$response = wp_remote_post('https://delai-sait.ru/wp-json/wp/v2/posts', array(
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode('username:app_password'),
        'Content-Type'  => 'application/json',
    ),
    'body' => wp_json_encode($body),
));

if (is_wp_error($response)) {
    error_log($response->get_error_message());
    return;
}
$post = json_decode(wp_remote_retrieve_body($response), true);
echo 'Создан пост #' . $post['id'];

Важный нюанс: при отправке JSON внутри PHP-строк экранируйте переводы строк, иначе сервер вернёт ошибку rest_invalid_json. Если вы пишете интеграцию на Node.js, используйте JSON.stringify() — он делает это автоматически.

Полезные параметры запросов

REST API поддерживает множество query-параметров, которые экономят трафик и ускоряют ответы. Наиболее полезные для новичка:

Параметр Назначение
per_page Количество элементов (макс. 100)
page Номер страницы пагинации
_fields Только указанные поля ответа
search Поиск по контенту
slug Фильтр по slug записи
categories Фильтр по ID рубрики
orderby / order Сортировка (date, title; asc/desc)

Пример — найти конкретную запись по slug и взять только ID и ссылку:

GET /wp-json/wp/v2/posts?slug=kortkody-wordpress-kak-sozdavat-svoi-gajd&_fields=id,link

Создание собственного маршрута: register_rest_route

Самое интересное — регистрировать собственные эндпоинты. Это делается через register_rest_route() в теме или плагине, внутри хука rest_api_init:

add_action('rest_api_init', function () {
    register_rest_route('myplugin/v1', '/latest/', array(
        'methods'  => 'GET',
        'callback' => 'myplugin_latest_posts',
        'permission_callback' => '__return_true',
    ));
});

function myplugin_latest_posts($request) {
    $posts = get_posts(array('numberposts' => 5));
    $result = array();
    foreach ($posts as $post) {
        $result[] = array(
            'id'    => $post->ID,
            'title' => $post->post_title,
            'link'  => get_permalink($post->ID),
        );
    }
    return rest_ensure_response($result);
}

После этого ваш маршрут доступен по адресу /wp-json/myplugin/v1/latest/. Функция rest_ensure_response() корректно оборачивает результат и выставляет нужные заголовки. Параметр permission_callback обязателен: если его нет, WordPress вернёт ошибку — всегда явно указывайте, кто имеет доступ к маршруту.

Аутентификация и безопасность

Три основных способа авторизации в REST API:

  • Basic Auth + app password — самый простой для собственных скриптов и интеграций. Работает только по HTTPS, app password можно отозвать в любой момент.
  • Nonce (wp_rest nonce) — для запросов из самого WordPress (внутренние ajax-вызовы). Nonce выдаётся функцией wp_create_nonce('wp_rest') и передаётся в заголовке X-WP-Nonce.
  • OAuth / JWT-плагины — для публичных приложений и сторонних сервисов, которым нельзя доверять пароль.

Правила безопасности: никогда не храните пароль приложения в коде фронтенда; ограничивайте права учётной записи минимально необходимыми; всегда проверяйте permission_callback в собственных маршрутах; при работе с пользовательским вводом применяйте sanitize_callback. Подробнее о защите сайта читайте в статье про безопасность WordPress для новичков.

Сравнение: REST API, XML-RPC и admin-ajax

Критерий REST API XML-RPC admin-ajax
Формат данных JSON XML произвольный
Современность стандарт с WP 4.7 устаревший, часто отключают легаси, но жив
Скорость высокая низкая средняя
Документированность отличная слабая средняя
Где использовать внешние приложения, headless старые интеграции внутренние ajax-обработчики

Вывод простой: для новых проектов выбирайте REST API. XML-RPC часто отключают из соображений безопасности (он привлекает брутфорс-атаки), а admin-ajax остаётся только для обратной совместимости.

Частые вопросы

Нужна ли авторизация для чтения записей?

Нет. Публичные данные (записи, страницы, рубрики) доступны по GET без авторизации. Авторизация нужна только для создания, изменения и удаления контента.

Что такое app password и где его взять?

Пароль приложения — это отдельный пароль для API, который создаётся в админке: «Пользователи → Профиль → Пароли приложений». Он работает только на сайтах с HTTPS и позволяет отзывать доступ без смены основного пароля.

Почему POST-запрос возвращает ошибку rest_invalid_json?

Чаще всего из-за неэкранированных переводов строк или невалидного JSON в теле запроса. Используйте JSON.stringify() в JS или wp_json_encode() в PHP — они корректно экранируют спецсимволы.

Можно ли отключить REST API?

Да, плагинами или через фильтры, но делать это бездумно не стоит: REST API используется самим WordPress, в том числе блочным редактором Gutenberg. Отключайте только публичные маршруты, если они не нужны.

Как ограничить количество запросов к API?

Кэшируйте ответы (плагины кэширования, например кэширование WordPress), используйте параметр _fields для уменьшения ответа и ограничивайте per_page.

REST API работает на любом хостинге?

Да, это часть ядра WordPress. Единственное условие — корректные постоянные ссылки (не «обычные»). В настройках «Постоянные ссылки» выберите любой вариант, кроме первого.

TimeWeb

Вывод

REST API WordPress — мощный и простой способ работать с контентом сайта извне. Начните с GET-запросов к /wp/v2/posts, освойте параметры _fields и per_page, затем попробуйте создать запись через POST с app password и зарегистрируйте собственный маршрут через register_rest_route(). Это открывает дорогу к headless-фронтендам, мобильным приложениям и любым интеграциям.

Нужен сайт на WordPress с современной архитектурой или интеграция со сторонними сервисами? Посмотрите наше портфолио или узнайте про заказ сайта на WordPress — подскажем решение под вашу задачу.

Clearfy

Поделиться:
Telegram ВКонтакте