WooCommerce интеграция с 1С по Складам + Геотаргетинг по городам

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

Содержание

Задача. Есть интернет-магазин на Woocommerce и база 1С: Предприятия. Компания продает товары в разных городах и имеет там свои склады. Главной целью является сделать интеграцию WordPress с 1С. В 1С есть учет по складам, а в Woocommerce их по умолчанию нет. Поэтому на сайте нужно реализовать эти склады, чтобы покупатель мог указывать где он будет забирать товар при заказе. Также необходимо настроить геотрагетинг так, чтобы на странице товара отображались для выбора только склады в выбранном или определившемся городе [Изображение 1].

Изображение 1: Склады на странице товара по городу

Решение. Для решения задачи по настройке обмена данными между 1С и Woocommerce со складами и геотаргетингом, будем использовать следующие плагины:

  • EDI — Обмен данными между WooCommerce и 1С — обмен данными между WooCommerce и приложением для бизнеса «1C:Предприятие 8. Управление торговлей» (и совместимыми).
  • Stock Locations for WooCommerce — плагин для реализации складов в Woocommerce.
  • WT Geotargeting — плагин определяет и выводит город пользователя.

Создание складов в Woocommerce

Создаем склады плагином Stock Locations for WooCommerce. Он создает таксономию location, терминами которой и являются складские помещения. В товаре отмечаем нужные склады и указываем количество в запасе для каждого. Лучше предворительно почитать о настройке на странице плагина.
Алгоритм настройки складов:

  1. Общие настройки.
  2. Создание и донастройка складов.
  3. Добавление складов в товары.

Общие настройки

Включить управление запасами: WooCommerce Настройки — Товары — Запасы.

Общие настройки плагина: WooCommerce — Stock Locations for WC — Settings [Изображение 2.1]. Основные опции на которые стоит обратить внимание:

  • Отображать местоположение склада в разделе.
  • Управление запасами на странице товара.
  • Показывать количество на складе при выборе местоположения во внешнем интерфейсе.
  • Восстановить значение запаса местоположения для отмененный статуса заказа.
  • Восстановить значение запаса местоположения для неудачный статуса заказа.
Страница настроек плагина Stock Locations for WooCommerceСтраница настроек плагина Stock Locations for WooCommerce
Изображение 2.1: Страница настроек плагина Stock Locations

Создание и донастройка складов

Для добавления новых складов перейти Товары — Stock locations. При создании склада, указыть его название, обязательно включить «Автоматическое распределение заказов» и устанавить Приоритет местоположения на 1 или больше (тут стоит ознакомиться с инструкциями), но я ставил везде просто единицу. Если не включить автоматическое распределение, тогда после оформления заказа нужно будет вручную в заказе вводить количество заказанного товара (оно подсвечивается какой склад был выбран, но в поле стоит 0 и нужно будет его заменять на соответствующее количеству в заказе).

Второй, обязательный момент, необходимо включить (активировать) склад после его добавления, иначе он просто не будет отображаться в списке складов на сайте, несмотря на то, что в товаре он будет задан [Изображение 2.2].

Изображение 2.2:Страница добавления складов в Stock Locations for WC

Импорт складов

Если складов очень много, то их вомозжно будет быстрее импортировать, предварительно выгрузив из 1С. Можно сделать таблицу по примеру Таблицы №2, где сразу указать нужные параметры.

cf_1s_id_location Term Name slw_auto_allocate slw_location_priority slw_location_status id_city_locations
66c5f3f2-e3b9-11eb-b762-a26573e75a7a Главный Склад (ул. Коммуны 11) 1 1 1 1013
18031d85-befd-11ed-9a7f-1831bfcdce8e Склад №1 (ул. Коммуны 28) 1 1 1 1013
d6959bf9-0fc7-11ec-b077-1831bfcdce8e Склад №2 пр.Успенского 11 1 1 1 1014
Таблица №2: Пример для импорта складов
Пояснения к Таблице №2:

  • Term Name — название склада.
  • cf_1s_id_location — пользовательское поле для id склада из 1С (*создадим и рассмотрим подробнее в разделе по синхронизации с 1С).
  • slw_auto_allocate — мета-поле плагина, которое включит «Автоматическое распределение заказов».
  • slw_location_priority — мета-поле плагина, установит Приоритет местоположения.
  • slw_location_status — мета-поле плагина, активирует склад.
  • id_city_locations — пользовательское поле для id города (*рассмотренно в разделе по настройке геотаргетинга).
