Главная/WordPress Fullstack/Блупринты/WooCommerce/Пакетная синхронизация цен и складских остатков на 30 000+ товаров через Action Scheduler и WP-CLI
К карточкам раздела «WooCommerce»
WooCommerce(ТЗ 44 из 54)
ТЗ: Пакетная синхронизация цен и складских остатков на 30 000+ товаров через Action Scheduler и WP-CLI
WooCommerce5 шагов • +25 XP

ТЗ: Пакетная синхронизация цен и складских остатков на 30 000+ товаров через Action Scheduler и WP-CLI

Архитектура высокоскоростного импорта остатков из 1C/ERP: фоновые очереди ядра Action Scheduler, кастомная команда WP-CLI, разбиение на пачки по 500 товаров, транзакционные обновления в БД и мгновенная инвалидация кеша transients.

~16 ч работыУровень: SeniorAction Scheduler (WooCommerce Core)WP-CLI Custom Commandwc_get_product_id_by_skuDatabase Transactions ($wpdb)Transient Cache InvalidationMemory Management (gc_collect_cycles)
+5 XP за шаг
Выполнено 0 из 5 шагов (0%)
Трудозатраты~16 рабочих часов
Фриланс вилка~$720 – $1,200 (€640 – €1120)
Оценка веб-студии~$1,520 – $2,560 (€1440 – €2400)

ТЗ заказчика (исходный бриф):

«Каждую ночь 1C выгружает свежий файл с остатками и ценами на 32 000 товаров. Стандартный веб-импорт падает через 60 секунд с 504 Gateway Timeout, успев обновить лишь 800 товаров. Половина цен на сайте остается неактуальной, клиенты жалуются на расхождения. Нужен сверхбыстрый и надежный импорт без блокировки сайта!»
Ключевые требования:
  • •Разработка фонового конвейера синхронизации на базе Action Scheduler для работы без риска таймаутов веб-сервера
  • •Кастомная команда WP-CLI wp agenticlab sync-catalog для запуска синхронизации по системному Cron на сервере
  • •Пакетная обработка (batching): разбиение 30 000+ записей на порции по 500 штук с очисткой оперативной памяти
  • •Прямое транзакционное обновление цен и складских остатков в таблицах postmeta / wc_product_meta_lookup
  • •Инвалидация кеша transients (цены и остатки вариаций) и автоматическое обновление статуса наличия (instock / outofstock)
Ограничения проекта:
  • •Сайт не должен замедляться для покупателей во время ночной синхронизации
  • •Потребление оперативной памяти PHP не должно превышать 256 МБ
  • •Логирование всех расхождений и отсутствующих артикулов (SKU) в отдельный файл логов
Критерии приёмки (KPI):
  • Полное обновление 30 000 товаров менее чем за 4 минуты через CLI
  • 0 падений по таймаутам или переполнению памяти
  • Мгновенное отображение актуальных цен на сайте сразу после завершения импорта

Конфигурация блупринта под условия проекта

Выберите архитектуру и стек — шаги роадмапа, структура файлов и примеры кода переключатся автоматически:

Пошаговое практическое руководство по ТЗ

Подробный разбор архитектуры, код реализации и советы эксперта по каждому этапу:

1
Этап 1 из 5

Архитектура пакетной очереди на базе Action Scheduler

~50 минСложный

Практическое руководство:

Спроектируйте архитектуру очередей: входящий JSON/CSV файл читается потоково через генератор (yield), разбивается на батчи по 500 товаров, и каждый батч регистрируется в очереди через as_enqueue_async_action.

План и контрольные точки реализации:
1Реализовать потоковое чтение файла остатков через PHP Generator
2Разбивать массив позиций на чанки по 500 элементов
3Регистрировать асинхронные задачи в Action Scheduler
Важные технические нюансы и подводные камни:

Потоковое чтение гарантирует минимальное потребление RAM даже на файлах размером 100 МБ.

Совет эксперта (Best Practice):

Группировка задач в Action Scheduler: Третий параметр as_enqueue_async_action (agenticlab_catalog_sync) задает группу задач. Это позволяет в любой момент отследить прогресс пачки или отменить оставшиеся задачи. (Важно: Никогда не читайте 50 МБ файл функцией file_get_contents() — используйте fopen/fgetcsv.)

Ожидаемый артефакт этапа:

Устойчивая архитектура распределения нагрузки на ядро WooCommerce.

PHP
<?php
declare(strict_types=1);

class AgenticLab_Catalog_Queue {
    public static function dispatch_sync_job(string $file_path): int {
        if (!file_exists($file_path)) {
            throw new \InvalidArgumentException('Файл выгрузки не найден: ' . $file_path);
        }

        $batch = [];
        $batch_size = 500;
        $total_batches = 0;

        $handle = fopen($file_path, 'r');
        // Пропускаем заголовок CSV:
        fgetcsv($handle);

        while (($row = fgetcsv($handle)) !== false) {
            // [0 => SKU, 1 => Price, 2 => StockQty]
            $batch[] = [
                'sku'   => trim($row[0]),
                'price' => (float) $row[1],
                'stock' => (int) $row[2],
            ];

            if (count($batch) >= $batch_size) {
                as_enqueue_async_action('agenticlab_process_stock_batch', [$batch], 'agenticlab_catalog_sync');
                $batch = [];
                $total_batches++;
            }
        }
        fclose($handle);

        if (!empty($batch)) {
            as_enqueue_async_action('agenticlab_process_stock_batch', [$batch], 'agenticlab_catalog_sync');
            $total_batches++;
        }

        return $total_batches;
    }
}
2
Этап 2 из 5

Высокоскоростное обновление остатков через wp_wc_product_meta_lookup

~60 минСложный
3
Этап 3 из 5

Кастомная WP-CLI команда для запуска по системному Cron

~45 минСредний
4
Этап 4 из 5

Инвалидация кешей WooCommerce и сброс transients

~35 минСредний
5
Этап 5 из 5

Контрольный замер времени и стресс-тест на 30 000 товаров

~30 минЛегкий

Типичные грабли на этом ТЗ

2 антипаттерна

Инструменты экосистемы Fullstack AI Lab для этого ТЗ

Интеграция