Быстрый ответ: 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. Единственное условие — корректные постоянные ссылки (не «обычные»). В настройках «Постоянные ссылки» выберите любой вариант, кроме первого.

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



