Диагностика задачи: зачем автоматизировать изменение веса в 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();
}
}Пошаговое решение для внедрения автоматического обновления веса
- Определите атрибуты, которые влияют на вес. Обычно это размер, комплектация, материал.
- Добавьте код в functions.php вашей темы или в кастомный плагин.
- Настройте условия в функции, чтобы вес корректно обновлялся в зависимости от выбранных атрибутов.
- Проверьте работу на тестовом товаре: измените атрибут, сохраните продукт и убедитесь, что вес изменился.
- Для вариаций проделайте то же самое: измените вариацию, сохраните и проверьте вес.
Проверка результата после внедрения
- Откройте товар в админке WooCommerce.
- Смените значение атрибута, влияющего на вес.
- Сохраните товар или вариацию.
- Проверьте значение веса в полях продукта.
- На фронтенде в карточке товара или при оформлении заказа убедитесь, что вес передаётся корректно.
- Проверьте расчёт стоимости доставки, если она зависит от веса.
Частые ошибки и как их исправить
- Вес не обновляется после сохранения: Проверьте, что хук подключён с правильным приоритетом и что функция получает правильный ID продукта.
- Атрибуты не распознаются: Убедитесь, что используете правильный слаг атрибута, например
pa_size. Атрибуты WooCommerce всегда с префиксомpa_. - Изменения не сохраняются: После установки веса вызывайте
$product->save()или$variation->save(). - Проблемы с вариациями: Для вариаций используйте хук
woocommerce_save_product_variation, а неsave_post_product.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые вычисления в хуках сохранения, чтобы не замедлять работу админки.
- Кэшируйте часто используемые данные, если вес зависит от внешних источников.
- Проверяйте входные данные атрибутов на корректность, чтобы избежать ошибок.
- Используйте детальный лог ошибок для отладки (например, через
error_log()).
Сравнение вариантов автоматического обновления веса
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код в functions.php | Полный контроль, нет лишних плагинов | Требует навыков разработки, возможны ошибки | Подходит для уникальных условий |
| Плагины для управления весом вариаций | Простота установки, готовые решения | Может быть излишне громоздким, платные | Быстрое внедрение, но меньше гибкости |