WordPress REST API — мощный инструмент для взаимодействия с сайтом через HTTP-запросы. Он позволяет получать данные, создавать, обновлять и удалять записи и многое другое. Однако стандартный набор эндпоинтов не всегда покрывает уникальные задачи, с которыми сталкиваются разработчики. В этой статье мы подробно разберём, как создать кастомные REST API эндпоинты в WordPress, чтобы расширить функциональность вашего сайта и интегрировать его с внешними системами.
Почему стоит создавать собственные REST API эндпоинты в WordPress
Стандартный REST API WordPress предоставляет доступ к таким сущностям, как записи, страницы, пользователи и таксономии. Но что делать, если нужно вывести нестандартные данные, например, данные из метаполей, собственных таблиц базы данных или объединить несколько запросов в один эндпоинт?
Создание кастомных эндпоинтов позволяет:
- Оптимизировать работу фронтенда, получая только необходимые данные в одном запросе.
- Интегрировать сайт с мобильными приложениями или внешними сервисами.
- Добавлять бизнес-логику и проверку прав доступа на уровне API.
Далее рассмотрим, как правильно зарегистрировать собственный эндпоинт и обработать запросы.
Регистрация кастомного REST API эндпоинта в WordPress
Для регистрации нового эндпоинта используется функция register_rest_route(), которая вызывается на хуке rest_api_init. Вот базовый пример регистрации эндпоинта, который возвращает приветственное сообщение.
add_action('rest_api_init', 'wparticles_register_hello_endpoint');
function wparticles_register_hello_endpoint() {
register_rest_route('wparticles/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wparticles_hello_callback',
'permission_callback' => '__return_true',
));
}
function wparticles_hello_callback(WP_REST_Request $request) {
return array('message' => 'Привет от WParticles!');
}В этом примере мы создали эндпоинт /wp-json/wparticles/v1/hello, который возвращает JSON с сообщением. Обратите внимание на параметр permission_callback — он отвечает за проверку прав доступа к эндпоинту. Сейчас стоит __return_true, то есть эндпоинт доступен всем.
Такой подход — основа для создания более сложных API.
Обработка параметров запроса и валидация данных
Часто нужно передавать параметры в API и валидировать их. Рассмотрим пример, когда эндпоинт принимает параметр post_id и возвращает заголовок и содержимое записи.
add_action('rest_api_init', 'wparticles_register_post_info_endpoint');
function wparticles_register_post_info_endpoint() {
register_rest_route('wparticles/v1', '/post-info', array(
'methods' => 'GET',
'callback' => 'wparticles_post_info_callback',
'permission_callback' => function() {
return current_user_can('read');
},
'args' => array(
'post_id' => array(
'required' => true,
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0;
}
)
),
));
}
function wparticles_post_info_callback(WP_REST_Request $request) {
$post_id = (int) $request->get_param('post_id');
$post = get_post($post_id);
if (!$post) {
return new WP_Error('no_post', 'Пост не найден', array('status' => 404));
}
return array(
'title' => get_the_title($post),
'content' => apply_filters('the_content', $post->post_content),
);
}Здесь мы добавили аргумент post_id, который обязателен и должен быть положительным числом. В permission_callback ограничили доступ только для авторизованных пользователей с правом read.
Такой механизм позволяет защитить данные и избежать ошибок при получении некорректных параметров.
Создание POST-запроса для добавления данных через REST API
Переходим к более сложному примеру — созданию записи через POST-запрос в кастомом эндпоинте. Рассмотрим, как принять данные, проверить их и создать запись типа «продукт».
add_action('rest_api_init', 'wparticles_register_create_product_endpoint');
function wparticles_register_create_product_endpoint() {
register_rest_route('wparticles/v1', '/create-product', array(
'methods' => 'POST',
'callback' => 'wparticles_create_product_callback',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array(
'required' => true,
'validate_callback' => function($param) {
return is_string($param) && !empty($param);
}
),
'price' => array(
'required' => true,
'validate_callback' => function($param) {
return is_numeric($param) && $param >= 0;
}
),
),
));
}
function wparticles_create_product_callback(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$price = floatval($request->get_param('price'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_type' => 'product',
'post_status' => 'publish',
));
if (is_wp_error($post_id)) {
return new WP_Error('cannot_create', 'Не удалось создать продукт', array('status' => 500));
}
update_post_meta($post_id, 'price', $price);
return array('success' => true, 'product_id' => $post_id);
}Обратите внимание, что мы проверяем права пользователя и валидируем входные данные. Если всё успешно, создаём запись и сохраняем цену в метаполе.
Советы по безопасности и производительности для кастомных REST API эндпоинтов
Создавая свои REST API, важно помнить о безопасности и производительности:
- Проверяйте права доступа: всегда используйте
permission_callbackдля ограничения доступа к эндпоинтам. - Валидация и санитизация: проверяйте и очищайте все данные, поступающие от клиента, чтобы избежать SQL-инъекций и XSS-атак.
- Кэшируйте часто запрашиваемые данные: чтобы снизить нагрузку на сервер, используйте transient API или внешние кэширующие решения.
- Обрабатывайте ошибки корректно: возвращайте понятные сообщения об ошибках и правильные HTTP-коды.
Соблюдение этих рекомендаций сделает ваш API надежным и удобным в использовании.
Полезные плагины для работы с REST API в WordPress
Для упрощения работы с REST API можно использовать следующие плагины:
- WP REST API Controller — позволяет управлять видимостью полей и эндпоинтов через админку.
- Advanced Custom Fields to REST API — добавляет поля ACF в стандартный REST API.
- JWT Authentication for WP REST API — реализует аутентификацию по JWT для защиты API.
Эти инструменты помогут быстро настроить и расширить возможности вашего API без глубокого погружения в код.
Итоговые рекомендации для разработчиков
Создание кастомных REST API эндпоинтов в WordPress — это мощный способ расширить функциональность сайта и интегрировать его с любыми внешними сервисами. Используйте приведённые примеры как шаблон, адаптируйте под свои задачи, не забывая про безопасность и валидацию данных.
Если вы только начинаете работать с REST API, рекомендую изучить официальную документацию WordPress и практиковаться на простых примерах, постепенно усложняя задачи.