Диагностика проблемы: почему стандартный импорт WooCommerce не всегда подходит
При массовом обновлении товаров через CSV часто возникает необходимость не просто загрузить данные, а автоматически корректировать цены и наличие товаров по определённым правилам. Стандартный импорт WooCommerce (через встроенный импортёр или плагин WP All Import) хорошо работает с прямым обновлением, но не поддерживает сложную логику изменения данных во время импорта. В результате приходится вручную корректировать данные или запускать отдельные скрипты после импорта.
Основные симптомы:
- Импорт обновляет цены и статус наличия, но без учёта бизнес-правил (скидки, минимальные/максимальные значения и т.п.).
- Необходимость менять цену в зависимости от старой цены, например, увеличивать на 10% или снижать при распродаже.
- Невозможно автоматически установить статус "в наличии" или "нет в наличии" при определённых условиях.
Пошаговое решение: автоматическое изменение цены и наличия при импорте CSV
1. Подготовка CSV и определение правил
В CSV должны быть обязательные поля для идентификации товара (ID или SKU) и исходные данные цены и наличия. Правила изменения можно задать в коде, например:
- Если цена больше 1000, снизить на 15%
- Если цена меньше 1000, увеличить на 5%
- Если количество на складе равно 0, установить статус "нет в наличии"
2. Использование хука woocommerce_product_import_inserted_product_object
WooCommerce запускает этот хук после импорта каждого товара. Можно использовать его для динамической коррекции цены и статуса наличия.
add_action('woocommerce_product_import_inserted_product_object', 'custom_update_price_and_stock', 10, 1);function custom_update_price_and_stock($product) { $price = floatval($product->get_regular_price()); $stock_quantity = $product->get_stock_quantity(); // Изменяем цену по условию if ($price > 1000) { $new_price = $price * 0.85; // скидка 15% } else { $new_price = $price * 1.05; // наценка 5% } $product->set_regular_price(round($new_price, 2)); // Обновляем статус наличия if ($stock_quantity === 0) { $product->set_stock_status('outofstock'); } else { $product->set_stock_status('instock'); } $product->save();}3. Импорт CSV
Запускаем импорт стандартным средством WooCommerce или плагином. После создания или обновления каждого товара сработает функция, которая подкорректирует цену и наличие.
Проверка результата после внедрения
- После импорта откройте карточку любого товара, чтобы убедиться в изменении цены и статуса наличия.
- Проверьте в админке WooCommerce в списке товаров столбцы "Цена" и "Наличие" — должны соответствовать правилам из кода.
- Можно вывести в консоль или лог значения в функции для отладки, добавив
error_log()с ключевыми параметрами.
Частые ошибки и как их исправить
- Изменения не применяются: возможно, хук не подключён или приоритет слишком низкий. Проверьте, что функция подключена в файле functions.php активной темы или в плагине, и приоритет 10.
- Цена не обновляется: убедитесь, что цена доступна и корректно преобразуется в число. Проверьте, что
get_regular_price()возвращает значение. - Статус наличия не меняется: убедитесь, что управление запасами включено для товаров (
$product->get_manage_stock()возвращает true). Если нет, включите в настройках WooCommerce или установите через код. - Ошибки при сохранении: могут быть конфликты с плагинами кеширования или безопасности. Временно отключите их для теста.
Практические советы по безопасности и производительности
- Используйте
wp_cache_flush()после массового импорта, если работаете с кеширующими плагинами, чтобы обновить данные. - Для больших CSV используйте WP-CLI import или разбивайте файлы на части, чтобы избежать таймаутов.
- Всегда делайте резервную копию базы перед массовым импортом и изменениями.
- Не используйте сложные вычисления в функции обработки каждого товара — это замедлит импорт.
Сравнение вариантов изменения цены и наличия при импорте CSV
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Стандартный импорт WooCommerce | Простота, встроенный | Нет логики изменения, только замена данных | Подходит для простых обновлений |
| Плагин WP All Import с PHP-скриптами | Гибкость, мощные настройки | Платный, требует изучения | Для сложных проектов и регулярных обновлений |
Кастомный хук woocommerce_product_import_inserted_product_object | Полный контроль, бесплатно | Нужны навыки PHP, сложнее настраивать | Оптимально для разработчиков, готовых к кастомизации |