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

Диагностика проблемы с расчетом стоимости доставки

В стандартном WooCommerce стоимость доставки часто рассчитывается на основе фиксированных зон или тарифов, не учитывая вес или габариты товаров в заказе. При продаже товаров с разной упаковкой и весом это может приводить к неправильной стоимости доставки и потерям для магазина или клиентов.

Чтобы понять, нужна ли вам кастомизация, проверьте:

  • Используется ли стандартный способ доставки, который не учитывает вес и размеры?
  • Содержит ли корзина товары с разным весом или габаритами?
  • Есть ли жалобы клиентов на неверную стоимость доставки?

Для диагностики можно включить режим отладки WooCommerce и просмотреть логи расчета доставки в WooCommerce > Статус > Логи. Если стандартные методы не учитывают вес и размеры, переходим к настройке.

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

1. Добавляем пользовательский класс способа доставки

Создадим собственный способ доставки, который будет вычислять цену на основе суммы веса и объема товаров в корзине.

if ( ! class_exists( 'WC_Shipping_Custom_Weight_Size' ) ) {
    class WC_Shipping_Custom_Weight_Size extends WC_Shipping_Method {
        public function __construct() {
            $this->id                 = 'custom_weight_size';
            $this->method_title       = __( 'Доставка по весу и размеру', 'woocommerce' );
            $this->method_description = __( 'Рассчитывает стоимость доставки исходя из веса и размеров заказа.', 'woocommerce' );
            $this->enabled            = 'yes';
            $this->title              = 'Доставка по весу и размеру';

            $this->init();
        }

        public function init() {
            // Здесь можно добавить настройки метода доставки
            $this->init_form_fields();
            $this->init_settings();
        }

        public function calculate_shipping( $package = array() ) {
            $total_weight = 0;
            $total_volume = 0;
            foreach ( $package['contents'] as $item_id => $values ) {
                $product = $values['data'];
                $quantity = $values['quantity'];

                $weight = (float) $product->get_weight();
                $length = (float) $product->get_length();
                $width  = (float) $product->get_width();
                $height = (float) $product->get_height();

                $total_weight += $weight * $quantity;
                $total_volume += $length * $width * $height * $quantity;
            }

            // Базовая ставка доставки
            $base_cost = 100; // в рублях

            // Доплата за вес: 10 руб за 1 кг
            $weight_cost = 10 * $total_weight;

            // Доплата за объем: 0.05 руб за 1 куб. см
            $volume_cost = 0.05 * $total_volume;

            $cost = $base_cost + $weight_cost + $volume_cost;

            $rate = array(
                'id'    => $this->id,
                'label' => $this->title,
                'cost'  => $cost,
                'calc_tax' => 'per_order'
            );

            $this->add_rate( $rate );
        }
    }
}

function add_custom_weight_size_shipping_method( $methods ) {
    $methods['custom_weight_size'] = 'WC_Shipping_Custom_Weight_Size';
    return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_custom_weight_size_shipping_method' );

2. Регистрация и активация метода доставки

После добавления кода в файл functions.php вашей темы или в кастомный плагин, перейдите в админку WooCommerce:

  1. WooCommerce > Настройки > Доставка > Зоны доставки
  2. Выберите нужную зону или создайте новую
  3. Добавьте метод доставки «Доставка по весу и размеру»
  4. Сохраните изменения

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

Чтобы проверить работу метода доставки:

  • Добавьте в корзину товары с разным весом и габаритами (заполните поля "Вес", "Длина", "Ширина", "Высота" в карточках товаров в админке)
  • Перейдите в корзину или оформление заказа
  • Выберите метод доставки «Доставка по весу и размеру»
  • Проверьте, что стоимость доставки меняется в зависимости от состава заказа

Для более точной проверки можно временно вывести переменные $total_weight и $total_volume в лог:

error_log( 'Вес заказа: ' . $total_weight );
error_log( 'Объем заказа: ' . $total_volume );

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

  • Вес или размеры товаров не заполнены: WooCommerce рассчитывает вес и габариты только если они указаны в карточке товара. Проверьте, что у всех товаров указаны эти параметры.
  • Метод доставки не отображается в корзине: убедитесь, что метод добавлен в зону доставки, которая соответствует адресу покупателя.
  • Неверные единицы измерения: WooCommerce по умолчанию использует килограммы для веса и сантиметры для размеров. Если вы используете другие единицы, потребуется конвертация в коде.
  • Кэширование мешает обновлению стоимости: очистите кэш сайта и браузера после внесения изменений.

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

  • Реализуйте проверку и фильтрацию данных веса и размеров, чтобы не допустить ошибок из-за некорректных значений.
  • Если расчет доставки становится ресурсоемким, используйте transient API для кэширования стоимости доставки на короткий период.
  • Для крупных магазинов с большим количеством заказов рассмотрите возможность вынесения расчета стоимости доставки в отдельный сервис или использовать специализированные плагины.

Сравнение способов решения задачи

МетодПлюсыМинусы
Стандартные способы доставки WooCommerceПростота настройки, поддержка по умолчаниюНе учитывают вес и размер, ограниченная гибкость
Плагин для расчета доставки по весу и габаритамГотовое решение, поддержка, обновленияМожет быть платным, лишние функции
Кастомный класс доставки (как в статье)Полный контроль, гибкость, бесплатное решениеТребуется поддержка и тестирование, нужно программирование
Как создать автоматический генератор подсказок в WordPress с помощью WPGPT
10.03.2026
Как добавить автоматическое отключение неиспользуемых плагинов в WordPress
04.04.2026
WooCommerce: автоматическое изменение стоимости доставки по зонам
24.05.2026
WooCommerce: автоматическое изменение заказов при изменении стоимости доставки
30.04.2026
Автоматизация модерации и ответов на отзывы в WordPress с помощью WPGPT
05.03.2026