Сценарий знакомый: импорт прошёл без ошибок, товар в админке выглядит нормально, но на витрине у вариаций остаются старые цены, а остатки не совпадают с данными из файла. Чаще всего проблема не в самом WooCommerce, а в том, как именно импорт обновляет посты, мета-поля и кэш вариаций.
Ниже разберём, где ломается синхронизация, как быстро проверить источник сбоя и что сделать, чтобы цена и остаток у вариативных товаров обновлялись предсказуемо.
Как понять, где именно ломается обновление
У вариативных товаров WooCommerce хранит данные не только в карточке родительского товара, но и в каждой вариации отдельно. Если импорт обновил только родительский товар или записал значения в нестандартные поля, витрина продолжит показывать старые данные.
Что проверить в первую очередь
- обновляются ли записи типа
product_variationили только родительскийproduct; - меняются ли мета-поля
_regular_price,_sale_price,_price,_stock,_stock_status; - не включён ли кэш страницы, объектный кэш или кэш на уровне CDN;
- не используется ли импортёр, который пишет данные в товар, но не пересчитывает вариации;
- не остались ли старые транзиенты WooCommerce.
Если в базе значения уже новые, а на сайте старые, это почти всегда кэш или не пересчитанные данные вариаций. Если в базе старые — проблема в импорте или в маппинге полей.
Почему это происходит после импорта
У WooCommerce есть несколько уровней данных, и импорт может обновить только часть из них. Например, цена вариации может быть записана в _regular_price, но фронтенд берёт значение из _price. Для остатков похожая история: если поменяли _stock, но не обновили _stock_status, товар может остаться в статусе «в наличии» или наоборот.
Ещё одна частая причина — импортёр создаёт или обновляет вариации через прямую запись в базу, но не вызывает внутренние методы WooCommerce, которые пересчитывают диапазон цен, доступность вариаций и кэш.
Пошаговое решение без лишней магии
1. Убедитесь, что импорт обновляет именно вариации
Если у вас CSV, XML или собственный скрипт, проверьте, что каждая вариация получает свой ID или свой уникальный набор атрибутов. Для WooCommerce важно, чтобы обновление шло по конкретной вариации, а не только по родительскому товару.
Если вы пишете свой импорт, ориентируйтесь на API WooCommerce, а не на прямой SQL. Пример обновления вариации через объект:
$variation = new WC_Product_Variation( $variation_id );
$variation->set_regular_price( '1990' );
$variation->set_sale_price( '1490' );
$variation->set_price( '1490' );
$variation->set_stock_quantity( 12 );
$variation->set_stock_status( 'instock' );
$variation->save();После сохранения WooCommerce сам обновит часть внутренних данных. Но если импорт массовый, этого может быть недостаточно — нужно ещё сбросить кэш и пересчитать родительский товар.
2. Пересчитайте данные родительского товара
Когда меняются вариации, родительский товар тоже должен получить актуальные диапазоны цен и статусы. Для этого можно пройтись по импортированным товарам и вызвать пересчёт.
function wpcontent_rebuild_variable_product( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->is_type( 'variable' ) ) {
return;
}
WC_Product_Variable::sync( $product_id );
wc_delete_product_transients( $product_id );
}
// Пример вызова после импорта
wpcontent_rebuild_variable_product( 123 );Метод WC_Product_Variable::sync() используется в WooCommerce для синхронизации данных вариативного товара. Это не универсальная панацея, но в типовом кейсе с импортом помогает вернуть витрину в актуальное состояние.
3. Очистите транзиенты и кэш страниц
Если данные в админке уже правильные, а на витрине всё ещё старое, очистите кэш WooCommerce и кэш плагина/сервера. Для точечной очистки по товару достаточно удалить транзиенты конкретного продукта. Для массового импорта иногда проще запускать очистку после завершения пачки, а не после каждой записи.
Если у вас есть собственный импортный скрипт, не делайте полную очистку кэша на каждом товаре — это лишняя нагрузка. Лучше собрать список изменённых ID и обработать их один раз в конце.
Практический вариант для массового импорта
Если импорт идёт по расписанию или через отдельный обработчик, удобно после завершения цикла пройтись по списку изменённых товаров и пересчитать только их. Ниже пример, который можно встроить в свой код:
$updated_product_ids = array( 123, 124, 125 );
foreach ( $updated_product_ids as $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
continue;
}
if ( $product->is_type( 'variable' ) ) {
WC_Product_Variable::sync( $product_id );
}
wc_delete_product_transients( $product_id );
}Если импорт обновляет только вариации, а родительские товары не трогает, всё равно имеет смысл синхронизировать родителя. Иначе диапазон цен может остаться старым даже при корректных мета-полях у дочерних записей.
Когда нужен не код, а настройка импорта
Иногда проблема не в WooCommerce, а в самом инструменте импорта. У некоторых плагинов есть отдельная опция вроде «обновлять существующие вариации», «сопоставлять по SKU» или «пересчитывать цены после импорта». Если такая настройка есть, её стоит включить до того, как лезть в код.
Сравнение подходов:
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройка импортёра | Типовой CSV/XML импорт | Зависит от возможностей плагина |
| Код через WooCommerce API | Собственный импорт или сложный маппинг | Нужно следить за пересчётом и кэшем |
| Прямая запись в БД | Почти никогда | Легко сломать кэш, статусы и диапазоны цен |
Как проверить, что решение сработало
После внедрения не ограничивайтесь просмотром карточки товара в админке. Проверьте несколько уровней сразу:
- откройте вариативный товар на витрине в режиме инкогнито;
- выберите каждую вариацию и убедитесь, что цена меняется корректно;
- проверьте остаток в админке и на фронтенде;
- если есть фильтры по атрибутам, убедитесь, что товар не пропал из выдачи из-за неверного статуса;
- посмотрите, не остались ли старые значения в кэше страницы.
Если у вас есть доступ к базе, можно точечно проверить мета-поля вариации в таблице wp_postmeta. Для вариативного товара важны как минимум _regular_price, _sale_price, _price, _stock и _stock_status.
Частые ошибки и как их исправить
Обновили только _regular_price
WooCommerce может продолжать показывать старую цену, если не обновлён _price. Для витрины это критично. При записи цены синхронизируйте оба поля через объект товара или убедитесь, что импортёр делает это сам.
Не пересчитали родительский товар
У вариативного товара диапазон цен и доступность собираются из дочерних вариаций. Если родитель не синхронизирован, на странице может отображаться старый диапазон или некорректный статус.
Сразу чистят весь кэш сайта
Полная очистка кэша после каждой вариации создаёт лишнюю нагрузку. При массовом импорте лучше очищать кэш пакетно, после завершения обработки группы товаров.
Импортируют по названию, а не по SKU или ID
Если в каталоге есть похожие товары, импорт по названию легко обновит не ту запись или создаст дубликаты. Для вариативных товаров безопаснее использовать стабильный ключ: SKU, внешний ID или связку атрибутов.
Пишут в базу напрямую
Это самый рискованный вариант. Можно обновить мета-поля, но забыть про кэш, транзиенты, связи вариаций и пересчёт родителя. В результате данные будут «правильными» только на уровне SQL, но не в WooCommerce.
Что учесть для производительности и безопасности
Если импорт большой, не запускайте синхронизацию на каждом шаге без необходимости. Сначала соберите список изменённых товаров, потом обработайте их пачкой. Это уменьшает количество лишних запросов и снижает шанс словить таймаут.
Если импорт идёт из внешнего источника, проверяйте входные данные до записи: цена должна быть числом, остаток — целым значением, статус — только из допустимых вариантов instock, outofstock или onbackorder. Не пропускайте в импорт произвольные строки из CSV без валидации.
Если нужен более системный контроль за чистотой сайта и WooCommerce-данных, иногда удобнее вынести часть рутинных задач в отдельный инструмент вроде Clearfy Pro, но саму синхронизацию вариаций всё равно лучше держать под контролем в логике импорта или в собственном коде.
Когда цена и остаток у вариаций не обновляются после импорта, почти всегда помогает одна из трёх вещей: корректная запись в мета-поля, синхронизация родительского товара и очистка кэша. Если сделать эти шаги в правильном порядке, проблема обычно уходит без ручного редактирования каждой вариации.