Как добавить собственные REST API эндпоинты в WordPress
WordPress имеет мощный REST API, который позволяет работать с данными сайта через HTTP-запросы. Однако стандартные эндпоинты не всегда покрывают все задачи, особенно если нужно реализовать кастомную логику или работать с нестандартными данными. В этой статье мы подробно рассмотрим, как добавить собственные REST API эндпоинты в WordPress, чтобы расширить функциональность и интегрировать сайт с внешними сервисами.
Что такое REST API эндпоинты в WordPress и зачем их создавать
REST API предоставляет возможность взаимодействовать с сайтом через стандартные HTTP-запросы (GET, POST, PUT, DELETE). Каждый эндпоинт — это URL, который обрабатывает определённый запрос и возвращает данные в формате JSON. Стандартные эндпоинты позволяют работать со страницами, постами, пользователями и т.д. Но что если вам нужно получить данные из кастомных таблиц или реализовать бизнес-логику? Тогда приходится создавать собственные эндпоинты.
Добавляя свои эндпоинты, вы получаете полный контроль над тем, какие данные и как возвращать, а также как обрабатывать запросы. Это особенно полезно для мобильных приложений, SPA или интеграций с внешними системами.
Регистрация собственного эндпоинта: базовый пример
Чтобы создать свой эндпоинт, нужно использовать хук rest_api_init и функцию register_rest_route. Рассмотрим пример, который добавит эндпоинт /wpapi/v1/hello, возвращающий простое приветствие.
add_action('rest_api_init', function() {
register_rest_route('wpapi/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpapi_hello_endpoint',
));
});
function wpapi_hello_endpoint() {
return array('message' => 'Привет от WPAPI!');
}После добавления этого кода в файл плагина или в functions.php темы, при обращении к https://yoursite.ru/wp-json/wpapi/v1/hello вы получите JSON с сообщением.
Пояснения по коду
rest_api_init— событие, когда WordPress инициализирует REST API;register_rest_route— функция для регистрации эндпоинта, принимает пространство имён (namespace), маршрут (route) и параметры;methods— HTTP-метод, поддерживаемый эндпоинтом;callback— функция, которая будет вызвана при запросе к эндпоинту.
Обработка параметров запроса и проверка прав доступа
Часто нужно принимать параметры от клиента: например, ID записи или фильтры. Также важно удостовериться, что запрос делает авторизованный пользователь, если данные не публичные.
Добавим к нашему примеру обработку параметра name и проверку прав.
add_action('rest_api_init', function() {
register_rest_route('wpapi/v1', '/greet', array(
'methods' => 'GET',
'callback' => 'wpapi_greet_endpoint',
'permission_callback' => function () {
return current_user_can('read');
},
'args' => array(
'name' => array(
'required' => true,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && !empty($param);
}
),
),
));
});
function wpapi_greet_endpoint($request) {
$name = sanitize_text_field($request->get_param('name'));
return array('message' => 'Привет, ' . $name . '!');
}Теперь при GET-запросе к /wp-json/wpapi/v1/greet?name=Иван вернётся приветствие с именем, но только для авторизованных пользователей с правом read.
Разбор особенностей
permission_callback— функция проверки прав, должна вернуть true или false;args— описание ожидаемых параметров, с возможностью валидации и обязательности;sanitize_text_field— стандартная функция для очистки входящих данных.
Как работать с кастомными типами записей и метаданными через REST API
Если у вас есть кастомные типы записей (custom post types) и метаполя, их тоже можно использовать в REST API. Для этого нужно добавить поддержку REST API при регистрации типа записи и зарегистрировать метаполя.
Регистрация кастомного типа записи с поддержкой REST API
add_action('init', function() {
register_post_type('wpapi_product', array(
'label' => 'Продукты',
'public' => true,
'show_in_rest' => true,
'rest_base' => 'products',
'supports' => array('title', 'editor', 'custom-fields'),
));
});А теперь зарегистрируем метаполе, которое тоже будет доступно через API.
add_action('rest_api_init', function() {
register_rest_field('wpapi_product', 'price', array(
'get_callback' => 'wpapi_get_product_price',
'update_callback' => 'wpapi_update_product_price',
'schema' => array(
'description' => 'Цена продукта',
'type' => 'number',
'context' => array('view', 'edit'),
),
));
});
function wpapi_get_product_price($object) {
return get_post_meta($object['id'], 'price', true);
}
function wpapi_update_product_price($value, $object, $field_name) {
if (!is_numeric($value)) {
return new WP_Error('rest_invalid_param', 'Цена должна быть числом.', array('status' => 400));
}
return update_post_meta($object->ID, $field_name, $value);
}Теперь при запросах к эндпоинту /wp-json/wp/v2/products у каждого продукта будет поле price с возможностью читать и обновлять его через REST API.
Практические советы и лучшие практики при создании собственных эндпоинтов
Создавая REST API эндпоинты, следует учитывать несколько важных моментов:
- Безопасность. Всегда проверяйте права доступа, не отдавайте чувствительные данные без проверки.
- Валидация и санитизация. Обрабатывайте все входящие данные, чтобы избежать уязвимостей.
- Именование. Используйте уникальное пространство имён (например,
wpapi/v1) и префиксы в названиях функций, чтобы избежать конфликтов. - Документирование. Чётко описывайте параметры и формат ответов, это облегчает использование API другими разработчиками.
- Кэширование. Для сложных и часто запрашиваемых данных используйте кэширование, чтобы снизить нагрузку на сервер.
Заключение: расширяйте WordPress с помощью своих REST API эндпоинтов
Добавление собственных REST API эндпоинтов — это мощный способ интеграции и кастомизации WordPress. Вы можете создать API под свои задачи, обеспечив гибкий и безопасный доступ к данным сайта. В этой статье мы рассмотрели основы создания таких эндпоинтов с примерами кода, которые можно использовать как шаблон для своих проектов. Пользуйтесь возможностями WPAPI и создавайте уникальные решения!