Автоматическое изменение веса продукта в WooCommerce при обновлении атрибутов

Диагностика задачи: зачем автоматизировать изменение веса в WooCommerce

В интернет-магазинах на WooCommerce вес товара влияет не только на отображение, но и на расчёт стоимости доставки. При использовании вариаций или атрибутов, например, размера или комплектации, вес может меняться, и вручную обновлять его неудобно и чревато ошибками.

Типичная проблема — вес товара не соответствует выбранным вариациям, что приводит к неправильным тарифам на доставку и недовольству клиентов.

Как отследить обновление атрибутов и автоматически менять вес

Для автоматизации нам понадобятся хуки WooCommerce, которые срабатывают при сохранении товара и его вариаций, и функция обновления метаполя веса.

Используем хук save_post_product для простых товаров и woocommerce_save_product_variation для вариаций

Пример кода, который при сохранении продукта проверяет атрибуты и меняет вес:

add_action('save_post_product', 'wpset_update_product_weight_on_save', 20, 3);
function wpset_update_product_weight_on_save($post_ID, $post, $update) {
    if (wp_is_post_revision($post_ID)) {
        return;
    }

    $product = wc_get_product($post_ID);
    if (!$product) {
        return;
    }

    // Пример: если у товара есть атрибут "Size" с значением "Large", увеличим вес
    $attributes = $product->get_attributes();
    if (isset($attributes['pa_size'])) {
        $values = wc_get_product_terms($post_ID, 'pa_size', array('fields' => 'names'));
        if (in_array('Large', $values)) {
            $product->set_weight('2'); // Вес 2 кг
        } else {
            $product->set_weight('1'); // Вес 1 кг
        }
        $product->save();
    }
}

Для вариаций:

add_action('woocommerce_save_product_variation', 'wpset_update_variation_weight_on_save', 10, 1);
function wpset_update_variation_weight_on_save($variation_id) {
    $variation = wc_get_product($variation_id);
    if (!$variation) {
        return;
    }

    $attributes = $variation->get_attributes();
    if (isset($attributes['pa_size'])) {
        if ($attributes['pa_size'] === 'large') {
            $variation->set_weight('2');
        } else {
            $variation->set_weight('1');
        }
        $variation->save();
    }
}

Пошаговое решение для внедрения автоматического обновления веса

  1. Определите атрибуты, которые влияют на вес. Обычно это размер, комплектация, материал.
  2. Добавьте код в functions.php вашей темы или в кастомный плагин.
  3. Настройте условия в функции, чтобы вес корректно обновлялся в зависимости от выбранных атрибутов.
  4. Проверьте работу на тестовом товаре: измените атрибут, сохраните продукт и убедитесь, что вес изменился.
  5. Для вариаций проделайте то же самое: измените вариацию, сохраните и проверьте вес.

Проверка результата после внедрения

  • Откройте товар в админке WooCommerce.
  • Смените значение атрибута, влияющего на вес.
  • Сохраните товар или вариацию.
  • Проверьте значение веса в полях продукта.
  • На фронтенде в карточке товара или при оформлении заказа убедитесь, что вес передаётся корректно.
  • Проверьте расчёт стоимости доставки, если она зависит от веса.

Частые ошибки и как их исправить

  • Вес не обновляется после сохранения: Проверьте, что хук подключён с правильным приоритетом и что функция получает правильный ID продукта.
  • Атрибуты не распознаются: Убедитесь, что используете правильный слаг атрибута, например pa_size. Атрибуты WooCommerce всегда с префиксом pa_.
  • Изменения не сохраняются: После установки веса вызывайте $product->save() или $variation->save().
  • Проблемы с вариациями: Для вариаций используйте хук woocommerce_save_product_variation, а не save_post_product.

Практические советы по безопасности и производительности

  • Не выполняйте тяжелые вычисления в хуках сохранения, чтобы не замедлять работу админки.
  • Кэшируйте часто используемые данные, если вес зависит от внешних источников.
  • Проверяйте входные данные атрибутов на корректность, чтобы избежать ошибок.
  • Используйте детальный лог ошибок для отладки (например, через error_log()).

Сравнение вариантов автоматического обновления веса

МетодПлюсыМинусыКомпромисс
Код в functions.phpПолный контроль, нет лишних плагиновТребует навыков разработки, возможны ошибкиПодходит для уникальных условий
Плагины для управления весом вариацийПростота установки, готовые решенияМожет быть излишне громоздким, платныеБыстрое внедрение, но меньше гибкости
Как создать уникальный вид записи в WordPress с помощью кода
30.01.2026
Автоматический импорт товаров из YML в WordPress: пошаговое руководство
05.02.2026
WooCommerce: автоматическое удаление отсутствующих вариаций товаров
29.05.2026
Решение проблемы неработающего AJAX в WordPress
16.02.2026
Автоматическое изменение веса продукта в WooCommerce при обновлении атрибутов
21.05.2026