WordPress изначально поддерживает REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Однако часто возникает необходимость создать собственный REST API endpoint для решения специфичных задач — например, получения или изменения данных, которые не доступны через стандартные маршруты API. В этой статье мы подробно разберем, как создать и использовать кастомный REST API endpoint в WordPress с примерами кода, которые можно легко адаптировать под свои нужды.
Что такое REST API endpoint в WordPress и зачем он нужен
REST API endpoint — это URL-адрес, по которому можно отправлять запросы и получать определенные данные с сайта. WordPress имеет множество встроенных маршрутов, например, для постов, пользователей и так далее. Но если вам нужно расширить функциональность, например, получить данные из пользовательского поля, выполнять сложную фильтрацию или создавать уникальные ответы, стандартных маршрутов может не хватить.
Создание собственного endpoint позволяет:
- Обеспечить доступ к кастомным данным сайта.
- Автоматизировать обмен данными с внешними сервисами.
- Упростить работу мобильных приложений или SPA (Single Page Application), которые используют WordPress как бекенд.
В итоге, REST API — мощный инструмент для интеграции и расширения функционала WordPress.
Создаем первый кастомный REST API endpoint на wpbono
Для начала создадим простой endpoint, который будет возвращать приветственное сообщение. Для этого добавим код в файл functions.php вашей темы или в отдельный плагин.
add_action('rest_api_init', 'wpbono_register_hello_endpoint');
function wpbono_register_hello_endpoint() {
register_rest_route('wpbono/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpbono_hello_callback',
'permission_callback' => '__return_true',
));
}
function wpbono_hello_callback() {
return array('message' => 'Привет от wpbono REST API!');
}Объяснение кода:
rest_api_init— хук для регистрации новых маршрутов API.register_rest_route— функция для создания маршрута. В нашем случае маршрут будет/wp-json/wpbono/v1/hello.methods— HTTP-метод, который поддерживает endpoint, здесь GET.callback— функция-обработчик запроса.permission_callback— проверка прав доступа. Здесь разрешаем всем.
Теперь, если вы перейдете по адресу https://ваш-сайт.ru/wp-json/wpbono/v1/hello, получите JSON с сообщением.
Принимаем параметры в REST API endpoint и фильтрация данных
Обычно API-запросы требуют передачи параметров, например, ID записи или фильтров. Добавим пример, где endpoint принимает параметр post_id и возвращает заголовок и содержание поста.
add_action('rest_api_init', 'wpbono_register_post_data_endpoint');
function wpbono_register_post_data_endpoint() {
register_rest_route('wpbono/v1', '/post-data', array(
'methods' => 'GET',
'callback' => 'wpbono_post_data_callback',
'args' => array(
'post_id' => array(
'required' => true,
'validate_callback' => 'is_numeric'
),
),
'permission_callback' => '__return_true',
));
}
function wpbono_post_data_callback(WP_REST_Request $request) {
$post_id = intval($request->get_param('post_id'));
$post = get_post($post_id);
if (!$post) {
return new WP_Error('not_found', 'Пост не найден', array('status' => 404));
}
return array(
'ID' => $post->ID,
'title' => get_the_title($post),
'content' => apply_filters('the_content', $post->post_content),
);
}Здесь:
args— описывает ожидаемые параметры с их валидацией.- В функции-обработчике проверяем, существует ли пост с переданным ID и возвращаем ошибку, если нет.
Такой подход позволяет гибко принимать параметры и безопасно обрабатывать запросы.
Добавление и обновление данных через POST-запросы
REST API позволяет не только получать данные, но и создавать или обновлять их. Рассмотрим пример создания новой записи через POST-запрос.
add_action('rest_api_init', 'wpbono_register_create_post_endpoint');
function wpbono_register_create_post_endpoint() {
register_rest_route('wpbono/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wpbono_create_post_callback',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field'
),
'content' => array(
'required' => true,
'sanitize_callback' => 'wp_kses_post'
),
),
));
}
function wpbono_create_post_callback(WP_REST_Request $request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => 'post',
'post_author' => get_current_user_id(),
));
if (is_wp_error($post_id)) {
return new WP_Error('insert_failed', 'Ошибка создания поста', array('status' => 500));
}
return array('success' => true, 'post_id' => $post_id);
}Ключевые моменты:
- Метод запроса — POST.
- Проверка прав — только авторизованные пользователи с правом
edit_postsмогут создавать записи. - Обработка и очистка входящих данных для предотвращения уязвимостей.
- Возвращается ID созданного поста или ошибка.
Популярные плагины для работы с REST API в WordPress
Хотя WordPress предоставляет мощный встроенный REST API, некоторые задачи проще решить с помощью специализированных плагинов:
- WP REST API Controller — позволяет настраивать доступность полей, маршрутов и прав без написания кода.
- Advanced Custom Fields (ACF) to REST API — расширяет стандартный API, добавляя поля ACF в ответы.
- JWT Authentication for WP REST API — добавляет авторизацию через JSON Web Tokens, что удобно для мобильных приложений и SPA.
Использование этих плагинов может значительно упростить настройку и безопасность REST API.
Советы по безопасности при работе с REST API
REST API открывает ворота для внешнего взаимодействия с сайтом, поэтому важно соблюдать меры безопасности:
- Всегда проверяйте права доступа в
permission_callback. Не делайте endpoint доступным для всех, если он изменяет данные. - Валидация и санитизация входящих данных — обязательны для защиты от инъекций и XSS.
- Используйте аутентификацию: OAuth, JWT или cookie-based, чтобы убедиться, что запрос делает авторизованный пользователь.
- Ограничивайте количество запросов с помощью rate limiting или внешних сервисов, чтобы избежать DDoS.
Пример комплексного кастомного REST API endpoint для wpbono
Допустим, нужно создать endpoint, который возвращает список последних 5 опубликованных постов с определенным пользовательским полем _wpbono_custom_flag равным true. Такой endpoint может выглядеть так:
add_action('rest_api_init', 'wpbono_register_flagged_posts_endpoint');
function wpbono_register_flagged_posts_endpoint() {
register_rest_route('wpbono/v1', '/flagged-posts', array(
'methods' => 'GET',
'callback' => 'wpbono_flagged_posts_callback',
'permission_callback' => '__return_true',
));
}
function wpbono_flagged_posts_callback(WP_REST_Request $request) {
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'meta_query' => array(
array(
'key' => '_wpbono_custom_flag',
'value' => '1',
'compare' => '=',
),
),
'post_status' => 'publish',
);
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'ID' => get_the_ID(),
'title' => get_the_title(),
'excerpt' => get_the_excerpt(),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return $posts;
}Такой endpoint полезен для получения специфичных данных с сайта по REST API без лишней нагрузки и с удобным форматом вывода.