WooCommerce — крупнейший плагин для электронной коммерции в WordPress, который предоставляет мощный REST API для взаимодействия с заказами, товарами и клиентами. Однако стандартный API не всегда покрывает все потребности бизнеса, и иногда требуется создать собственные REST API эндпоинты, чтобы расширить функциональность или интегрировать сайт с внешними системами.
Почему стоит создавать собственные REST API для WooCommerce
Стандартный WooCommerce REST API покрывает основные операции с товарами, заказами, клиентами, купонами и т.д. Но бывают задачи, которые требуют:
- Создать кастомные эндпоинты с логикой, уникальной для вашего бизнеса.
- Добавить дополнительную валидацию данных или фильтрацию.
- Обеспечить безопасность через аутентификацию или ограничение доступа.
- Оптимизировать взаимодействие с мобильными приложениями или внешними сервисами.
В этой статье мы разберём, как на практике создать собственный REST API для WooCommerce, используя хуки WordPress и основы построения REST API.
Основы создания собственного REST API в WordPress
WordPress предоставляет встроенный механизм для создания REST API через класс WP_REST_Controller и функцию register_rest_route. Мы можем зарегистрировать новый маршрут, указать методы (GET, POST и др.) и обработчики запросов.
Для начала создадим простой эндпоинт, который возвращает кастомную информацию о заказах WooCommerce.
Регистрация маршрута REST API
В файле плагина или в functions.php темы добавим следующий код:
add_action('rest_api_init', function () {
register_rest_route('wporders/v1', '/order-info/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'wporders_get_order_info',
'permission_callback' => function () {
return current_user_can('read');
}
));
});Здесь мы зарегистрировали маршрут /wp-json/wporders/v1/order-info/<id>, который принимает ID заказа и вызывает функцию wporders_get_order_info.
Создание функции обработки запроса
Функция должна принимать объект $request и возвращать данные в формате JSON.
function wporders_get_order_info($request) {
$order_id = $request->get_param('id');
$order = wc_get_order($order_id);
if (!$order) {
return new WP_Error('no_order', 'Заказ не найден', array('status' => 404));
}
// Формируем ответ с нужными данными
$data = array(
'id' => $order->get_id(),
'status' => $order->get_status(),
'total' => $order->get_total(),
'items' => array(),
);
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$data['items'][] = array(
'product_id' => $product ? $product->get_id() : 0,
'name' => $item->get_name(),
'quantity' => $item->get_quantity(),
'total' => $item->get_total(),
);
}
return rest_ensure_response($data);
}Добавление POST эндпоинта для обновления статуса заказа
Часто нужно не только получать данные, но и обновлять их. Создадим POST эндпоинт для изменения статуса заказа.
add_action('rest_api_init', function () {
register_rest_route('wporders/v1', '/order-status/(?P<id>\d+)', array(
'methods' => 'POST',
'callback' => 'wporders_update_order_status',
'permission_callback' => function () {
return current_user_can('edit_shop_orders');
}
));
});
function wporders_update_order_status($request) {
$order_id = $request->get_param('id');
$status = sanitize_text_field($request->get_param('status'));
$allowed_statuses = wc_get_order_statuses();
if (!isset($allowed_statuses['wc-' . $status])) {
return new WP_Error('invalid_status', 'Неверный статус заказа', array('status' => 400));
}
$order = wc_get_order($order_id);
if (!$order) {
return new WP_Error('no_order', 'Заказ не найден', array('status' => 404));
}
$order->update_status($status, 'Статус изменён через кастомный REST API');
return rest_ensure_response(array('success' => true, 'new_status' => $status));
}Безопасность и аутентификация в кастомных REST API эндпоинтах
Очень важно контролировать доступ к API — неавторизованные пользователи не должны менять данные заказов. В примерах выше для проверки прав используется функция current_user_can(), которая проверяет, может ли пользователь читать данные или редактировать заказы.
Для аутентификации можно использовать стандартные методы WordPress REST API: cookie-аутентификацию для браузерных запросов, Basic Auth или OAuth для внешних клиентов. Для интеграции с мобильными приложениями часто используют JWT (JSON Web Tokens) — для этого есть готовые плагины, например, JWT Authentication for WP REST API.
Полезные плагины для расширения REST API WooCommerce
Если вы не хотите писать код с нуля, можно воспользоваться готовыми решениями:
- WooCommerce REST API Manager — расширяет базовый API, добавляя дополнительные поля и возможности.
- WP REST API Controller — позволяет настраивать доступ к стандартным эндпоинтам и создавать новые без программирования.
- JWT Authentication for WP REST API — добавляет поддержку JWT для безопасной аутентификации.
Однако собственный код даёт максимальную гибкость и позволяет полностью контролировать логику.
Практические советы по работе с кастомным REST API для WooCommerce
Обработка ошибок и валидация данных
Обязательно валидируйте входящие данные и возвращайте корректные HTTP коды и сообщения об ошибках через WP_Error. Это поможет клиентам API правильно реагировать на проблемы.
Кэширование и производительность
Если API обрабатывает большое количество запросов, стоит подумать о кэшировании результатов, например, через Transients API или внешние кэш-системы. Это снизит нагрузку на базу данных.
Логирование запросов
Для отладки и анализа полезно вести лог запросов к API, особенно POST и PUT, где меняются данные. Это поможет быстро находить и исправлять ошибки.
Заключение
Создание собственного REST API для WooCommerce — мощный инструмент для расширения возможностей вашего интернет-магазина. Вы можете создавать уникальные интеграции, оптимизировать бизнес-процессы и обеспечивать безопасность данных. Приведённые примеры кода помогут быстро начать разработку и адаптировать API под свои задачи.