WP Import Export Lite — хороший плагин импорта/экспорта, но стоит учесть что новые версии требуют php 8. Для версий php ниже сохранил версию 3.9.26.

Добавление складов в товары

Добавляются склады на странице редактирования товара (Изображение 2.3):

  1. В блоке Location отметить необходимые склады и обязательо сохранить товар, иначе не появятся поля с запасами.
  2. В блоке Данные товара — Складские помещения заполнить поля Stock Qty с запасами по каждому складу.
    * — общая сумма в запасе должна совпадать с числом во вкладке Запасы — поле Количество, иначе могут быть проблемы
  3. Если цена по всем складам одинаковая, то поле Stock Price оставляем пустым.
Редактирование товара в Woocommerce со складамиРедактирование товара в Woocommerce со складами
Изображение 2.3: Добавление складов в товар плагином Stock Locations for WooCommerce

Настройка синхронизации 1С с Woocommerce

Как и было сказано ранее, для синхронизации сайта с 1С используем плагин «EDI — Обмен данными между WooCommerce и 1С». Не смотря на то, что для включения складов в синхронизацию нужны будут доработки самого плагина, разберем для начала общий алгоритм настроек сайта и 1С, как при обычном импорте:

  1. После установки плагина в разделе Woocommerce — Настройки синхронизации с 1С [Изображение 3.1] нужно задать Логин и Пароль (любые), отметить что импортировать, скопировать адрес из «URL сайта для обмена с 1С»
  2. В 1С нужно перейти в «Интеграция с Интернет-магазином» [Изображение 3.2] Настройки — Интеграции — Каналы продаж — Интернет-магазин.
  3. Во вкладке Авторизация указать:
    Тип сайта — Другой;
    Выгружать файлы обмена — На сайт;
    Адрес сайта, Логин и Пароль — из настроек на странице плагина.
  4. Чтобы изображения товаров передавались их нужно включить в настройках 1С — Интеграция с интернет-магазином — Товары — Выгружать присоединенные файлы.
  5. Нажать «Проверить подключение» и если соединение установленно, то в списке «Синхронизация данных» пункт «Выполнить полный обмен данными» и дождаться окончания импорта.
Смотреть Изображения 3.1 и 3.2
Настроки в плагине EDI — Обмен данными между WooCommerce и 1СНастроки в плагине EDI — Обмен данными между WooCommerce и 1С
Изображение 3.1: Страница настроек плагина «EDI — Обмен данными между WooCommerce и 1С»
Интеграция с интернет-магазином в 1СИнтеграция с интернет-магазином в 1С
Изображение 3.2: Страница настроек 1С интегорации с сайтом
Учтите, вид настроек в 1С могут отличаться. Более точные настройки в 1С лучше поискать отдельно, т.к. могут быть нюансы.

Некоторые моменты по работе с плагином EDI:

  • Если на сайте до импорта были какие-то товары, то после импорта они перейдут в состояние «На утверждении».
  • После импорта в папке /wp-content/uploads/edi-1c/ должны быть файлы offers.xml и import.xml
  • Внизу страницы настроек плагина есть ссылка Просмотреть лог, где можно посмотреть ошибки при выполнении импорта.
  • Для ручного обновления из offers.xml и import.xml понадобится установка WP-CLI.

WP-CLI нужен при ручном обновлении файлов offers.xml и import.xml. Это может понадобиться при отладке или доработке, чтобы не грузить каждый раз из 1С все товары, а изменить offers.xml с меньшим количеством товаров. После установки WP-CLI на сайт понадобятся некоторые команды. Работа с WP-CLI ведется через терминал. Для загрузки offers.xml выполните в терминале:

  1. wp edi checkauth и wp edi init
  2. Скопируйте файл в папку /wp-content/uploads/edi-1c/
  3. wp edi import offers.xml

