Сценарий знакомый: вы меняете цену, остаток, артикул или атрибуты вариации, нажимаете «Обновить», а после перезагрузки часть полей откатывается назад. Иногда проблема проявляется только у отдельных товаров, иногда — после импорта, миграции или установки плагина для оптимизации. В WooCommerce это обычно не одна причина, а комбинация: конфликт сохранения мета-полей, битые данные вариаций, ограничения PHP, кэш или вмешательство стороннего кода.
Ниже — практический разбор, как локализовать источник и исправить ситуацию без ручного пересоздания товара.
Как понять, что проблема именно в сохранении вариаций
Сначала важно отделить сбой интерфейса от реального отказа сохранения. Если в админке поля выглядят заполненными, но на фронтенде отображаются старые значения, это уже не просто визуальный глюк. Если же изменения исчезают сразу после нажатия «Обновить», чаще всего проблема в обработке данных на сервере.
Типичные признаки
- цена вариации сохраняется только для части вариантов;
- остаток сбрасывается после редактирования товара;
- SKU или статус наличия не переживают повторное открытие товара;
- после импорта CSV вариации открываются, но не редактируются стабильно;
- в журнале ошибок появляются предупреждения о
post meta,max_input_varsили нехватке памяти.
Что проверить в первую очередь
- не включён ли кэш страницы товара на уровне плагина, сервера или CDN;
- не отключает ли тема стандартные шаблоны WooCommerce;
- не стоит ли плагин, который фильтрует сохранение метаданных;
- не превышен ли лимит
max_input_varsпри большом количестве вариаций; - не повреждены ли данные конкретного товара после импорта или массового редактирования.
Диагностика: где ломается сохранение
Если товар один и проблема повторяется только у него, начните с проверки данных в базе. Для вариативного товара WooCommerce хранит основную запись товара и отдельные записи вариаций. Когда одна из вариаций повреждена, админка может вести себя нестабильно: часть полей сохраняется, часть — нет.
Удобно сначала проверить, есть ли у товара дочерние вариации и не дублируются ли метаданные. Для этого можно временно вывести список вариаций через код в тестовой среде или через WP-CLI, если он доступен.
global $wpdb;
$product_id = 123;
$variation_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'product_variation'",
$product_id
) );
foreach ( $variation_ids as $variation_id ) {
$price = get_post_meta( $variation_id, '_regular_price', true );
$stock = get_post_meta( $variation_id, '_stock', true );
error_log( sprintf( 'Variation %d: price=%s stock=%s', $variation_id, $price, $stock ) );
}Если значения в базе есть, а в админке они не сохраняются после редактирования, проблема часто не в данных, а в процессе сохранения. Тогда смотрите на плагины, которые вмешиваются в save_post, woocommerce_admin_process_variation_object или фильтры мета-данных.
Рабочие способы исправления
1. Увеличить лимит входных переменных
Когда у товара много вариаций и атрибутов, PHP может молча обрезать часть POST-данных. В результате WooCommerce получает не весь набор полей, и часть изменений не доходит до сохранения. Это особенно заметно на товарах с десятками вариаций и несколькими атрибутами.
Проверьте текущие значения в phpinfo() или через хостинг-панель. Если max_input_vars низкий, поднимите его до разумного значения на уровне PHP-FPM, .user.ini или панели хостинга.
; php.ini или .user.ini
max_input_vars = 5000
memory_limit = 256M
post_max_size = 64M
upload_max_filesize = 64MПосле изменения перезапустите PHP, если это требуется на вашем хостинге, и повторите сохранение товара.
2. Отключить конфликтующие плагины на время проверки
Если изменения не сохраняются только при активном наборе плагинов, ищите конфликт. Чаще всего мешают плагины для кэширования, оптимизации базы, массового редактирования товаров и фильтрации админки. Для проверки не нужно отключать всё подряд навсегда — достаточно сделать чистый тест на staging-копии.
| Подход | Когда подходит | Минус |
|---|---|---|
| Отключить плагины по одному | Если проблема появилась после установки расширения | Долго на большом сайте |
| Тест на staging | Если нельзя рисковать боевым магазином | Нужна копия окружения |
| Снижение кэша и оптимизаций | Если ломается только админка товара | Нужно аккуратно исключать страницы |
3. Проверить, не перехватывается ли сохранение мета-полей
Если у вас есть кастомный код в теме или мини-плагине, он может случайно перезаписывать метаданные вариаций. Типичный пример: разработчик сохраняет свои поля на save_post_product и не ограничивает логику только нужными ключами. В итоге при обновлении товара WooCommerce получает уже изменённые значения.
Безопаснее работать через хуки WooCommerce для вариаций и проверять nonce, тип запроса и наличие нужных полей. Пример ниже показывает, как сохранить дополнительное поле вариации без вмешательства в стандартные данные:
add_action( 'woocommerce_save_product_variation', function( $variation_id, $i ) {
if ( ! isset( $_POST['my_variation_note'][ $i ] ) ) {
return;
}
$note = sanitize_text_field( wp_unslash( $_POST['my_variation_note'][ $i ] ) );
update_post_meta( $variation_id, '_my_variation_note', $note );
}, 10, 2 );Если у вас уже есть похожий код в теме, временно отключите его и повторите сохранение стандартных полей вариации. Если проблема исчезла, причина найдена.
4. Пересохранить проблемный товар через чистую админку
Иногда товар сохраняется некорректно после импорта или миграции. В таком случае помогает не массовое редактирование, а ручное открытие товара в штатной админке WooCommerce и повторное сохранение без лишних полей. Это не магия, а способ заставить WooCommerce пересобрать внутренние данные вариаций.
Если после этого значения стабилизируются, значит, исходный объект товара содержал неконсистентные данные. Тогда стоит проверить источник импорта и логику генерации вариаций.
Как проверить, что исправление сработало
Проверка должна быть не только визуальной. После изменения цены или остатка сделайте три шага:
- откройте товар в админке и убедитесь, что значение осталось на месте после обновления страницы;
- проверьте карточку товара на фронтенде в режиме инкогнито;
- если используется кэш, очистите его и повторите проверку ещё раз.
Для технической проверки можно сравнить метаданные вариации до и после сохранения:
$variation_id = 456;
var_dump(
get_post_meta( $variation_id, '_regular_price', true ),
get_post_meta( $variation_id, '_stock', true ),
get_post_meta( $variation_id, '_sku', true )
);Если значения совпадают в базе, админке и на фронтенде, проблема устранена. Если в базе всё верно, а на сайте старые данные — ищите кэш или CDN. Если в базе уже пусто или значения обрезаются, возвращайтесь к лимитам PHP и конфликтам сохранения.
Частые ошибки и как их исправить
Кэшируют не только фронтенд, но и админку
Иногда плагин оптимизации по ошибке затрагивает страницы редактирования товара или AJAX-запросы WooCommerce. Это ломает сохранение и создаёт иллюзию, что данные не записываются. Админку и /wp-admin/ нужно исключать из любых правил кэширования и минификации.
Слишком агрессивная оптимизация JavaScript
Если в админке объединяются или откладываются скрипты, форма вариаций может работать нестабильно. В таком случае отключите оптимизацию именно для страниц редактирования товара, а не для всего сайта.
Неправильная обработка массива вариаций
При кастомизации кода часто забывают, что поля вариаций приходят массивом по индексу $i. Если сохранить одно значение без привязки к индексу, оно уедет в другую вариацию или перезапишет соседнюю.
Импорт без последующей валидации
CSV-импорт может создать товар, который формально существует, но содержит неполные данные. После импорта всегда открывайте несколько вариаций вручную и проверяйте, что поля действительно сохранились.
Практические советы по безопасности и производительности
Если вы правите проблему кодом, не вносите изменения прямо в functions.php активной темы. Лучше вынести логику в небольшой mu-plugin или отдельный мини-плагин, чтобы она не исчезла при обновлении темы. Для магазина это особенно важно: ошибка в коде на сохранении товара может заблокировать работу админки.
Перед массовым пересохранением товаров сделайте резервную копию базы. Если вариаций много, любое неудачное действие в админке может затронуть не один товар, а целую группу. Для регулярной чистки и снижения риска дублей в WooCommerce иногда помогает Clearfy Pro, но он не заменяет диагностику конкретной ошибки сохранения.
Если проблема повторяется только на одном сервере, проверьте логи PHP и лимиты хостинга. Для WooCommerce это часто полезнее, чем бесконечно менять плагины местами.
Когда стоит идти глубже в код
Если стандартные проверки не помогли, нужно смотреть, кто именно пишет в мета-поля товара. В таких случаях удобно временно логировать вызовы сохранения и сравнивать, какие значения приходят в момент обновления. Это уже не «починка на глаз», а нормальная отладка.
Хорошая практика — сначала воспроизвести проблему на staging, потом отключить все нестандартные обработчики сохранения, и только после этого возвращать их по одному. Так вы найдёте не симптом, а реальную причину.