Что такое собственный тип доставки в 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 = __( 'Собственная доставка', 'woocommerce' );
$this->method_description = __( 'Кастомный метод доставки с фиксированной ставкой.', 'woocommerce' );
$this->enabled = 'yes';
$this->title = 'Курьерская доставка';
$this->init();
}
function init() {
// Загружаем настройки
$this->init_form_fields();
$this->init_settings();
$this->cost = isset( $this->settings['cost'] ) ? $this->settings['cost'] : 0;
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
}
public function calculate_shipping( $package = array() ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => $this->cost,
'calc_tax' => 'per_order'
);
$this->add_rate( $rate );
}
}
}2. Регистрируем метод доставки в WooCommerce
Добавьте регистрацию класса методом в 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. Настройка стоимости доставки в админке
Вы можете добавить поле для настройки стоимости доставки:
public function init_form_fields() {
$this->form_fields = array(
'enabled' => array(
'title' => __( 'Включить', 'woocommerce' ),
'type' => 'checkbox',
'description' => __( 'Включить этот способ доставки', 'woocommerce' ),
'default' => 'yes'
),
'cost' => array(
'title' => __( 'Стоимость доставки', 'woocommerce' ),
'type' => 'text',
'description' => __( 'Фиксированная стоимость доставки', 'woocommerce' ),
'default' => '100',
'desc_tip' => true,
),
);
}Проверка результата после внедрения
Чтобы проверить, что ваш способ доставки работает:
- Перейдите в WooCommerce → Настройки → Доставка и выберите зону доставки.
- Добавьте новый метод доставки и выберите «Собственная доставка».
- Перейдите на страницу оформления заказа и проверьте отображение нового способа доставки с указанной стоимостью.
- Попробуйте сделать тестовый заказ, чтобы убедиться, что стоимость корректно применяется.
Частые ошибки и как их исправить
- Метод доставки не отображается в списке: Проверьте, что вы правильно зарегистрировали класс и используете правильный идентификатор (
$this->id). - Стоимость всегда равна нулю: Убедитесь, что поле
costинициализировано и возвращается в методеcalculate_shipping. - Ошибки PHP при вызове методов: Проверьте, что класс наследует
WC_Shipping_Methodи все необходимые методы реализованы.
Практические советы по безопасности и производительности
- Не храните критичные данные доставки в пользовательских метах без проверки безопасности и валидации.
- Используйте кеширование, если расчёт стоимости зависит от внешних API или сложных вычислений.
- Тестируйте интеграцию на стейджинге перед продакшеном, чтобы избежать конфликтов с другими плагинами доставки.
Сравнение способов добавления собственного метода доставки
| Способ | Плюсы | Минусы |
|---|---|---|
| Через код (как в статье) | Гибкость, легковесность, контроль | Требует навыков программирования |
| Через плагин (например, WooCommerce Table Rate Shipping) | Удобство, готовые функции | Плагины добавляют нагрузку, могут конфликтовать |
| Использование сторонних сервисов | Автоматизация доставки и расчёта | Зависимость от внешних API, возможны сбои |