Для import.xml — аналогично. Почему загружать файл нужно после wp edi init? Потому, что при выполнении этой команды все файлы из той папки удаляются.

Доработки плагина «EDI» под склады

Первой задачей является научить плагин брать информацию по складам и добавлять ее в товар, а вторая задача — настроить синхронизацию из сайта в 1С, учитывая выбранные склады (экспорт заказов). Разделим доработку на две части.

Доработка плагина под импорт данных о складах

Сперва нам нужно узнать в каком виде приходят данные о товарах на сайт. После выгрузки товаров изучаем файл /wp-content/uploads/edi-1c/offers.xml. В моем случае структура была такая как в Код №3.1

Код №2.1: Пример файла offers.xml

Код №3.1: Пример файла offers.xml импортируемых товаров из 1С

В примере видно, что склады организованы подобно категориям, у каждого склада есть Наименование и Ид, а указание о количестве товара на складе задается через ИдСклада. Выходит, что идентификатор склада в 1С является ключевым моментом. Поэтому нам необходимо его указать в наших складах. Для этого сделаем кастомное мета-поле для таксономии locationcf_1s_id_location и присвоим соответствующие значения каждому складу (об этом упоминалось выше в Импорте складов).

Далее, мы используем хук-фильтр плагина 'edi_parse_offer_xml_object' и хук 'edi_offer_before_save', где получаем данные по складам из разбора XML и добавляем их при сохранении товара [Код №3.2]. Код можно разместить в functions.php или сделать отдельным плагином.

Код №3.2: Доработка плагина EDI под склады товаров
Пояснения к Коду №3.2:
'edi_parse_offer_xml_object' — фильтр для разбора XML данных о складах, где мы проверяем есть ли в массиве $xml_data склад и если есть, то добавляем его в массив $product_data.
'edi_offer_before_save' — хук для обработки данных перед сохранением, где мы перебираем поллученные ранее склады, ищем по их id склад, который на сайте и добавляем в товар соответствующие данные.

На данном этапе это всё. При импорте товары уже должны распределяться по складам.

Важно! В данном примере мы не делали импорт самих складов, поэтому это нужно учитывать и заранее их добавить на сайт, а если добавяться новые или по какой-то причине изменятся id в 1С, то нужно это скорректировать.

Доработка экспорта заказов

Для экспорта заказов необходимо в Woocommerce — Настройки синхронизации с 1С включить Экспорт заказов. Остальное по импорту можно отключить, если все товары уже импортированы. Далее Выполнить полный обмен данными в 1С.

После обмена в папке /wp-content/uploads/edi-1c/ появится файл примерно с таким названием — orders-xxxxx-xxxx-xxxx.xml. Пример его содержимого в Коде №3.3 для одного заказа. Как видно — в теге <Документ> размещается один заказ.

Смотреть Код №3.3

Код №3.3: Пример содержимого файла экспорта заказов

В Инструментах администратора 1С можно посмотреть Последний загруженный файл заказов [Изображение 3.3].

Смотреть Изображение 3.3
Изображение 3.3: Последний загруженный файл заказов в 1С

На сколько понимаю, то формат передачи данных о складе в заказе может быть разным, в зависимости от того как это реализованно в 1С. В моем случае, мне разработчик 1С сказал, что нужно передать в блок <ЗначенияРеквизитов> данные о складе как название склада таким образом [Код №3.4]:

Код №3.4: Пример
Решение есть. Только проблема в том, что не нашлось хуков под это дело, чтобы сделать не изменя код самого плагина. Поэтому, применяя дальнейшую доработку нужно где-то сохранить копию измененного плагина на случай его обновления.

Итак, в папке плагина EDI e-commerce-data-interchange/src/ файл OrderQuery.php отвечает за выходные данные XML с заказами, которые отправлюется в 1С. Функции используют шаблоны из папки e-commerce-data-interchange/src/partials/. Например, функция output_products() отвечает за данные заказа, которые выводятся в product.xml.

