Для настройки синхронизации WooCommerce с МойСклад мы взяли готовый плагин WooMS (автор WPCraft). В процессе работы с расширением выяснилось, что оно существенно устарело и синхронизирует не все данные. Автор не дорабатывает его, поскольку плагин распространяется по принципу «как есть». Чтобы не создавать синхронизацию с нуля, мы решили дополнить функционал модуля отдельными плагинами-аддонами.
Импорт краткого описания и добавление произвольных полей из МойСклад в WordPress
Сначала мы создали мини-плагин для импорта произвольного поля из МойСклад в краткое описание товаров WooCommerce. При активации он добавляет в настройки основного расширения WooMS дополнительные опции:
Настройки аддона для импорта краткого описания: выбор дополнительного поля из МойСклад и активация опции
Плагин получает из МойСклад все дополнительные (кастомные) поля. В настройках достаточно выбрать нужное поле и отметить чекбокс – при ближайшей синхронизации данные этого поля автоматически попадут в краткое описание товаров.
Синхронизация изображений и запасов с обработкой ошибок
В процессе применения основного плагина мы обнаружили, что он некорректно обрабатывает сбои соединения с МойСклад: при ошибке не запускается повторная синхронизация изображений для уже загруженных товаров. Кроме того, при обрывах связи переставало обновляться наличие на складе. В связи с этим мы дополнили функционал ещё одним мини-плагином.
Для синхронизации изображений мы добавили отдельную кнопку «Синхронизировать». При её нажатии сайт подключается к МойСклад и принудительно обновляет все картинки товаров.
Кэширование данных и обход лимитов API МойСклад
На стороне МойСклад действуют ограничения на работу с API (частота соединений и число одновременных запросов). Чтобы не превышать эти лимиты, мы реализовали механизм кэширования минимальных данных о товарах и категориях. При нажатии на кнопку «Копия» в настройках аддона сайт подключается к МойСклад, получает список позиций и рубрик и сохраняет минимальный набор данных в JSON-файлы: для товаров – id, title, slug, price, stock, category; для категорий – id, title, slug. Далее большинство операций работает с локальной копией, что позволяет снизить нагрузку на API.
Управление категориями товаров
Категории товаров – в этом блоке, если не отмечен чекбокс «Записать в базу», выполняется симуляция привязки категорий (выводится таблица с разделами без фактического изменения данных). Такой режим понадобился, когда заказчик временно убирал часть номенклатуры в архив на стороне МойСклад, а затем возвращал – основной плагин не восстанавливал категории, товары оставались без рубрики и получали статус «нет в наличии». При отметке чекбокса происходит реальная запись обновлённых данных в базу.
Названия категорий – со временем часть объединённых категорий переименовывается в отдельные, появляются новые разделы. Основной плагин не обновляет сами категории, поэтому мы добавили такую возможность. Здесь также действует симуляция (без отметки выводится таблица с изменениями), а при активации чекбокса данные записываются в базу.
Интерфейс управления категориями: таблица с существующими разделами и чекбокс для записи изменений в базу данных
Импорт новых товаров из МойСклад
Импорт новых позиций – этот блок отвечает за добавление на сайт товаров, которые появились в МойСклад, но по какой‑то причине не были синхронизированы основным плагином. Поскольку аддон в основном работает с локальной копией, содержащей лишь несколько полей, импорт получается неполным. Если чекбокс не отмечен, происходит симуляция: перебираются все позиции (шаг – 120 товаров) и новые добавляются с ограниченной информацией. На практике этот функционал не пригодился – основной плагин всегда успевал синхронизировать новые товары, поэтому блок пока остаётся в недоработанном виде на случай возможных будущих версий.
Индикатор процесса синхронизации: отображается текущий прогресс (количество обработанных товаров и общее число позиций)
Обновление цен, запасов и удаление товаров
Обновление данных – здесь запускается принудительная синхронизация остатков и цен, а также удаление несуществующих в МойСклад позиций (например, если владелец аккаунта удалил товар, его следует убрать и с сайта). Если чекбоксы не отмечены, работает симуляция: выводится таблица, в которой красным выделены расхождения по наличию или цене.
Товары без категории – при снятом чекбоксе просто отображается таблица с позициями, у которых нет рубрики. При активации создаётся Excel-файл на сервере, содержащий только такие товары – его можно передать владельцу аккаунта МойСклад для анализа и исправления.
Кроме того, мы реализовали функционал для автоматического запуска обновлений по расписанию.
Панель инструментов Wooms: сводка по товарам и раздел для создания локальной копии данных
В настройках можно задать время выполнения задачи и отслеживать её статус. Отсюда же доступен ручной запуск при необходимости.
Раздел про товары без категории немного непонятен. Написано, что создается Excel-файл на сервере - его надо вручную скачивать через FTP или он как-то доступен из админки?
Из админки - там же появляется ссылка для скачивания после генерации. FTP не нужен.
Вопрос по wordpress: аддоны распространяются как отдельные плагины, то есть их нужно устанавливать через стандартную панель или они подключаются как-то иначе?
Устанавливаются как обычные плагины вордпресс: загружаете zip-архив через «Плагины - Добавить новый - Загрузить плагин» и активируете. После активации в настройках WooMS появляются дополнительные разделы.
Понял, спасибо!
Интересно, что блок импорта новых товаров так и остался недоработанным. Это довольно честно написано, не часто такое встретишь в подобных статьях.
А симуляция перед реальной записью данных - это прямо удобно. Сколько раз обжигался на том, что плагин молча переписывал категории без возможности проверить, что изменится. Тут хотя бы можно посмотреть таблицу сначала.
Именно для этого и сделали. Особенно важно было для ситуации с возвратом номенклатуры из архива - заказчику нужно было видеть, что произойдет, прежде чем подтверждать изменения.
Сохранил. Давно искал внятное описание того, как обходить лимиты API МойСклад, не изобретая велосипед с нуля.
Расписание запуска обновлений реализовано через стандартный WP-Cron или через системный cron сервера? Для нагруженных магазинов WP-Cron не всегда надежен.
Через WP-Cron. Для большинства проектов этого достаточно, но если магазин крупный и трафик нестабильный, системный cron надежнее. В этом случае стандартный WP-Cron отключается в wp-config.php и задача вешается напрямую через crontab.
Полезная статья. Возник вопрос по кешированию: JSON-файлы с локальной копией данных хранятся прямо в папке плагина на сервере или куда-то отдельно пишутся?
Пишутся в отдельную папку внутри директории плагина. Туда же попадают файлы для товаров и категорий. При необходимости путь можно изменить под структуру конкретного проекта.
За таблицу расхождений по ценам и остаткам отдельное спасибо. Всегда не хватало такого инструмента перед тем, как подтверждать массовое обновление данных в магазине.
Как раз сейчас разбираюсь с WooCommerce и МойСклад на проекте заказчика. WooMS пробовал, но не понимал, почему картинки не подтягиваются после обрыва соединения. Оказывается, это не у меня руки кривые, а плагин так работает😅
Да, это одна из самых частых жалоб на WooMS. Плагин при ошибке просто останавливается и не пытается повторить синхронизацию. Именно поэтому мы и сделали отдельную кнопку принудительного обновления картинок.