REST API
REST API — способ работать с магазином по HTTP: внешняя программа отправляет запрос на адрес сайта и получает JSON. Так учётная система обновляет остатки, склад забирает заказы, а мобильное приложение показывает каталог. API встроен в WooCommerce, включать его не нужно.
Ключи доступа
Запросы подписывают ключом. Создайте его в «WooCommerce → Настройки → Дополнительно → REST API → Добавить ключ»: укажите описание, пользователя и права — «Чтение», «Запись» или «Чтение/запись». Панель один раз покажет две строки: ck_... (ключ) и cs_... (секрет) — сохраните их.
Первый запрос
curl "https://shop.example.com/wp-json/wc/v3/products?per_page=5" \
-u ck_your_key:cs_your_secretКлюч и секрет передаются как имя и пароль. В ответ придёт JSON-массив из пяти товаров с полями id, name, price, stock_quantity и другими. Такая передача допустима только по HTTPS.
Адреса
| Адрес | Что это |
|---|---|
/wp-json/wc/v3/products | Товары |
/wp-json/wc/v3/products/12 | Один товар |
/wp-json/wc/v3/products/15/variations | Вариации товара |
/wp-json/wc/v3/products/categories | Категории |
/wp-json/wc/v3/orders | Заказы |
/wp-json/wc/v3/customers | Покупатели |
/wp-json/wc/v3/coupons | Купоны |
Методы обычные: GET читает, POST создаёт, PUT изменяет, DELETE удаляет.
Параметры списка
| Параметр | Что делает |
|---|---|
per_page, page | Размер и номер страницы, не больше 100 записей |
search | Поиск по названию |
status | Отбор по состоянию |
modified_after | Только изменённые после даты |
_fields | Только перечисленные поля: _fields=id,status,total |
Общее число записей и страниц приходит в заголовках ответа X-WP-Total и X-WP-TotalPages.
Изменение данных
curl -X PUT "https://shop.example.com/wp-json/wc/v3/products/12" \
-u ck_your_key:cs_your_secret \
-H "Content-Type: application/json" \
-d '{"stock_quantity": 15, "regular_price": "11.90"}'Запрос меняет остаток и цену товара 12 и возвращает обновлённый товар. Ключу нужны права на запись. Много товаров за один запрос обновляет адрес /products/batch с полями create, update и delete.
Своё поле в ответе
Создайте файл includes/rest.php и подключите его в acme-shop.php:
// wp-content/plugins/acme-shop/includes/rest.php
add_filter('woocommerce_rest_prepare_product_object', function (WP_REST_Response $response, WC_Product $product) {
$response->data['lead_time'] = (int) $product->get_meta('_acme_lead_time');
return $response;
}, 10, 2);Фильтр срабатывает перед отправкой каждого товара. Повторите первый запрос: у каждого товара появилось поле lead_time. Для заказов есть такой же фильтр woocommerce_rest_prepare_shop_order_object.
Свой маршрут
Когда готовых адресов мало, регистрируют собственный:
// wp-content/plugins/acme-shop/includes/rest.php
add_action('rest_api_init', function () {
register_rest_route('acme/v1', '/low-stock', [
'methods' => 'GET',
'permission_callback' => fn () => current_user_can('manage_woocommerce'),
'callback' => function () {
$products = wc_get_products(['manage_stock' => true, 'limit' => 100]);
$low = array_filter($products, fn ($product) => (int) $product->get_stock_quantity() < 5);
return array_map(
fn ($product) => ['id' => $product->get_id(), 'name' => $product->get_name()],
array_values($low)
);
},
]);
});Адрес /wp-json/acme/v1/low-stock вернёт товары, которых осталось меньше пяти. permission_callback пускает только пользователей с правом управлять магазином. Ключи ck_ и cs_ действуют только для адресов wc/...: к своему маршруту обращаются с паролем приложения WordPress, который создают в «Пользователи → Профиль → Пароли приложений».
Частая ошибка
Интеграция опрашивает /orders каждую минуту и забирает все заказы целиком. На большом магазине такие запросы заметно нагружают базу. Запрашивайте только изменившееся — параметром modified_after — и только нужные поля через _fields. А ещё лучше получать заказы вебхуком в момент оформления — о нём следующий урок.