Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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. А ещё лучше получать заказы вебхуком в момент оформления — о нём следующий урок.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.