WordPress уже давно вышел за рамки простой CMS и превратился в мощную платформу для разработки. Одним из ключевых инструментов современного WordPress является REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы и создавать сложные веб-приложения и мобильные приложения на базе данных вашего сайта.
В этой статье мы подробно разберем, как создать собственный REST API endpoint в WordPress, чтобы расширить функционал вашего сайта, предоставить новые возможности для интеграций и улучшить взаимодействие с внешними сервисами.
Что такое REST API в WordPress и зачем создавать собственные endpoint’ы
REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия между клиентом и сервером через стандартные HTTP-запросы. В WordPress REST API уже встроен и позволяет получать, создавать, редактировать и удалять записи, страницы, пользователей и другие сущности.
Однако стандартные endpoint’ы покрывают не все возможные задачи. Иногда возникает необходимость создать свои собственные маршруты и методы для специфических нужд, например, для получения данных из кастомных таблиц, выполнения сложной бизнес-логики, выдачи персонализированной информации или интеграции с внешними сервисами.
Создание собственного REST API endpoint позволяет:
- Расширить стандартный функционал WordPress;
- Создать API для мобильных приложений или SPA на React/Vue;
- Поддерживать интеграции с другими системами;
- Обеспечить безопасность и контроль доступа к данным;
- Оптимизировать обмен данными без загрузки страниц.
Регистрация собственного REST API endpoint в WordPress
Для начала создадим простой endpoint, который будет возвращать список последних 5 публикаций вашего сайта в формате JSON. Для этого используется функция register_rest_route, которую необходимо вызывать внутри хука rest_api_init.
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
add_action('rest_api_init', 'wphow_register_custom_endpoint');
function wphow_register_custom_endpoint() {
register_rest_route('wphow/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wphow_get_latest_posts',
'permission_callback' => '__return_true',
));
}
function wphow_get_latest_posts() {
$args = array(
'numberposts' => 5,
'post_status' => 'publish'
);
$recent_posts = wp_get_recent_posts($args);
return rest_ensure_response($recent_posts);
}Объяснение:
wphow_register_custom_endpoint— функция для регистрации маршрута/wp-json/wphow/v1/latest-posts/.'methods' => 'GET'— указывает, что endpoint поддерживает GET-запросы.callback— функция, которая выполнится при обращении к endpoint и вернет данные.permission_callback— функция для проверки доступа. Здесь мы разрешаем всем (можно усложнить для авторизованных пользователей).
Теперь вы можете получить последние 5 постов, отправив запрос по адресу https://ваш-сайт.ru/wp-json/wphow/v1/latest-posts/.
Добавление параметров в REST API endpoint и фильтрация данных
Чтобы сделать API гибче, добавим возможность указывать количество постов через параметр count в запросе, например: /wp-json/wphow/v1/latest-posts/?count=10.
Изменим функцию регистрации и callback следующим образом:
add_action('rest_api_init', 'wphow_register_custom_endpoint');
function wphow_register_custom_endpoint() {
register_rest_route('wphow/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wphow_get_latest_posts',
'permission_callback' => '__return_true',
'args' => array(
'count' => array(
'default' => 5,
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0 && $param <= 20;
}
),
),
));
}
function wphow_get_latest_posts($request) {
$count = (int) $request->get_param('count');
$args = array(
'numberposts' => $count,
'post_status' => 'publish'
);
$recent_posts = wp_get_recent_posts($args);
return rest_ensure_response($recent_posts);
}Таким образом, мы обеспечили валидацию параметра и ограничили максимальное значение параметра count до 20, чтобы не перегружать сервер излишним объемом данных.
Обработка POST-запросов: создание записи через REST API
REST API в WordPress позволяет не только читать, но и создавать записи. Для примера создадим endpoint, который будет принимать POST-запрос с параметрами title и content для создания новой записи.
add_action('rest_api_init', 'wphow_register_post_creation_endpoint');
function wphow_register_post_creation_endpoint() {
register_rest_route('wphow/v1', '/create-post/', array(
'methods' => 'POST',
'callback' => 'wphow_create_post',
'permission_callback' => 'wphow_check_api_permission',
'args' => array(
'title' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field'
),
'content' => array(
'required' => true,
'sanitize_callback' => 'wp_kses_post'
),
),
));
}
function wphow_create_post($request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_data = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_author' => get_current_user_id(),
'post_type' => 'post',
);
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Не удалось создать запись', array('status' => 500));
}
return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Запись успешно создана'));
}
function wphow_check_api_permission() {
return current_user_can('edit_posts');
}Обратите внимание на функцию wphow_check_api_permission, которая проверяет, имеет ли пользователь право создавать записи. Это важный момент для безопасности API.
Использование пользовательских типов записей и метаданных в REST API
Если у вас есть кастомные типы записей (Custom Post Types) или метаданные, вы также можете расширять REST API для работы с ними.
Для регистрации кастомного типа записи с поддержкой REST API, добавьте в параметры show_in_rest => true:
function wphow_register_custom_post_type() {
register_post_type('wphow_product', array(
'label' => 'Продукты',
'public' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor', 'custom-fields'),
));
}
add_action('init', 'wphow_register_custom_post_type');Для добавления собственных полей в REST API можно использовать функцию register_rest_field:
add_action('rest_api_init', function() {
register_rest_field('wphow_product', 'price', array(
'get_callback' => 'wphow_get_product_price',
'update_callback' => 'wphow_update_product_price',
'schema' => array(
'description' => 'Цена продукта',
'type' => 'number',
'context' => array('view', 'edit'),
),
));
});
function wphow_get_product_price($object) {
return get_post_meta($object['id'], 'price', true);
}
function wphow_update_product_price($value, $object, $field_name) {
if (!is_numeric($value)) {
return new WP_Error('rest_invalid_param', 'Цена должна быть числом', array('status' => 400));
}
return update_post_meta($object->ID, $field_name, $value);
}Это позволяет клиентам API получать и обновлять цену продукта через стандартные REST-запросы.
Как тестировать собственные REST API endpoint’ы
Для тестирования созданных endpoint’ов можно использовать:
- Браузер — для GET-запросов;
- Postman или Insomnia — для сложных запросов (POST, PUT, DELETE);
- curl из командной строки.
Пример curl-запроса для создания новой записи:
curl -X POST https://ваш-сайт.ru/wp-json/wphow/v1/create-post/ \
-H 'Content-Type: application/json' \
-d '{"title": "Новая запись через API", "content": "Содержимое записи."}' \
-u username:application_passwordНе забудьте использовать метод аутентификации для защищенных запросов, например, Basic Auth с паролями приложений WordPress.
Рекомендации по безопасности при создании REST API endpoint’ов
При расширении REST API важно учитывать безопасность:
- Всегда проверяйте права пользователя через
permission_callback; - Санитизируйте и валидируйте все входящие данные;
- Используйте nonce или другие методы аутентификации;
- Ограничивайте объем выдаваемых данных;
- Логируйте подозрительную активность.
Соблюдение этих правил поможет избежать уязвимостей и защитить сайт от несанкционированного доступа.
Полезные плагины для работы с REST API в WordPress
Для упрощения работы с REST API можно использовать плагины:
- WP REST API Controller — позволяет управлять видимостью полей и типов записей в REST API без кода.
- JWT Authentication for WP REST API — добавляет поддержку JWT для безопасной аутентификации.
- Advanced Custom Fields (ACF) — расширяет возможности метаданных с интеграцией в REST API.
Использование этих инструментов помогает ускорить разработку и снизить количество ошибок.