WordPress REST API предоставляет мощный и гибкий способ взаимодействия с сайтом через HTTP-запросы. Для разработчиков плагинов знание REST API открывает новые возможности по расширению функционала и интеграции с внешними сервисами. В этой статье мы подробно разберём, как использовать REST API в WordPress для создания своих плагинов, рассмотрим примеры регистрации собственных маршрутов, обработчиков и работу с данными.
Что такое REST API в WordPress и зачем он нужен
REST API — это интерфейс взаимодействия, который позволяет отправлять и получать данные с сайта WordPress с помощью стандартных HTTP методов (GET, POST, PUT, DELETE). Он необходим для построения современных SPA-приложений, мобильных приложений, а также для интеграции с внешними системами.
В контексте разработки плагинов REST API позволяет:
- Создавать собственные эндпоинты для работы с данными плагина.
- Обеспечивать взаимодействие с фронтендом без перезагрузок страниц.
- Расширять стандартный функционал WordPress удобным и безопасным способом.
Без понимания REST API сложно создавать современные и эффективные расширения.
Регистрация собственного REST API маршрута в плагине
Для начала разберёмся, как зарегистрировать свой маршрут. Предположим, мы создаём плагин, который хранит и выдаёт список полезных советов.
В файле плагина добавим следующий код:
add_action('rest_api_init', 'wpscan_register_tips_route');
function wpscan_register_tips_route() {
register_rest_route('wpscan/v1', '/tips', array(
'methods' => 'GET',
'callback' => 'wpscan_get_tips',
'permission_callback' => '__return_true', // Сделаем публичным
));
}
function wpscan_get_tips(WP_REST_Request $request) {
$tips = array(
array('id' => 1, 'text' => 'Регулярно обновляйте WordPress и плагины.'),
array('id' => 2, 'text' => 'Используйте сложные пароли для всех пользователей.'),
array('id' => 3, 'text' => 'Ограничивайте количество попыток входа в админку.'),
);
return rest_ensure_response($tips);
}Этот код создаёт маршрут /wp-json/wpscan/v1/tips, который возвращает список советов в формате JSON. Метод wpscan_get_tips формирует массив данных и возвращает его через функцию rest_ensure_response.
Объяснение параметров register_rest_route
register_rest_route принимает три параметра:
- пространство имён: здесь
wpscan/v1— версия API и уникальный префикс. - маршрут: строка пути, в данном случае
/tips. - массив аргументов: указываем HTTP методы, функцию-обработчик и callback для проверки прав.
Для проверки прав тут стоит использовать более надёжные методы, мы применили __return_true для простоты, но в продакшене надо защитить эндпоинты.
Обработка POST-запросов и получение данных с клиента
Давайте расширим плагин, чтобы принимать новые советы через POST-запрос.
add_action('rest_api_init', 'wpscan_register_add_tip_route');
function wpscan_register_add_tip_route() {
register_rest_route('wpscan/v1', '/tips', array(
'methods' => 'POST',
'callback' => 'wpscan_add_tip',
'permission_callback' => function() {
return current_user_can('edit_posts'); // Только авторизованные с правом редактирования
},
'args' => array(
'text' => array(
'required' => true,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && !empty($param);
}
),
),
));
}
function wpscan_add_tip(WP_REST_Request $request) {
$text = sanitize_text_field($request->get_param('text'));
// Здесь логика сохранения в базу, для примера просто возвращаем
return rest_ensure_response(array('status' => 'success', 'message' => 'Совет добавлен', 'tip' => $text));
}Теперь ваш плагин может принимать данные text через POST, проверять права пользователя и валидировать входящие данные.
Важно всегда использовать функции санитайзинга, например sanitize_text_field, чтобы избежать XSS и других уязвимостей.
Пример интеграции REST API с JavaScript фронтендом
Для демонстрации, как с фронтенда обращаться к нашим маршрутам, приведём пример на jQuery:
jQuery(document).ready(function($) {
// Получаем список советов
$.getJSON('/wp-json/wpscan/v1/tips', function(data) {
data.forEach(function(tip) {
$('#tips-list').append('<li>' + tip.text + '</li>');
});
});
// Отправляем новый совет
$('#add-tip-form').on('submit', function(e) {
e.preventDefault();
var tipText = $('#tip-text').val();
$.ajax({
url: '/wp-json/wpscan/v1/tips',
method: 'POST',
data: {text: tipText},
beforeSend: function(xhr) {
xhr.setRequestHeader('X-WP-Nonce', wpscanApi.nonce);
},
success: function(response) {
alert(response.message);
$('#tip-text').val('');
},
error: function() {
alert('Ошибка при добавлении совета');
}
});
});
});Обратите внимание, что для POST-запросов требуется nonce (число, используемое один раз) для безопасности. Не забудьте локализовать скрипт в PHP и передать nonce:
wp_localize_script('wpscan-script', 'wpscanApi', array(
'nonce' => wp_create_nonce('wp_rest')
));Обеспечение безопасности REST API в собственных маршрутах
Безопасность — ключевой момент при работе с REST API. Важно:
- Использовать
permission_callbackдля проверки прав доступа. - Проводить валидацию и санитайзинг входящих данных.
- Использовать Nonce или авторизацию через OAuth/Basic Auth для защищённых запросов.
Например, чтобы ограничить доступ к маршруту только администраторам, можно применить:
'permission_callback' => function() {
return current_user_can('administrator');
}Это гарантирует, что только администраторы смогут получить или изменить данные через API.
Полезные плагины для работы с REST API
Для удобства разработки и тестирования есть несколько плагинов, которые помогут:
- WP REST API Controller — позволяет управлять доступом к REST API через интерфейс.
- REST API Toolbox — добавляет дополнительные возможности настройки и расширения API.
- Postman (внешний инструмент) — популярный клиент для тестирования API-запросов.
Используйте эти инструменты для ускорения разработки и отладки.
Заключение
WordPress REST API открывает широкие возможности для создания современных плагинов и интеграций. Используя зарегистрированные маршруты, правильную обработку данных и обеспечивая безопасность, вы сможете создавать мощные и гибкие расширения для вашего сайта. Практическое применение REST API — важный навык для каждого разработчика WordPress.