WordPress с версии 4.7 имеет встроенный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Это открывает огромные возможности для интеграций, создания SPA (Single Page Application), мобильных приложений и кастомных админ-панелей. В этой статье мы подробно разберём, как создавать собственные REST API эндпоинты в WordPress, чтобы расширять функциональность вашего сайта и взаимодействовать с ним программно.
Что такое REST API в WordPress и зачем создавать свои эндпоинты
REST API — это архитектурный стиль взаимодействия, где клиент (браузер, приложение) отправляет HTTP-запросы к серверу, а сервер отвечает JSON-данными. В WordPress уже есть множество готовых эндпоинтов для работы с постами, страницами, пользователями и так далее. Но часто возникает необходимость расширить API под свою задачу — например, получить данные из кастомных таблиц, реализовать авторизацию по токену или вернуть агрегированную информацию.
Создание собственных эндпоинтов позволяет:
- Безопасно и удобно передавать данные между фронтендом и бэкендом;
- Интегрировать WordPress с внешними сервисами;
- Создавать мобильные приложения и SPA на базе данных WordPress;
- Автоматизировать задачи и создавать кастомные панели управления.
Далее мы рассмотрим, как именно это сделать.
Регистрация собственного REST API эндпоинта в WordPress
Для регистрации нового эндпоинта используется функция register_rest_route. Она вызывается в хуке rest_api_init. Вот минимальный пример из файла functions.php или собственного плагина:
add_action('rest_api_init', 'wpupdate_register_custom_endpoint');
function wpupdate_register_custom_endpoint() {
register_rest_route('wpupdate/v1', '/hello/', array(
'methods' => 'GET',
'callback' => 'wpupdate_hello_endpoint'
));
}
function wpupdate_hello_endpoint(WP_REST_Request $request) {
return array('message' => 'Привет от wpupdate.ru!');
}Объяснение кода:
- Используем пространство имён
wpupdate/v1для версии и уникальности маршрутов; - Эндпоинт будет доступен по URL
/wp-json/wpupdate/v1/hello/; - Метод — GET, то есть запросы на получение данных;
- Функция-обработчик возвращает массив, который WordPress конвертирует в JSON.
Этот пример отлично подходит для начала. Попробуйте открыть в браузере https://ваш-сайт/wp-json/wpupdate/v1/hello/ и увидите JSON-ответ.
Работа с параметрами запроса и валидация данных
Часто нужно принимать параметры от клиента. Их можно определить в args при регистрации маршрута. Также важна валидация и санитизация, чтобы избежать ошибок и уязвимостей.
Пример эндпоинта, принимающего параметр name и возвращающего персональное приветствие:
add_action('rest_api_init', 'wpupdate_register_greet_endpoint');
function wpupdate_register_greet_endpoint() {
register_rest_route('wpupdate/v1', '/greet/', array(
'methods' => 'GET',
'callback' => 'wpupdate_greet_user',
'args' => array(
'name' => array(
'required' => true,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && strlen($param) > 0;
},
'sanitize_callback' => 'sanitize_text_field'
)
)
));
}
function wpupdate_greet_user(WP_REST_Request $request) {
$name = $request->get_param('name');
return array('message' => 'Привет, ' . $name . '! Добро пожаловать на wpupdate.ru');
}Здесь мы требуем, чтобы параметр name был строкой и не пустым, а затем используем его в ответе. Если параметр не передать или он не пройдет валидацию, WordPress вернёт ошибку 400.
Создание эндпоинта для записи данных: пример POST запроса
REST API позволяет не только получать, но и отправлять данные. Для этого используем метод POST. Рассмотрим пример, где мы сохраняем простой пользовательский отзыв, используя опцию WordPress.
add_action('rest_api_init', 'wpupdate_register_feedback_endpoint');
function wpupdate_register_feedback_endpoint() {
register_rest_route('wpupdate/v1', '/feedback/', array(
'methods' => 'POST',
'callback' => 'wpupdate_save_feedback',
'args' => array(
'user' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field'
),
'message' => array(
'required' => true,
'sanitize_callback' => 'sanitize_textarea_field'
)
),
'permission_callback' => function() {
return current_user_can('edit_posts'); // Проверяем права
}
));
}
function wpupdate_save_feedback(WP_REST_Request $request) {
$user = $request->get_param('user');
$message = $request->get_param('message');
$all_feedback = get_option('wpupdate_feedback_list', array());
$all_feedback[] = array('user' => $user, 'message' => $message, 'date' => current_time('mysql'));
update_option('wpupdate_feedback_list', $all_feedback);
return array('success' => true, 'message' => 'Отзыв сохранён.');
}Ключевые моменты:
- Используем метод POST для отправки данных;
- Определяем необходимые параметры и их санитизацию;
- Включаем проверку прав доступа с помощью
permission_callback; - Сохраняем данные в опцию WordPress, имитируя базу отзывов.
Такой подход можно расширять, сохранять данные в кастомных таблицах или CPT.
Обработка ошибок и кастомные коды статусов
В REST API важно корректно обрабатывать ошибки. Если что-то пошло не так — нужно возвращать понятный ответ с HTTP статусом.
Пример возврата ошибки из обработчика:
function wpupdate_save_feedback(WP_REST_Request $request) {
$user = $request->get_param('user');
$message = $request->get_param('message');
if (empty($message)) {
return new WP_Error('empty_message', 'Сообщение не может быть пустым', array('status' => 422));
}
// Сохраняем отзыв
return array('success' => true);
}WordPress автоматически конвертирует объект WP_Error в JSON и поставит HTTP статус, указанный в параметрах.
Практические советы по безопасности REST API
При создании собственных эндпоинтов важно заботиться о безопасности:
- Используйте
permission_callbackдля ограничения доступа. Например, для публичных данных можно вернуть__return_true, а для приватных — проверять права пользователя; - Всегда валидируйте и санитизируйте входящие данные;
- Избегайте раскрытия лишних данных, особенно пользовательских и системных;
- Если требуется аутентификация, используйте стандартные методы WordPress (cookie, nonce) или JWT/Basic Auth с плагинами;
- Тестируйте API на предмет возможных уязвимостей, например, SQL-инъекций или XSS.
Пример интеграции собственного REST API с JavaScript на фронтенде
Чтобы использовать созданный эндпоинт на фронтенде, можно отправлять запросы через fetch. Пример запроса к нашему первому эндпоинту:
fetch('/wp-json/wpupdate/v1/hello/')
.then(response => response.json())
.then(data => console.log(data.message));Для POST-запроса с отзывом:
fetch('/wp-json/wpupdate/v1/feedback/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': wpApiSettings.nonce // Обязательно передавайте nonce для авторизации
},
body: JSON.stringify({ user: 'Иван', message: 'Отличный сайт!' })
})
.then(res => res.json())
.then(data => console.log(data));<Для передачи nonce можно использовать функцию wp_localize_script в PHP, чтобы передать его в JS.
Выводы и рекомендации
Создание собственных REST API эндпоинтов в WordPress — мощный инструмент, который позволяет строить современные и гибкие решения на базе привычной CMS. Главное — внимательно относиться к безопасности, валидации данных и поддержке версий API.
Начинайте с простых GET-запросов, постепенно добавляйте сложную логику и методы, и вы быстро сможете интегрировать WordPress с любыми внешними сервисами или строить уникальные пользовательские интерфейсы.
Если хотите глубже разобраться, рекомендую официальную документацию WordPress REST API и изучить исходники стандартных эндпоинтов — это даст понимание архитектуры и лучших практик.