WordPress уже включает мощный REST API, который позволяет взаимодействовать с сайтом извне. Но иногда стандартных эндпоинтов недостаточно, и возникает необходимость создать собственный REST API endpoint для решения конкретных задач. В этой статье расскажу, как это сделать правильно, с примерами кода, учетом безопасности и полезными советами.
Что такое REST API endpoint в WordPress и зачем он нужен
REST API endpoint — это точка доступа, к которой можно отправлять HTTP-запросы (GET, POST, PUT, DELETE) для получения или изменения данных. Создание собственного endpoint полезно для интеграции с внешними сервисами, создания мобильных приложений, кастомных админ-панелей и интерактивных фронтенд-решений.
Стандартный REST API WordPress предоставляет множество эндпоинтов для работы с постами, пользователями, комментариями, но если вам нужна нестандартная логика — придется создавать свой.
Создание собственного REST API endpoint в WordPress: шаг за шагом
Регистрация маршрута (route) и обработчика
Для начала нужно зарегистрировать новый route с помощью функции register_rest_route(). Регистрировать маршруты нужно в хуке rest_api_init. Пример регистрации:
add_action('rest_api_init', 'wppartner_register_custom_endpoint');
function wppartner_register_custom_endpoint() {
register_rest_route('wppartner/v1', '/data/', array(
'methods' => 'GET',
'callback' => 'wppartner_get_custom_data',
'permission_callback' => '__return_true', // пока без проверки прав
));
}
Здесь мы создаем endpoint по адресу /wp-json/wppartner/v1/data/, который принимает запросы GET и вызывает функцию wppartner_get_custom_data.
Создание обработчика запроса
Обработчик должен возвращать данные в формате, поддерживаемом REST API (массивы или объекты, которые WordPress преобразует в JSON). Пример простой функции:
function wppartner_get_custom_data(WP_REST_Request $request) {
$data = array(
'message' => 'Привет от собственного REST API!',
'time' => current_time('mysql'),
);
return rest_ensure_response($data);
}
Функция получает объект запроса, откуда можно взять параметры, заголовки и пр.
Обработка параметров и валидация
Часто нужно принимать параметры запроса, например фильтры или id. Для этого в register_rest_route указывается args с описанием параметров и их валидацией:
register_rest_route('wppartner/v1', '/posts/', array(
'methods' => 'GET',
'callback' => 'wppartner_get_posts',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => function($param, $request, $key) {
return is_string($param);
}
),
'limit' => array(
'required' => false,
'default' => 5,
'sanitize_callback' => 'absint',
),
),
'permission_callback' => '__return_true',
));
В обработчике можно получить параметры так:
function wppartner_get_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$limit = $request->get_param('limit');
// Логика выборки постов с учетом параметров
}
Обеспечение безопасности REST API endpoint
Очень важно ограничить доступ к вашему endpoint, если там чувствительные данные. Для этого в permission_callback можно указать функцию проверки прав, например:
function wppartner_check_permission() {
return current_user_can('edit_posts');
}
register_rest_route('wppartner/v1', '/private-data/', array(
'methods' => 'GET',
'callback' => 'wppartner_get_private_data',
'permission_callback' => 'wppartner_check_permission',
));
Также можно проверить nonce или API ключи в заголовках.
Пример: собственный endpoint для получения списка постов по категории
Регистрация маршрута:
add_action('rest_api_init', function() {
register_rest_route('wppartner/v1', '/posts-by-category/', array(
'methods' => 'GET',
'callback' => 'wppartner_get_posts_by_category',
'args' => array(
'category' => array(
'required' => true,
'validate_callback' => function($param) {
return is_string($param) && !empty($param);
}
),
'limit' => array(
'required' => false,
'default' => 10,
'sanitize_callback' => 'absint',
),
),
'permission_callback' => '__return_true',
));
});
Обработчик:
function wppartner_get_posts_by_category(WP_REST_Request $request) {
$category_slug = $request->get_param('category');
$limit = $request->get_param('limit');
$args = array(
'post_type' => 'post',
'posts_per_page' => $limit,
'category_name' => $category_slug,
'post_status' => 'publish',
);
$query = new WP_Query($args);
$posts = array();
foreach ($query->posts as $post) {
$posts[] = array(
'id' => $post->ID,
'title' => get_the_title($post),
'excerpt' => get_the_excerpt($post),
'link' => get_permalink($post),
);
}
return rest_ensure_response($posts);
}
Полезные плагины для работы с REST API в WordPress
Хотя создание собственных endpoint несложно, бывают ситуации, когда полезны плагины для расширения возможностей:
- Clearfy Pro — улучшает безопасность и оптимизацию сайта, в том числе для REST API.
- ABC Pagination — удобная пагинация для REST API запросов с постами.
- WPCommunity — если нужно расширять API для соцсетевых функций внутри WordPress.
Отладка и тестирование собственного REST API endpoint
Для проверки работы endpoint используйте:
- Postman или аналогичные REST клиенты — удобно отправлять запросы и смотреть ответы.
- Встроенный в браузер инструментарий разработчика — вкладка Network.
- Плагин WPRemark — позволяет добавлять комментарии и заметки по API прямо в админке.
При отладке обращайте внимание на HTTP коды ответа, структуру JSON, и сообщения об ошибках.
Советы по производительности и безопасности
Создавая собственные endpoint, старайтесь:
- Минимизировать объем возвращаемых данных — отдавайте только то, что реально нужно.
- Кэшировать результаты сложных запросов, например с помощью Transients API.
- Использовать nonce и проверки прав пользователя в
permission_callback. - Ограничивать количество запросов с одного IP, чтобы избежать DDoS.
Это позволит сделать API быстрым и надежным.