WordPress изначально поддерживает REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Но часто стандартных эндпоинтов не хватает, и возникает необходимость создавать собственные REST API маршруты для реализации специфичных задач. В этой статье мы подробно разберем, как создать собственный REST API в WordPress, рассмотрим структуру регистрации маршрутов, обработку запросов и безопасность. Также приведем примеры плагинов и кода.
Что такое REST API в WordPress и зачем создавать свои маршруты
REST API — это архитектурный стиль, который позволяет клиенту и серверу обмениваться данными через HTTP. В WordPress REST API реализован на базе WP_REST_Controller и предоставляет базовые маршруты для всех основных сущностей: посты, страницы, пользователи и т.д.
Однако, если вы хотите получить данные из кастомной таблицы, выполнить сложную бизнес-логику или сделать специфичные действия, встроенных эндпоинтов может не хватить. В этом случае нужно создавать собственные маршруты — это расширит функциональность сайта и позволит взаимодействовать с ним из внешних приложений максимально гибко.
Основные шаги создания собственного REST API в WordPress
- Регистрация маршрута с помощью функции
register_rest_route(). - Определение функции-обработчика, которая возвращает данные или выполняет действия.
- Настройка прав доступа через параметр
permission_callback. - Обработка параметров запроса и формирование ответа.
Далее разберем каждый из этих шагов подробно и на примерах.
Регистрация собственного маршрута REST API в WordPress
Для начала регистрации маршрута нужно использовать хук rest_api_init, который вызывается при инициализации REST API. В нем вызывается функция register_rest_route(), куда передается пространство имён (namespace), путь маршрута и массив с параметрами.
add_action('rest_api_init', 'wp24_register_custom_route');
function wp24_register_custom_route() {
register_rest_route('wp24/v1', '/get-data/', [
'methods' => 'GET',
'callback' => 'wp24_get_data_callback',
'permission_callback' => '__return_true' // открытый доступ
]);
}
Здесь мы регистрируем маршрут /wp-json/wp24/v1/get-data/, который будет обрабатывать GET-запросы и вызывать функцию wp24_get_data_callback.
Пример обработчика запроса
Обработчик должен принимать объект WP_REST_Request и возвращать данные. Например:
function wp24_get_data_callback( WP_REST_Request $request ) {
$data = [
'message' => 'Привет от WP24 REST API!',
'time' => current_time('mysql')
];
return rest_ensure_response($data);
}
Мы возвращаем простой массив с сообщением и текущим временем. WordPress автоматически преобразует его в JSON.
Обработка параметров запроса и валидация
Часто нужно принимать параметры из URL или тела запроса. Их можно получить через методы объекта WP_REST_Request:
$request->get_param('param_name')— получить параметр из любого источника.$request->get_query_params()— получить все GET-параметры.$request->get_body_params()— получить параметры из тела POST-запроса.
Рассмотрим пример маршрута с параметром id:
add_action('rest_api_init', 'wp24_register_post_route');
function wp24_register_post_route() {
register_rest_route('wp24/v1', '/post/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'wp24_get_post_by_id',
'permission_callback' => '__return_true',
'args' => [
'id' => [
'validate_callback' => function($param) {
return is_numeric($param);
}
]
]
]);
}
function wp24_get_post_by_id(WP_REST_Request $request) {
$id = (int) $request->get_param('id');
$post = get_post($id);
if (empty($post)) {
return new WP_Error('no_post', 'Пост не найден', ['status' => 404]);
}
return rest_ensure_response([ 'id' => $post->ID, 'title' => $post->post_title ]);
}
Здесь маршрут принимает числовой параметр id, валидирует его, затем возвращает заголовок поста по ID или ошибку 404.
Настройка прав доступа и безопасность REST API
Очень важно правильно настроить permission_callback, чтобы контролировать, кто может обращаться к вашему маршруту. Если поставить __return_true, маршрут будет открыт всем. Это подходит для публичных данных, но для операций создания, редактирования или удаления данных нужно проверять права пользователя.
Пример проверки, что пользователь авторизован и имеет возможность редактировать посты:
function wp24_permission_check(WP_REST_Request $request) {
return current_user_can('edit_posts');
}
add_action('rest_api_init', function() {
register_rest_route('wp24/v1', '/update-post/(?P<id>\d+)', [
'methods' => 'POST',
'callback' => 'wp24_update_post_callback',
'permission_callback' => 'wp24_permission_check'
]);
});
Если пользователь не авторизован или нет нужных прав, WordPress вернет ошибку 401 или 403.
Пример: Создаем плагин с собственным REST API для управления заметками
Представим, что у нас есть кастомная таблица wp24_notes для хранения заметок. Мы хотим создать REST API для создания, получения и удаления заметок.
1. Создание таблицы (в функции активации плагина)
function wp24_create_notes_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'notes';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
title text NOT NULL,
content longtext NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook(__FILE__, 'wp24_create_notes_table');
2. Регистрация REST API маршрутов
add_action('rest_api_init', function() {
register_rest_route('wp24/v1', '/notes', [
'methods' => 'GET',
'callback' => 'wp24_get_notes',
'permission_callback' => '__return_true'
]);
register_rest_route('wp24/v1', '/notes', [
'methods' => 'POST',
'callback' => 'wp24_create_note',
'permission_callback' => 'wp24_permission_check'
]);
register_rest_route('wp24/v1', '/notes/(?P<id>\d+)', [
'methods' => 'DELETE',
'callback' => 'wp24_delete_note',
'permission_callback' => 'wp24_permission_check'
]);
});
3. Обработчики запросов
function wp24_get_notes() {
global $wpdb;
$table = $wpdb->prefix . 'notes';
$results = $wpdb->get_results("SELECT * FROM $table", ARRAY_A);
return rest_ensure_response($results);
}
function wp24_create_note(WP_REST_Request $request) {
global $wpdb;
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_textarea_field($request->get_param('content'));
if (empty($title) || empty($content)) {
return new WP_Error('empty_fields', 'Заголовок и содержимое обязательны', ['status' => 422]);
}
$table = $wpdb->prefix . 'notes';
$wpdb->insert($table, [
'title' => $title,
'content' => $content
]);
return rest_ensure_response(['id' => $wpdb->insert_id, 'title' => $title, 'content' => $content]);
}
function wp24_delete_note(WP_REST_Request $request) {
global $wpdb;
$id = (int) $request->get_param('id');
$table = $wpdb->prefix . 'notes';
$deleted = $wpdb->delete($table, ['id' => $id]);
if (!$deleted) {
return new WP_Error('not_deleted', 'Не удалось удалить заметку', ['status' => 500]);
}
return rest_ensure_response(['deleted_id' => $id]);
}
function wp24_permission_check() {
return current_user_can('edit_posts');
}
Полезные плагины для работы с REST API в WordPress
Если создавать свой REST API не хочется, можно использовать готовые плагины, которые расширяют стандартный функционал:
- WP REST API Controller — позволяет настраивать видимость полей постов и пользователей в API без кода.
- Advanced Custom Fields to REST API — добавляет поля ACF к ответам REST API.
- REST API Toolbox — расширяет возможности настройки эндпоинтов и безопасности.
Эти плагины помогут ускорить разработку и гибко настраивать REST API без глубоких знаний PHP.
Заключение по созданию собственного REST API в WordPress
Создание собственного REST API в WordPress — это мощный инструмент для интеграции сайта с внешними приложениями, мобильными клиентами или SPA. Главное — правильно регистрировать маршруты, валидировать данные и контролировать доступ. Используйте приведенные примеры для создания своих API и расширения функционала сайта.