За блок <ЗначенияРеквизитов> отвечает функция output_attributes() и шаблон attribute.xml. Поэтому, в функции нужно получить склад из данных заказа и добавить его на вывод [Код №3.5], а макете XML добавить шаблон для склада [Код №3.6].

Код №3.5: Файл /src/OrderQuery.php — доработка функции output_attributes()

Код №3.6: Файл /src/partials/attribute.xml добавили вывод название склада stock_location_name

Всё, можно протестировать заказ, синхронизировать и посмотреть Последний загруженный файл заказов — есть ли там изменения.

По поводу файла orders_xxx.xml. В моем случае, в последнем файле заказов видно что новые данные приходят, и склады отображались в системе 1С. Но на сайте в том файле orders_xxx.xml изменений нет. Скорей всего, так происходит потому что тот файл формируется в 1С, а потом уже приходит на сайт.

Может быть полезным. Вот что содержат массивы $params['order'] и $order_item:

$params[‘order’]

$order_item

Для визуализации массива можно использовать инструмент JSON Visual

Настройка геотаргетинга со складами

Наша цель — настроить геотаргетинг таким образом, чтобы в товарах в списке складов были доступны для выбора только те, которые соответствуют выбранному или определившемуся городу (пример в Изображении 1). Например, если у компании сеть магазинов во многих городах, по несколько штук в каждом, то нет необходимости показывать пользователю сотни точек где забрать товар. Можно вывести только те, которые находятся в текущем городе.

Решение. Настроить WT Geotargeting, привязать к складам города и отображать только соответствующие городу.

Алгоритм настройки геотаргетинга по складам:

  1. Установить плагин WT Geotargeting (Pro) и загрузить в него города
  2. Создать пользовательское поле для склада и привязать к каждому город.
  3. Написать php-скрипт, который будет брать id текущего города и создаст массив соответствующих ему складов.
  4. Написать js-скрипт, который, используя массив соответствующих локации складов, будет оставлять в списке складов только нужные.

Посмотреть общую настройку WT Geotargeting и скачать список городов можно здесь. После активации плагина в системе будет создан тип записи «Регионы», где можнно будет увидеть города которые мы загрузили. Если каких-то городов не хватает, то можно создать по аналогии с существующими.

Важное замечание: WT Geotargeting нужен Pro-версии, т.к. в бесплатной нет возможности загрузить список городов и вообще не создаются Регионы как отдельный тип записи.

Второй этап. Создать пользовательское поле cf_city_location для таксономии location (склады), в ACF это будет: Тип поля — Объект записи; Фильтрация по типу записей — Регион. Далее нужно отредактировать каждый склад, назначив ему необходимый город.

Ранее была таблица-пример для импорта складов. так вот, если складов большое множество, то можно импортировать и города, использовав id записей городов из Регионов.

Третий этап. Создаем в папке с темой файл /js/wt-stock-location-select.js и подключаем его в functions.php. При подключении скрипта создадим массив arr_location_true, который будет содержать ID складов соответствующих текущему городу и передадим его в подключаемый скрипт для дальнейшего использования на странице сайта [Код №4.1].

Код №4.1: Подключение скрипта ‘wt-stock-location-select’ с передачей в него массива складов

Четвертый этап. В созданном и подключенном файле wt-stock-location-select.js добавляем Код №4.2. Здесь мы получаем список складов товара и сопоставляем его со списком переданным в arr_location_true. Если совпадает — оставляем, нет — удаляем.

Код №4.2: Javascript для удаления лишних складов из выпадающего списка

Дополнение

Вместо pro версии WT Geotargeting можно попробовать использовать бесплатную из репозитория Цщквзкуыы. Но тогда самостоятельно добавить пользовательский тип записи городов, добавить нужные (можно даже импортировать какой-то список) и привязать их складам. А потом проверять их по названию с определившейся локацией и убирать ненужные склады.

Или другой вариант — без плагина. Т.е. сделать также кастомным типом записей города, привязать их, но без функции определения геолокации пользователя. Реализовать это как-то так, чтобы пользователь мог бы выбирать нужный город на странице и выдавать ему только соответствующие склады.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии