WordPress имеет мощный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Но что если вам нужно создать собственный endpoint, чтобы расширить функциональность сайта или интегрировать его с внешними сервисами? В этом материале мы подробно разберём, как создать свой REST API endpoint в WordPress, как его зарегистрировать, настроить и защитить.
Что такое REST API в WordPress и зачем нужен собственный endpoint
REST API — это интерфейс, который позволяет обращаться к данным сайта через стандартные HTTP-запросы (GET, POST, PUT, DELETE). WordPress из коробки предоставляет множество стандартных endpoints для работы с постами, пользователями, комментариями и т.д. Однако в некоторых случаях этого функционала недостаточно.
Собственный REST API endpoint позволяет:
- создавать уникальные маршруты для получения или отправки данных;
- интегрировать сайт с внешними сервисами, которые требуют особого формата данных;
- организовывать кастомную бизнес-логику на сервере;
- обеспечивать гибкость и расширяемость.
Регистрация собственного REST API endpoint в WordPress
Для регистрации собственного endpoint используется хук rest_api_init и функция register_rest_route. Рассмотрим пример создания простого endpoint, который возвращает список последних 5 постов.
add_action('rest_api_init', 'wpcode_register_custom_endpoint');
function wpcode_register_custom_endpoint() {
register_rest_route('wpcode/v1', '/latest-posts', array(
'methods' => 'GET',
'callback' => 'wpcode_get_latest_posts',
'permission_callback' => '__return_true',
));
}
function wpcode_get_latest_posts(WP_REST_Request $request) {
$args = array(
'numberposts' => 5,
'post_status' => 'publish',
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'link' => get_permalink($post->ID),
);
}
return rest_ensure_response($data);
}В этом коде мы создаём namespace wpcode/v1, а внутри него маршрут /latest-posts. При GET-запросе возвращается JSON с пятью последними опубликованными постами.
Тестирование собственного endpoint
Для проверки можно перейти в браузере по адресу:
https://ваш-сайт.ru/wp-json/wpcode/v1/latest-posts
Вы получите JSON с данными постов. Такой подход отлично подходит для API, к которому не требуется аутентификация.
Добавление параметров запроса и фильтрация данных
Часто нужно принимать параметры в запросе, чтобы фильтровать или сортировать данные. В нашем примере добавим параметр count, который задаёт количество постов.
add_action('rest_api_init', 'wpcode_register_custom_endpoint_with_params');
function wpcode_register_custom_endpoint_with_params() {
register_rest_route('wpcode/v1', '/latest-posts', array(
'methods' => 'GET',
'callback' => 'wpcode_get_latest_posts_with_params',
'permission_callback' => '__return_true',
'args' => array(
'count' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
'default' => 5,
),
),
));
}
function wpcode_get_latest_posts_with_params(WP_REST_Request $request) {
$count = (int) $request->get_param('count');
$args = array(
'numberposts' => $count,
'post_status' => 'publish',
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'link' => get_permalink($post->ID),
);
}
return rest_ensure_response($data);
}Теперь, отправляя запрос https://ваш-сайт.ru/wp-json/wpcode/v1/latest-posts?count=10, вы получите 10 постов (но не больше 20 благодаря валидации).
Защита endpoint: проверка прав доступа и аутентификация
В реальных проектах часто нужно ограничивать доступ к REST API, чтобы предотвратить несанкционированное получение или изменение данных. Для этого используется параметр permission_callback.
Например, разрешим доступ только авторизованным пользователям:
function wpcode_permission_check() {
return is_user_logged_in();
}
register_rest_route('wpcode/v1', '/private-data', array(
'methods' => 'GET',
'callback' => 'wpcode_get_private_data',
'permission_callback' => 'wpcode_permission_check',
));
function wpcode_get_private_data(WP_REST_Request $request) {
$current_user = wp_get_current_user();
return rest_ensure_response(array(
'user_id' => $current_user->ID,
'user_login' => $current_user->user_login,
'message' => 'Это приватные данные',
));
}Такой подход позволяет выполнять аутентификацию через стандартные механизмы WordPress (cookie, nonce). Для внешних приложений можно использовать OAuth, JWT или Basic Auth.
Примеры полезных плагинов для работы с REST API
Для расширения и упрощения работы с REST API можно использовать плагины:
- WP REST API Controller — позволяет управлять доступностью полей и маршрутов через админку без кода.
- JWT Authentication for WP-API — добавляет поддержку JWT-токенов для безопасной аутентификации.
- Advanced Custom Fields (ACF) — с дополнением ACF to REST API позволяет выводить кастомные поля в ответе API.
Эти инструменты помогут быстро настроить API под свои задачи без глубокого погружения в код.
Работа с кастомными типами записей и таксономиями через REST API
Если на сайте есть кастомные типы записей (custom post types) и таксономии, их тоже можно подключить к REST API или создать отдельные endpoints.
Для регистрации кастомного типа записи с поддержкой REST API нужно указать параметр 'show_in_rest' => true:
function wpcode_register_custom_post_type() {
register_post_type('product', array(
'label' => 'Продукты',
'public' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor', 'thumbnail'),
));
}
add_action('init', 'wpcode_register_custom_post_type');После этого стандартные REST API endpoints для продуктов будут доступны по адресу /wp-json/wp/v2/product.
Создание кастомного endpoint для кастомных данных
Можно создать endpoint, который вернёт только продукты с определённым условием, например, по цене (если есть метаполе).
add_action('rest_api_init', 'wpcode_register_products_by_price_endpoint');
function wpcode_register_products_by_price_endpoint() {
register_rest_route('wpcode/v1', '/products-by-price', array(
'methods' => 'GET',
'callback' => 'wpcode_get_products_by_price',
'permission_callback' => '__return_true',
'args' => array(
'min_price' => array(
'validate_callback' => 'is_numeric',
'default' => 0,
),
),
));
}
function wpcode_get_products_by_price(WP_REST_Request $request) {
$min_price = $request->get_param('min_price');
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'price',
'value' => $min_price,
'compare' => '>=',
'type' => 'NUMERIC',
),
),
'posts_per_page' => 10,
);
$query = new WP_Query($args);
$data = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$data[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'price' => get_post_meta(get_the_ID(), 'price', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return rest_ensure_response($data);
}Такой endpoint будет полезен для мобильных приложений или внешних сайтов, которым нужен отфильтрованный список продуктов.