Диагностика задачи: зачем нужен собственный тип доставки в WooCommerce
Стандартные методы доставки WooCommerce покрывают большинство сценариев, но иногда требуется добавить уникальный тип доставки с собственным алгоритмом расчёта стоимости — например, доставка по зонам с учётом веса и времени суток. Такая задача требует создания собственного класса доставки и подключения его через хуки WooCommerce.
Пошаговое решение: создание и подключение собственного метода доставки
1. Создаём класс метода доставки
В файле functions.php вашей темы или в кастомном плагине добавьте следующий код:
if ( ! class_exists( 'WC_Custom_Shipping_Method' ) ) {
class WC_Custom_Shipping_Method extends WC_Shipping_Method {
public function __construct() {
$this->id = 'custom_shipping';
$this->method_title = __( 'Custom Shipping', 'woocommerce' );
$this->method_description = __( 'Custom Shipping Method with dynamic cost calculation', 'woocommerce' );
$this->enabled = 'yes';
$this->title = 'Custom Delivery';
$this->init();
}
function init() {
// Инициализация опций
$this->init_form_fields();
$this->init_settings();
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
}
public function calculate_shipping( $package = array() ) {
$cost = 0;
$weight = 0;
foreach ( $package['contents'] as $item_id => $values ) {
$_product = $values['data'];
$weight += $_product->get_weight() * $values['quantity'];
}
// Пример: стоимость доставки зависит от веса
if ( $weight <= 1 ) {
$cost = 5;
} elseif ( $weight <= 5 ) {
$cost = 10;
} else {
$cost = 20;
}
// Добавим надбавку за вечернюю доставку (18:00-23:59)
$hour = (int) current_time( 'H' );
if ( $hour >= 18 && $hour <= 23 ) {
$cost += 5;
}
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => $cost,
'calc_tax' => 'per_order'
);
// Регистрируем стоимость доставки
$this->add_rate( $rate );
}
}
}2. Регистрируем метод доставки в WooCommerce
Добавьте этот код для подключения метода доставки:
function add_custom_shipping_method( $methods ) {
$methods['custom_shipping'] = 'WC_Custom_Shipping_Method';
return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_custom_shipping_method' );3. Активация и настройка
Перейдите в WooCommerce -> Настройки -> Доставка. Создайте зону доставки (например, «Россия»), добавьте туда метод Custom Shipping и активируйте его. При оформлении заказа в зоне будет показываться ваш новый тип доставки с динамическим расчетом стоимости.
Проверка результата после внедрения
- Добавьте в корзину товары с разным весом, проверьте, что стоимость доставки меняется согласно логике.
- Оформите заказ в разное время суток, чтобы убедиться, что надбавка за вечернюю доставку учитывается.
- Посмотрите страницу оформления заказа, метод доставки должен отображаться с корректной ценой.
Частые ошибки и как исправить
- Метод не появляется в списке доставок – проверьте регистрацию класса и фильтр
woocommerce_shipping_methods, а также активность метода в настройках. - Стоимость доставки всегда 0 – убедитесь, что функция
calculate_shippingкорректно вызывает$this->add_rate()с правильными параметрами. - Ошибка о неопределённом классе – подключите класс до регистрации метода, избегайте условий, которые блокируют загрузку.
- Вес товаров не учитывается – проверьте, что у товаров заполнено поле веса; используйте методы
get_weight()у объекта продукта.
Практические советы по безопасности и производительности
- Не используйте глобальные переменные, весь код должен быть инкапсулирован в классах и функциях.
- Для сложных расчетов стоимости с внешними API выполняйте запросы с кешированием, чтобы не замедлять оформление заказа.
- Не записывайте чувствительные данные в сессии или куки, используйте встроенные методы WooCommerce для хранения данных.
- Тестируйте метод доставки на staging-среде, чтобы избежать сбоев на живом сайте.
Сравнение методов добавления доставки в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин готовый | Быстро, без кода | Может не подходить под уникальные сценарии | Стандартные задачи доставки |
| Кастомный класс доставки | Полный контроль, гибкость | Требует навыков разработки | Уникальные требования к расчету стоимости |
| Хуки и фильтры для существующих методов | Простая модификация | Ограничена функционалом стандартных методов | Незначительные изменения в логике |