WooCommerce REST API — обновление цен из 1С без плагинов
Задача:
Настроить автоматический обмен цен с 1С по расписанию.
Решение:
Сложность в том, что у товара есть не только розничная цена, но и оптовая цена. Оптовая цена видна только зарегистрированным пользователям с определённой ролью — администратор или клиент. Это реализовано с помощью плагина Premmerce Wholesale Pricing for WooCommerce.
Получается, плагинами обмена с 1С обновить оптовые цены не получится. Придётся помимо покупки плагина, ещё его и допиливать. А значит проблемы с будущими обновлениями плагина и тому подобные.
Решили настроить обмен через API WooCommerce. План такой:
— Заказчик настраивает в 1С выгрузку цен по расписанию куда-нибудь на сервер
— Мы напишем скрипт, который будет этот файл скачивать, обрабатывать и обновлять цены на сайте.
Этапы работы:
1. Настроили выгрузку из 1С.
У заказчика 1С на обслуживании, поэтому выгрузку он настроил на своей стороне. Я создал на сервере папку /exchange/ и предоставил к ней FTP-доступ. Программист заказчика настроил выгрузку номенклатуры в CSV.
Неожиданно: На сайте цены в рублях. А у некоторых позиций оказались цены в другой валюте. И если раньше заказчик присылал прайс в рублях, то в выгрузку попали цены в другой валюте. Программист заказчика задачу решил, никаких манипуляций с обменным курсом придумывать не пришлось.
2. Настроил автоматическое скачивание прайса.
На сервере в крон добавил команду для скачивания файла по расписанию. Например, для скачивания раз в час:
* 1 * * * cd /projects/site && wget -O price.csv "https://site.ru/exchange/price.csv"
Флаг «-O» с новым именем файла нужен для переименования скачиваемого прайса в имя, которое задано в скрипте обмена. И чтобы заменять предыдущий файл свежим прайсом, а не хранить лишние копии.
3. Получил ключи API в настройках WooCommerce.
4. Написал скрипт обмена.
По API Woo есть хорошая документация. Но методы работы с товарами жестко завязаны на идентификатор товара. Не знаешь id товара — ничего с ним не сделаешь. А из 1С в выгрузку попадает только артикул или номенклатурный номер товара.
Поэтому делаем такой финт:
- Скачиваем все товары с сайта
- Проходим по каждому товару в выгрузке из 1С
- Сравниваем артикул товара из с 1С и артикулом с сайта
- Если артикул совпадает, берём его ID и новые цены
- Всё это дело укладываем в пачку и отправляем на сайт для обмена
Неожиданно: ключи API я получал как администратор. А в плагине оптовой цены для администратора показывается оптовая цена, а не розничная. Соответственно и по API администратор получает в качестве розничной цены — только оптовую. Получается два варианта решения проблемы: либо отключить роль администратора в плагине оптовой цены, либо выдать ключи пользователю с другой ролью. В качестве эксперимента выдал ключи, как менеджеру магазина. Тут плагин на него не влияет. Всё получилось — по API вернулись и оптовые цены и розничные.
Чтобы скачать товары, используем удалённое подключение к базе данных на сервере. Подробнее в статье “Как подключиться к базе данных MySQL на хостинге“.
5. Протестировал обмен.
На тесте всё получилось. Обмен цен 3000 товаров составил 8 минут.
Статью пишу сразу после теста. Как в боевом режиме всё будет — посмотрим. Отпишусь позже.
Заметка на будущее:
Товары можно обновлять по одному либо пакетом до 100 товаров в пачке. 100 товаров сайт не принял — тяжеловата нагрузка оказалась. Пришлось уменьшить до 20 товаров в пачке.