Современные веб-приложения требуют гибкости и возможности взаимодействия между различными системами. В WordPress для этих целей идеально подходит REST API, который позволяет получать и отправлять данные через HTTP-запросы. В этой статье вы узнаете, как в WordPresses создать собственный REST API для плагина, чтобы расширить возможности сайта и интегрировать его с внешними сервисами.
Что такое REST API в WordPress и зачем он нужен
REST API (Representational State Transfer Application Programming Interface) — это интерфейс, который позволяет взаимодействовать с ресурсами сайта при помощи HTTP-запросов. В WordPress он встроен из коробки начиная с версии 4.7 и предоставляет стандартные маршруты для работы с постами, пользователями, таксономиями и другими сущностями.
Однако часто возникает необходимость добавить собственные эндпоинты для работы с уникальными данными плагина. Например, вывести список заказов, управлять пользовательскими настройками или интегрироваться с мобильным приложением.
Настройка REST API в собственном плагине позволяет:
- Создавать и получать данные нестандартных типов;
- Обеспечивать безопасный доступ к функциям плагина;
- Интегрироваться с внешними системами и сервисами;
- Создавать гибкие интерфейсы для AJAX-запросов и SPA.
Регистрация собственного REST API маршрута в WordPresses
Для начала создадим простой плагин, который добавит новый REST API маршрут. Пусть плагин будет называться wordpresses-rest-api-demo.
Основной шаг — регистрация маршрута через хук rest_api_init. Вот базовый пример:
add_action('rest_api_init', 'wordpresses_register_demo_route');
function wordpresses_register_demo_route() {
register_rest_route('wordpresses/v1', '/hello/', array(
'methods' => 'GET',
'callback' => 'wordpresses_demo_hello_callback',
'permission_callback' => '__return_true', // Пока без проверки прав
));
}
function wordpresses_demo_hello_callback(WP_REST_Request $request) {
return array('message' => 'Привет от WordPresses REST API!');
}
Этот код создаст эндпоинт /wp-json/wordpresses/v1/hello/, который вернёт простой JSON с сообщением. Проверить можно, открыв этот URL в браузере.
Объяснение параметров функции register_rest_route
Первый параметр — пространство имён и версия API, чтобы не конфликтовать с другими маршрутами. Второй — путь маршрута. Третий — массив с настройками:
methods— HTTP методы, например, GET, POST, PUT;callback— функция, которая возвращает ответ;permission_callback— функция, проверяющая права доступа. Лучше не оставлять__return_trueв продакшене.
Добавление параметров и валидация запроса
Реальные API обычно принимают параметры, например, фильтры или идентификаторы. В WordPress REST API параметры передаются через URL или тело запроса.
Расширим пример, чтобы принимать параметр name и возвращать персональное приветствие:
add_action('rest_api_init', 'wordpresses_register_greet_route');
function wordpresses_register_greet_route() {
register_rest_route('wordpresses/v1', '/greet/', array(
'methods' => 'GET',
'callback' => 'wordpresses_greet_callback',
'permission_callback' => '__return_true',
'args' => array(
'name' => array(
'required' => false,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && !empty($param);
},
'sanitize_callback' => 'sanitize_text_field',
),
),
));
}
function wordpresses_greet_callback(WP_REST_Request $request) {
$name = $request->get_param('name');
if (!$name) {
$name = 'гость';
}
return array('message' => 'Привет, ' . $name . '! Добро пожаловать в WordPresses REST API.');
}
Теперь запрос /wp-json/wordpresses/v1/greet?name=Иван вернёт персональное приветствие.
Разрешения и безопасность: permission_callback
Очень важно ограничить доступ к REST API, особенно если он управляет изменением данных или возвращает конфиденциальную информацию. В WordPresses для проверки прав часто используют current_user_can().
Например, чтобы разрешить доступ только администраторам:
function wordpresses_permission_check() {
return current_user_can('manage_options');
}
register_rest_route('wordpresses/v1', '/admin-data/', array(
'methods' => 'GET',
'callback' => 'wordpresses_admin_data_callback',
'permission_callback' => 'wordpresses_permission_check',
));
Без выполнения условия пользователь получит ошибку 403 Forbidden.
Пример: создание REST API для пользовательских данных плагина
Предположим, у нас есть плагин, который сохраняет отзывы пользователей в собственной таблице. Создадим REST API для получения и добавления отзывов.
Пример структуры таблицы wp_wordpresses_reviews:
id— идентификатор;user_name— имя пользователя;review_text— текст отзыва;created_at— дата создания.
Регистрация маршрутов:
add_action('rest_api_init', function () {
register_rest_route('wordpresses/v1', '/reviews/', array(
'methods' => 'GET',
'callback' => 'wordpresses_get_reviews',
'permission_callback' => '__return_true',
));
register_rest_route('wordpresses/v1', '/reviews/', array(
'methods' => 'POST',
'callback' => 'wordpresses_add_review',
'permission_callback' => '__return_true',
'args' => array(
'user_name' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
),
'review_text' => array(
'required' => true,
'sanitize_callback' => 'sanitize_textarea_field',
),
),
));
});
function wordpresses_get_reviews() {
global $wpdb;
$table = $wpdb->prefix . 'wordpresses_reviews';
$results = $wpdb->get_results("SELECT user_name, review_text, created_at FROM $table ORDER BY created_at DESC", ARRAY_A);
return $results;
}
function wordpresses_add_review(WP_REST_Request $request) {
global $wpdb;
$table = $wpdb->prefix . 'wordpresses_reviews';
$user_name = $request->get_param('user_name');
$review_text = $request->get_param('review_text');
$inserted = $wpdb->insert($table, array(
'user_name' => $user_name,
'review_text' => $review_text,
'created_at' => current_time('mysql'),
));
if ($inserted) {
return new WP_REST_Response(array('success' => true, 'message' => 'Отзыв добавлен'), 201);
} else {
return new WP_REST_Response(array('success' => false, 'message' => 'Ошибка при добавлении отзыва'), 500);
}
}
Таким образом, можно через HTTP GET получить все отзывы, а через POST добавить новый. Для реального плагина нужно добавить проверки, аутентификацию и защиту от спама.
Используем популярные плагины для расширения REST API
Если не хочется писать код с нуля, можно использовать готовые решения:
- WP REST API Controller — позволяет управлять доступом и видимостью REST API для различных типов данных без программирования.
- Advanced Custom Fields (ACF) to REST API — расширяет стандартный REST API, добавляя поля ACF к ответам.
- JWT Authentication for WP REST API — добавляет поддержку аутентификации через JWT токены для безопасного взаимодействия.
Эти плагины помогут быстро организовать API с минимальными усилиями и обеспечат базовую безопасность.
Тестирование и отладка собственного REST API WordPresses
Для тестирования REST API удобно использовать инструменты:
- Postman — мощный клиент для отправки HTTP-запросов с удобным интерфейсом;
- curl — консольный инструмент для быстрого теста;
- REST API Console — плагины и расширения браузера для удобной проверки API.
При разработке стоит внимательно смотреть логи сервера, а для отладки можно использовать error_log() или WP_DEBUG.
Заключение
Создание REST API в собственном плагине WordPresses открывает широкие возможности для расширения функционала сайта и интеграции с внешними сервисами. Важно правильно организовать маршруты, обеспечить безопасность и валидировать входящие данные. Используйте встроенные функции WordPress для упрощения разработки и не забывайте тестировать API на реальных сценариях.