WordPress из коробки предоставляет мощный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Но что делать, если стандартного функционала недостаточно и нужно расширить API своими уникальными эндпоинтами? В этой статье мы подробно разберём, как создать собственные REST API маршруты и обработчики в WordPress, чтобы расширить функциональность сайта и интегрировать его с внешними сервисами или мобильными приложениями.
Что такое REST API в WordPress и зачем создавать свои эндпоинты
REST API — это архитектурный стиль, позволяющий работать с ресурсами сайта через HTTP-запросы (GET, POST, PUT, DELETE и другие). В WordPress стандартно доступны эндпоинты для постов, страниц, пользователей и т.д. Однако часто требуется реализовать уникальную логику, например, получить данные из нестандартных таблиц, отправить кастомные команды или выполнить операции, не поддерживаемые стандартным API.
Создание собственных REST API эндпоинтов позволяет:
- Расширить возможности стандартного API;
- Оптимизировать обмен данными с внешними приложениями;
- Реализовать безопасный и удобный доступ к дополнительному функционалу сайта;
- Интегрировать сложную бизнес-логику в API.
Регистрация собственного REST API эндпоинта в WordPress
Для регистрации своего маршрута нужно использовать хук rest_api_init и функцию register_rest_route. Ниже пример создания простого эндпоинта, который возвращает приветственное сообщение.
add_action('rest_api_init', function () {
register_rest_route('wpreset/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpreset_hello_endpoint',
));
});
function wpreset_hello_endpoint(WP_REST_Request $request) {
return array('message' => 'Привет от wpreset.ru!');
}
Здесь:
wpreset/v1— пространство имён и версия API;/hello— маршрут;methods— HTTP-метод (GET в данном случае);callback— функция, вызываемая при обращении.
После добавления кода эндпоинт будет доступен по адресу https://ваш-сайт/wp-json/wpreset/v1/hello.
Обработка параметров запроса и валидация данных
Очень часто необходимо принимать параметры от клиента. Рассмотрим пример, когда в GET-запросе передаётся имя пользователя, и функция возвращает персональное приветствие.
add_action('rest_api_init', function () {
register_rest_route('wpreset/v1', '/greet', array(
'methods' => 'GET',
'callback' => 'wpreset_greet_user',
'args' => array(
'name' => array(
'required' => true,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && !empty($param);
}
),
),
));
});
function wpreset_greet_user(WP_REST_Request $request) {
$name = sanitize_text_field($request->get_param('name'));
return array('message' => "Привет, $name! Добро пожаловать на wpreset.ru");
}
Здесь мы определили обязательный параметр name и функцию валидации, которая проверяет, что параметр — непустая строка. В функции-обработчике параметр очищается и возвращается в ответе.
Создание кастомного эндпоинта для работы с пользовательскими типами записей
Предположим, на сайте есть кастомный тип записи book и нужно получить список книг с возможностью фильтрации по автору.
add_action('rest_api_init', function () {
register_rest_route('wpreset/v1', '/books', array(
'methods' => 'GET',
'callback' => 'wpreset_get_books',
'args' => array(
'author' => array(
'required' => false,
'validate_callback' => 'is_string',
),
),
));
});
function wpreset_get_books(WP_REST_Request $request) {
$author = sanitize_text_field($request->get_param('author'));
$args = array(
'post_type' => 'book',
'posts_per_page' => 10,
);
if ($author) {
$args['meta_query'] = array(
array(
'key' => 'book_author',
'value' => $author,
'compare' => 'LIKE',
),
);
}
$query = new WP_Query($args);
$books = array();
foreach ($query->posts as $post) {
$books[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'author' => get_post_meta($post->ID, 'book_author', true),
);
}
return $books;
}
В этом примере мы получаем параметр author и формируем WP_Query с фильтром. В ответ возвращается массив книг с ID, заголовком и автором.
Безопасность и права доступа к REST API
Важный аспект — ограничение доступа к своим эндпоинтам. Если данные не предназначены для публичного просмотра, нужно проверять права пользователя или использовать nonce.
Пример проверки прав пользователя с ролью администратора:
add_action('rest_api_init', function () {
register_rest_route('wpreset/v1', '/secret-data', array(
'methods' => 'GET',
'callback' => 'wpreset_secret_data',
'permission_callback' => function () {
return current_user_can('manage_options');
},
));
});
function wpreset_secret_data(WP_REST_Request $request) {
return array('secret' => 'Это закрытая информация для администраторов');
}
Если пользователь не имеет нужных прав, API вернёт ошибку 403 Forbidden.
Примеры полезных плагинов для работы с REST API
Для расширения и удобства разработки собственных REST API эндпоинтов можно использовать плагины:
- Clearfy Pro — помогает оптимизировать безопасность и работу API;
- WPCommunity — расширяет возможности работы с пользователями и API;
- WPReset — удобен для восстановления и тестирования API функционала.
Обработка POST-запросов и обновление данных через API
Для создания или обновления данных через API используют метод POST (или PUT). Важно правильно обрабатывать входящие данные, валидировать и обеспечивать безопасность.
Пример создания новой записи типа book через REST API:
add_action('rest_api_init', function () {
register_rest_route('wpreset/v1', '/books', array(
'methods' => 'POST',
'callback' => 'wpreset_create_book',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'author' => array('required' => true),
),
));
});
function wpreset_create_book(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$author = sanitize_text_field($request->get_param('author'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_type' => 'book',
'post_status' => 'publish',
));
if (is_wp_error($post_id)) {
return new WP_Error('cant-create', 'Ошибка создания книги', array('status' => 500));
}
update_post_meta($post_id, 'book_author', $author);
return array('success' => true, 'book_id' => $post_id);
}
Такое расширение позволяет интегрировать WordPress с внешними системами, мобильными приложениями или создавать собственные панели управления.
Отладка и тестирование собственных REST API эндпоинтов
Для тестирования удобны инструменты Postman, Insomnia или даже встроенный браузер для GET-запросов. Важно проверять корректность ответов, обработку ошибок и права доступа.
Рекомендуется использовать WP_DEBUG и логи для отладки, а также проверять, что все пользовательские функции имеют уникальные префиксы (например, wpreset_), чтобы избежать конфликтов с другими плагинами.
Выводы и рекомендации
Создание собственных REST API эндпоинтов в WordPress — мощный инструмент для расширения возможностей сайта. Соблюдайте следующие рекомендации:
- Используйте уникальные пространства имён и префиксы функций для безопасности и удобства поддержки;
- Обязательно валидируйте и очищайте входящие данные;
- Реализуйте проверку прав доступа на уровне эндпоинтов;
- Тестируйте API на разных сценариях;
- Используйте возможности плагинов из WPShop для оптимизации и расширения функционала.
Таким образом, вы сможете создавать гибкие, расширяемые и безопасные решения для любых задач, связанных с интеграцией и автоматизацией в WordPress.