WordPress с версии 4.7 имеет встроенный REST API, который позволяет легко создавать, получать, обновлять и удалять данные через HTTP-запросы. Но что делать, если стандартного функционала недостаточно и нужно создать собственный REST API, который будет работать с вашими уникальными данными? В этой статье мы подробно разберём, как на практике создать собственный REST API в WordPress, используя хуки и регистрируя новые маршруты.
Что такое REST API в WordPress и зачем создавать свой
REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия клиент-сервер, который позволяет отправлять запросы и получать данные в формате JSON. WordPress уже имеет множество стандартных REST маршрутов, например, для постов, страниц, пользователей и так далее.
Однако часто возникает ситуация, когда нужно реализовать API для кастомных задач — например, для работы с кастомными типами записей, метаданными или интеграцией с внешними сервисами. Создание собственного REST API позволяет:
- Контролировать структуру и доступность данных;
- Добавлять собственную бизнес-логику;
- Обеспечивать безопасность и аутентификацию;
- Оптимизировать взаимодействие между фронтендом и бэкендом.
Далее мы рассмотрим, как это сделать на примере простого плагина.
Регистрация собственного REST маршрута в WordPress
Для регистрации собственного маршрута REST API в WordPress нужно использовать хук rest_api_init и функцию register_rest_route(). Ниже приведён пример, как это сделать в вашем плагине или в файле functions.php темы.
add_action('rest_api_init', 'wpcodex_register_custom_route');
function wpcodex_register_custom_route() {
register_rest_route('wpcodex/v1', '/hello/(?P<name>[a-zA-Z0-9-]+)', array(
'methods' => 'GET',
'callback' => 'wpcodex_hello_endpoint',
'permission_callback' => '__return_true',
));
}
function wpcodex_hello_endpoint($request) {
$name = $request->get_param('name');
return array('message' => 'Привет, ' . sanitize_text_field($name) . '! Добро пожаловать в WP Codex API.');
}В этом примере мы создаём маршрут /wp-json/wpcodex/v1/hello/{name}, который принимает параметр name из URL и возвращает приветствие. Обратите внимание на permission_callback — здесь мы разрешаем всем доступ, но в реальном проекте стоит добавить проверку прав.
Пояснения по коду
Функция wpcodex_register_custom_route регистрирует новый маршрут с namespace wpcodex/v1. Параметр (?P — это регулярное выражение, которое позволяет захватить часть URL и передать как параметр в функцию-обработчик.
Функция wpcodex_hello_endpoint получает объект запроса, извлекает параметр name, безопасно очищает его через sanitize_text_field и возвращает массив, который WordPress автоматически преобразует в JSON.
Работа с кастомными типами записей через REST API
Часто требуется создавать API для кастомных типов записей (Custom Post Types, CPT). Для того чтобы CPT был доступен через REST API, нужно при регистрации CPT установить параметр 'show_in_rest' => true. Рассмотрим пример регистрации CPT с REST поддержкой:
function wpcodex_register_cpt_product() {
$args = array(
'label' => 'Продукты',
'public' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor', 'custom-fields'),
'rest_base' => 'products',
);
register_post_type('wpcodex_product', $args);
}
add_action('init', 'wpcodex_register_cpt_product');После этого к типу записи wpcodex_product можно обращаться через стандартный REST API по адресу /wp-json/wp/v2/products.
Но что если нужна дополнительная логика для обработки данных? В таком случае можно создать собственный маршрут, который будет возвращать данные с кастомной фильтрацией и форматированием.
Пример кастомного маршрута с фильтрацией продуктов по цене
add_action('rest_api_init', 'wpcodex_register_products_filter_route');
function wpcodex_register_products_filter_route() {
register_rest_route('wpcodex/v1', '/products', array(
'methods' => 'GET',
'callback' => 'wpcodex_get_filtered_products',
'permission_callback' => '__return_true',
'args' => array(
'min_price' => array('validate_callback' => 'is_numeric'),
'max_price' => array('validate_callback' => 'is_numeric'),
),
));
}
function wpcodex_get_filtered_products($request) {
$min_price = $request->get_param('min_price');
$max_price = $request->get_param('max_price');
$meta_query = array('relation' => 'AND');
if ($min_price !== null) {
$meta_query[] = array(
'key' => 'price',
'value' => (float)$min_price,
'compare' => '>=',
'type' => 'NUMERIC',
);
}
if ($max_price !== null) {
$meta_query[] = array(
'key' => 'price',
'value' => (float)$max_price,
'compare' => '<=',
'type' => 'NUMERIC',
);
}
$query = new WP_Query(array(
'post_type' => 'wpcodex_product',
'meta_query' => $meta_query,
'posts_per_page' => 10,
));
$products = array();
foreach ($query->posts as $post) {
$products[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'price' => get_post_meta($post->ID, 'price', true),
);
}
return $products;
}В этом примере создаётся маршрут /wp-json/wpcodex/v1/products, который принимает параметры min_price и max_price и возвращает список продуктов, отфильтрованных по цене. Это наглядный пример, как расширить стандартный API WordPress.
Обеспечение безопасности и аутентификации REST API
Важно не забывать, что REST API может использоваться для получения и изменения данных, поэтому нужно обеспечить правильную проверку прав доступа. В параметре permission_callback можно указать функцию, которая проверит текущего пользователя или токен.
Пример простой проверки авторизации пользователя:
function wpcodex_permissions_check() {
return current_user_can('edit_posts');
}
register_rest_route('wpcodex/v1', '/secure-data', array(
'methods' => 'GET',
'callback' => 'wpcodex_secure_data_endpoint',
'permission_callback' => 'wpcodex_permissions_check',
));
function wpcodex_secure_data_endpoint() {
return array('data' => 'Это защищённые данные для авторизованных пользователей.');
}Для более сложных сценариев можно использовать OAuth, JWT или другие методы аутентификации. WordPress также поддерживает cookie-аутентификацию и nonce.
Полезные плагины для работы с REST API в WordPress
В экосистеме WordPress есть плагины, которые упрощают создание и тестирование REST API:
- WP REST API Controller — даёт визуальный интерфейс для настройки эндпоинтов и полей.
- JWT Authentication for WP REST API — добавляет поддержку JWT токенов для безопасной аутентификации.
- Advanced Custom Fields (ACF) — позволяет добавлять кастомные поля и выводить их через REST API (при использовании дополнений).
- REST API Toolbox — помогает расширять и модифицировать существующие REST маршруты.
Использование этих инструментов значительно ускорит разработку и сделает API более гибким.
Заключение
Создание собственного REST API в WordPress — важный навык для современного разработчика. Это позволяет адаптировать CMS под любые бизнес-задачи и интегрировать сайт с внешними сервисами. В статье мы рассмотрели, как зарегистрировать маршруты, работать с кастомными типами записей, обеспечивать безопасность и использовать полезные плагины. Применяйте эти знания в ваших проектах, чтобы создавать более мощные и гибкие решения на WordPress.