Створення користувальницького методу доставки WooCommerce

345

Від автора: якщо ви коли-небудь розробляли щось для WordPress, будь то тема або просто плагін, значить, ви вже знайомі з модульність WordPress. WooCommerce також розроблений, розширюючи свої можливості. У цьому уроці ми створимо простий метод доставки WooCommerce, який розрахує вартість доставки, і додамо деякі обмеження для нашого плагіна, щоб наш спосіб доставки був доступний тільки для певних країн.

Для цього нам знадобляться:

WordPress

Встановлений і активоване плагін WooCommerce

Редактор вибору

Правила для методу доставки

Перш ніж ми почнемо, нам потрібно буде визначити, як наш метод доставки розрахує вартість і куди доступна відправлення. Вартість буде визначатися вагою, який нам потрібно відправити, і зоною, яку нам потрібно відправити. Зона — це номер, який присвоюється країнам і цінами. Чим вище число, тим довше відстань доставки. Наша вигадана компанія по доставці відправляє товар лише кілька країн:

США

Канада

Німеччина

Великобританія

Італія

Іспанія

Хорватія

Наша компанія знаходиться в Хорватії, тому Хорватія знаходиться в зоні 0. Давайте визначимо зони для інших країн:

США: 3

Канада: 3

Німеччина: 1

Сполучене Королівство: 2

Італія: 1

Іспанія: 2

Тепер, коли у нас є всі країни, доступні для доставки з відповідною зоною, визначимо ціни.

Зона 0: $ 10

Зона 1: $30

Зона 2: $ 50

Зона 3: $70

Також я згадав про вазі. Наша компанія може постачати до 100 кг, а ціни:

0-10 кг: $ 0

11-30 кг: $ 5

31-50 кг: $ 10

51-100 кг: $ 20

У нас є все, що нам потрібно для створення нашого методу доставки. Тепер давайте трохи дізнаємося про WooCommerce Shipping API.

Введення в Shipping Method API WooCommerce

При створенні методу доставки нам потрібно розширити клас з абстрактного класу WooCommerce WC_Shipping_Method. Певні атрибути в цьому класі:

$id: ID (slug, keyword) нашої доставки. Обов’язковий.

$number: Цілочисельний ідентифікатор.

$method_title: Назва нашої доставки показано у admin.

$method_description: Короткий опис нашої доставки показано у admin (необов’язково).

$enabled: String Boolean («yes» або «no»), який дає інформацію, включена наша доставка і може бути використана чи ні.

$title: Використовується для відображення відвантажувального найменування на нашому сайті.

$availability: Визначає, доступна доставка чи ні.

$countries: Масив країн, для яких цей метод включений. Типове значення — порожній масив.

$tax_status: Значення за замовчуванням taxable. Якщо він обкладається податком, податок не стягується.

$fee: Значення за замовчуванням дорівнює 0 . Збори за метод.

$minimum_fee: Мінімальна плата за метод. Значення за замовчуванням дорівнює null.

$has_settings: Визначає, чи має цей метод будь-які налаштування. Значення за замовчуванням — true.

$supports: Масив, що містить функції, підтримувані цим методом. Типове значення — порожній масив.

$rates: Масив ставок. Це необхідно заповнити, щоб зареєструвати вартість доставки. Типове значення — порожній масив.

Певні методи в WC_Shipping_Method:

is_taxable(): Повертає, чи нам потрібно розрахувати податок зверху ставки доставки.

add_rate( $args = array() ): Передає ціну доставки, визначену в параметрі $ args, в атрибут $rates.

has_settings(): Повертає значення атрибута $has_settings.

is_available(): Повертає значення, чи є доставка. Якщо в атрибуті є країни $countries, і якщо встановлено значення для атрибуту $availability, що включають конкретні або виключають, він поверне true або false, якщо країна доступна для доставки.

get_title(): Повертає назву доставки.

get_fee( $fee, $total ): Повертає вартість платежу для цієї доставки на основі проаналізованих $fee і $total.

supports( $feature ): Повертає, підтримує цей спосіб доставки функцію.

Існує більше атрибутів і методів, які не будуть пояснюватися тут заради спрощення, оскільки клас WC_Shipping_Method розширює клас WC_Settings_API. Існують також інші методи, які необхідно визначити, щоб доставка могла отримати або встановити налаштування, а також розрахувати фактичну вартість. Ці методи:

init(): Створює поля форми і налаштування (їх можна називати по-різному, якщо ми використовуємо методи всередині неї і викликаємо її __constructor методі).

calculate_shipping( $package ): Це метод, використовуваний для розрахунку вартості доставки. Пакет – це масив з продуктами для відправки.

У calculate_shipping методі ми додаємо ціну з допомогою методу add_rate. Цей метод приймає масив з кількома параметрами:

id: Ідентифікатор ціни.

l
abel: Мітка для ціни.

cost: Обсяг доставки. Це може бути одне або array вартість кожного товару в кошику.

taxes: Він приймає або array податки або нічого, тому податок розраховується WooCommerce. Він може навіть прийняти false, якщо ви не хочете, щоб податок був розрахований.

calc_tax: Приймає per_order або per_item. Якщо використовується per_item, array необхідно буде надати вартість.

Щоб зареєструвати спосіб доставки, нам необхідно додати наш метод доставки в array зареєстрованого методу, передавши ім’я нашого класу. Ми можемо отримати доступ до цього array і відправити змінений array тому з допомогою фільтра WordPress, який визначений всередині плагіна WooCommerce. Цей фільтр викликається woocommerce_shipping_methods.

Створення нового класу доставки

Створимо наш метод доставки в якості нового плагіна, який розширює плагін WooCommerce. Створюємо нову папку tutsplus-shipping під wp-content/plugins. Крім того, створюємо файл з тим же ім’ям tutsplus-shipping.php і додаємо цей код:

id = ‘tutsplus’;
$this->method_title = __( ‘TutsPlus Shipping’, ‘tutsplus’ );
$this->method_description = __( ‘Custom Shipping Method for TutsPlus’, ‘tutsplus’ );
$this->init();
$this->enabled = isset( $this->settings[‘enabled’] ) ? $this->settings[‘enabled’] : ‘yes’;
$this->title = isset( $this->settings[‘title’] ) ? $this->settings[‘title’] : __( ‘TutsPlus Shipping’, ‘tutsplus’ );
}
/**
* Init your settings
*
* @public access
* @return void
*/
function init() {
// Load the settings API
$this->init_form_fields();
$this->init_settings();
// Save settings in admin if you have any defined
add_action( ‘woocommerce_update_options_shipping_’ . $this->id, array( $this, ‘process_admin_options’ ) );
}
/**
* Define settings for this field shipping
* @return void
*/
function init_form_fields() {
// We will add our settings here
}
/**
* This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
*
* @public access
* @param mixed $package
* @return void
*/
public function calculate_shipping( $package ) {
// We will add the cost, rate and logics in here
}
}
}
}
add_action( ‘woocommerce_shipping_init’, ‘tutsplus_shipping_method’ );
function add_tutsplus_shipping_method( $methods ) {
$methods[] = ‘TutsPlus_Shipping_Method’;
return $methods;
}
add_filter( ‘woocommerce_shipping_methods’, ‘add_tutsplus_shipping_method’ );
}

Може здатися, що занадто багато всього, щоб зрозуміти, але насправді це досить просто. Спочатку ми перевіряємо, визначена константа WPINC, тому що якщо не визначена, це означає, що хтось намагається отримати доступ до цього файлу безпосередньо або з місця, яке не доступно WordPress.

Тепер, коли ми впевнені, що це буде доступно з WordPress, ми можемо рухатися далі. Перш ніж почнемо створювати наш метод доставки WooCommerce, ми повинні бути впевнені, що WooCommerce активний. Перевіряємо, чи файл woocommerce.php у масиві активних плагінів, який зберігається в базі даних по цій опції active_plugins.

Потім ми створюємо функцію tutsplus_shipping_method, яку ми також додаємо в екшен woocommerce_shipping_init. Дія woocommerce_shipping_init є основною дією для WooCommerce Shippings, яке включає всі класи доставки, перш ніж вони будуть створені. Використовуючи це, ми впевнені, що наш метод доставки буде включений після того, як WooCommerce буде ініціалізований в правильному для використання WooCommerce місці.

__construct метод нашого класу встановить деякі загальні атрибути. Деякі з них можуть бути легко замінені після завантаження параметрів з бази даних у методі init. Два інших методу залишаються порожніми, тому що ми їх пізніше визначимо.

Налаштування доступності країни

Наш метод доставки доступний тільки в раніше визначеному списку країн. Це буде встановлено перед методом init всередині методу __construct. Додайте це метод __construct:

method_description = __( ‘Custom Shipping Method for TutsPlus’, ‘tutsplus’ );
// Availability & Countries
$this->availability = ‘including’;
$this->countries = array(
‘US’, // Unites States of America
‘CA’, // Canada
‘DE’, // Germany
‘GB’, // United Kingdom
‘IT’, // Italy
‘ES’, // Spain
‘HR’ // Croatia
);
$this->init();
//…

Атрибут availability встановлюється в ‘including’ так, щоб ця доставка була доступна тільки для країн, включених в атрибут countries. Коли WooCommerce хоче відобразити доступні відвантаження нашому клієнту, він перевіряє, чи включена країна доставки в атрибут countries для цієї доставки.

Створення налаштувань

Якщо придивитися до нашого методу __construct, то можна побачити, що ми перевіряємо налаштування для enabled і title властивостей. Створимо поля, які дозволять змінити наші властивості. Скопіюйте цей код і заповніть метод init_form_fields:

form_fields = array(
‘enabled’ => array(
‘title’ => __( ‘Enable’, ‘tutsplus’ ),
‘type’ => ‘checkbox’,
‘description’ => __( ‘Enable this shipping.’, ‘tutsplus’ ),
‘default’ => ‘yes’
),
‘title’ => array(
‘title’ => __( ‘Title’, ‘tutsplus’ ),
‘type’ => ‘text’,
‘description’ => __( ‘Title to be display on site’, ‘tutsplus’ ),
‘default’ => __( ‘TutsPlus Shipping’, ‘tutsplus’ )
),
);
}

Тепер ви можете перейти в панель адміністратора WordPress і змінити ці параметри у WooCommerce> Налаштування> Доставка> Доставка TutsPlus.

Створення користувальницького методу доставки WooCommerce

Спробуйте змінити параметр « Включити». На вкладці « Параметри доставки» буде видно, включений наш спосіб доставки чи ні.

Ми також визначили, що наш метод доставки може перевозити до 100 кг. Що робити, якщо це правило зміниться в майбутньому? Ми легко можемо дозволити редагування в налаштуваннях. Додамо цю настройку, щоб наш метод init_form_fields виглядав наступним чином:

form_fields = array(
‘enabled’ => array(
‘title’ => __( ‘Enable’, ‘tutsplus’ ),
‘type’ => ‘checkbox’,
‘description’ => __( ‘Enable this shipping.’, ‘tutsplus’ ),
‘default’ => ‘yes’
),
‘title’ => array(
‘title’ => __( ‘Title’, ‘tutsplus’ ),
‘type’ => ‘text’,
‘description’ => __( ‘Title to be display on site’, ‘tutsplus’ ),
‘default’ => __( ‘TutsPlus Shipping’, ‘tutsplus’ )
),
‘weight’ => array(
‘title’ => __( ‘Weight (kg)’, ‘tutsplus’ ),
‘type’ => ‘number’,
‘description’ => __( ‘Maximum allowed weight’, ‘tutsplus’ ),
‘default’ => 100
),
);
}

Тепер ми можемо встановити максимальний вагу в налаштуваннях. Можна зробити наші країни, зони і все інше теж налаштованим, але для простоти пропустимо цю частину.

Розрахунок вартості доставки

Ми всі поставили, але у нас є ще дещо, що потрібно зробити перш, ніж ми зможемо використовувати наш метод доставки при продажу товарів. Нам потрібно розрахувати вартість доставки на основі товарів в кошику покупця.

Ми збираємося оновити метод calculate_shipping покроково, щоб ви могли зрозуміти все, що ми робимо. Перший крок — отримати вартість за вагою. Додайте цей код до цього методу:

$values )
{
$_product = $values[‘data’];
$weight = $weight + $_product->get_weight() * $values[‘quantity’];
}
$weight = wc_get_weight( $weight, ‘kg’ );
if( $weight <= 10 ) {
$cost = 0;
} elseif( $weight <= 30 ) {
$cost = 5;
} elseif( $weight <= 50 ) {
$cost = 10;
} else {
$cost = 20;
}
}
//…

Ми визначили кілька вихідних змінних: $weight, $cost, і $country. Змінна $weight буде утримувати загальна вага від всіх продуктів, змінна $cost буде утримувати вартість цього методу доставки, а змінна $country буде містити код ISO для обраної країни доставки.

Ми отримуємо загальна вага шляхом ітерації кошика і додавання ваги для кожного товару до змінної $weight. Коли у нас є загальна вага, ми використовуємо функцію wc_get_weight для перетворення ваги в кілограми, так як це одиниця, в якій наш метод доставки встановив межу.

Останнє, що потрібно, це отримати вартість розрахованого ваги. Якщо ви уважно подивіться на останню частину, ми не встановили межу на 100 кг, як ми сказали. Наша вартість доставки покаже вартість навіть для кошика з загальною вагою 101 кг і більше. Ця частина лімітів доставки буде зроблена пізніше в статті про обмеження при обробці замовлення або оновленні замовлення.

Розрахунок вартості для обраної країни доставки

Тепер, коли у нас є вартість, заснована на вазі кошика, ми повинні розрахувати вартість обраної країни доставки. Додайте наступний код:

0,
‘US’ => 3,
‘GB’ => 2,
‘CA’ => 3,
‘ES’ => 2,
‘DE’ => 1,
‘IT’ => 1
);
$zonePrices = array(
0 => 10,
1 => 30,
2 => 50,
3 => 70
);
$zoneFromCountry = $countryZones[ $country ];
$priceFromZone = $zonePrices[ $zoneFromCountry ];
$cost += $priceFromZone;
}
//…

Один масив $countryZones містить зони для кожної країни. Другий масив $zonePrices містить ціни для кожної зони. Як тільки ми встановили обидва цих масиву, ми отримаємо вартість по зонах наступним чином:

Передаємо код ISO країни в масив $countryZones, щоб отримати зону.

Передаємо повернуту зону масиву $zonePrices, щоб отримати вартість.

Додаємо повертається вартість змінної $cost.

Реєстрація вартості

Ми розрахували вартість на загальну вагу і додали вартість доставки країни. Останнім кроком буде — зареєструвати швидкість, тому додайте цю останню частину:

$this->id,
‘label’ => $this->title,
‘cost’ => $cost
);
$this->add_rate( $rate );
}
//…

Ось весь код для цього методу, якщо у вас виникли проблеми з його виконанням:

$values )
{
$_product = $values[‘data’];
$weight = $weight + $_product->get_weight() * $values[‘quantity’];
}
$weight = wc_get_weight( $weight, ‘kg’ );
if( $weight <= 10 ) {
$cost = 0;
} elseif( $weight <= 30 ) {
$cost = 5;
} elseif( $weight 0,
‘US’ => 3,
‘GB’ => 2,
‘CA’ => 3,
‘ES’ => 2,
‘DE’ => 1,
‘IT’ => 1
);
$zonePrices = array(
0 => 10,
1 => 30,
2 => 50,
3 => 70
);
$zoneFromCountry = $countryZones[ $country ];
$priceFromZone = $zonePrices[ $zoneFromCountry ];
$cost += $priceFromZone;
$rate = array(
‘id’ => $this->id,
‘label’ => $this->title,
‘cost’ => $cost
);
$this->add_rate( $rate );
}
//…

Якщо ви спробуєте переглянути свою корзину або перейти на сторінку перевірки і вибрати країну, доступну для цієї доставки, ви отримаєте вартість доставки, зазначену з допомогою цього способу доставки. Ось приклад з країною із зони 3:

Створення користувальницького методу доставки WooCommerce

Додавання обмежень

Оскільки ми дозволили методом доставки обчислювати його вартість, навіть якщо загальна вага нашої кошика більше, ніж граничний, ми повинні додати деякі обмеження. Це обмеження повідомити клієнта про те, що замовлення не може бути відправлений з-за перевищення ваги.

Створення користувальницького методу доставки WooCommerce

Функція обмеження

В нашій функції ми будемо шукати спосіб доставки, який був обраний. Якщо наш метод TutsPlus_Shipping_Method, тоді ми перевіримо ліміт ваги та загальна вага в кошику. Якщо вага кошика перевищує ліміт ваги, ми повідомимо про це нашого клієнта.

Для цього потрібно додати наступний код після фільтра woocommerce_shipping_methods:

shipping->get_packages();
$chosen_methods = WC()->session->get( ‘chosen_shipping_methods’ );
if( is_array( $chosen_methods ) && in_array( ‘tutsplus’, $chosen_methods ) ) {
foreach ( $packages as $i => $package ) {
if ( $chosen_methods[ $i ] != “tutsplus” ) {
continue;
}
$TutsPlus_Shipping_Method = new TutsPlus_Shipping_Method();
$weightLimit = (int) $TutsPlus_Shipping_Method->settings[‘weight’];
$weight = 0;
foreach ( $package[‘contents’] as $item_id => $values )
{
$_product = $values[‘data’];
$weight = $weight + $_product->get_weight() * $values[‘quantity’];
}
$weight = wc_get_weight( $weight, ‘kg’ );
if( $weight > $weightLimit ) {
$message = sprintf( __( ‘Sorry, %d kg exceeds the maximum weight of %d kg for %s’, ‘tutsplus’ ), $weight, $weightLimit, $TutsPlus_Shipping_Method->title );
$messageType = “error”;
if( ! wc_has_notice( $message, $messageType ) ) {
wc_add_notice( $message, $messageType );
}
}
}
}
}

Ми отримуємо пакети, які розділені доставкою. Якщо всі товари використовують одну і ту ж доставку, то повернеться тільки один пакет з усіма товарами. Після цього ми отримуємо вибрані методи, а потім перевіряємо для кожного пакета, відправлений він нашим методом доставки.

Якщо пакет повинен бути відправлений нашим методом доставки, то встановлюємо ліміт ваги з установки, і після цього розраховуємо загальний вага нашого пакету. Якщо загальна вага перевищує наш ліміт ваги, клієнт отримає повідомлення.

Повідомлення про оновлення замовлення

Оновлення замовлення відбувається кожний раз, коли клієнт міняє щось на контрольній сторінці. Ми додаємо функцію tutsplus_validate_order до дії woocommerce_review_order_before_cart_contents. Це дія викликається після того, як все налаштовано так, щоб ми могли отримати обрані методи доставки з сеансу і пакети для доставки. Як тільки клієнт щось змінить, це дія викличе нашу функцію і додасть повідомлення, якщо це необхідно. Додайте цей код після функції tutsplus_validate_order:

Повідомлення про доставку

Коли клієнт натискає кнопку, щоб розмістити замовлення або придбати його, WooCommerce буде обробляти всі дані фактури і доставки разом з вмістом кошика і обраної доставкою.

Якщо є повідомлення про помилки WooCommerce, це зупинить процес перевірки і відобразить всі ці повідомлення для клієнта. Оскільки ми створили функцію, що використовує сеанс для отримання обраних методів доставки, ми повинні додати цю функцію до дії, яке буде запущено після того, як буде встановлено сеанс. woocommerce_after_checkout_validation — дія, яка буде запускатися безпосередньо перед тим, як WooCommerce перевірить, чи є яке-небудь повідомлення про помилку. Додамо нашу функцію до цього дії:

Повний код

Тут надано повний код для цього настроюваного методу доставки, тому, якщо у вас виникли проблеми, подивіться:

id = ‘tutsplus’;
$this->method_title = __( ‘TutsPlus Shipping’, ‘tutsplus’ );
$this->method_description = __( ‘Custom Shipping Method for TutsPlus’, ‘tutsplus’ );
// Availability & Countries
$this->availability = ‘including’;
$this->countries = array(
‘US’, // Unites States of America
‘CA’, // Canada
‘DE’, // Germany
‘GB’, // United Kingdom
‘IT’, // Italy
‘ES’, // Spain
‘HR’ // Croatia
);
$this->init();
$this->enabled = isset( $this->settings[‘enabled’] ) ? $this->settings[‘enabled’] : ‘yes’;
$this->title = isset( $this->settings[‘title’] ) ? $this->settings[‘title’] : __( ‘TutsPlus Shipping’, ‘tutsplus’ );
}
/**
* Init your settings
*
* @public access
* @return void
*/
function init() {
// Load the settings API
$this->init_form_fields();
$this->init_settings();
// Save settings in admin if you have any defined
add_action( ‘woocommerce_update_options_shipping_’ . $this->id, array( $this, ‘process_admin_options’ ) );
}
/**
* Define settings for this field shipping
* @return void
*/
function init_form_fields() {
$this->form_fields = array(
‘enabled’ => array(
‘title’ => __( ‘Enable’, ‘tutsplus’ ),
‘type’ => ‘checkbox’,
‘description’ => __( ‘Enable this shipping.’, ‘tutsplus’ ),
‘default’ => ‘yes’
),
‘title’ => array(
‘title’ => __( ‘Title’, ‘tutsplus’ ),
‘type’ => ‘text’,
‘description’ => __( ‘Title to be display on site’, ‘tutsplus’ ),
‘default’ => __( ‘TutsPlus Shipping’, ‘tutsplus’ )
),
‘weight’ => array(
‘title’ => __( ‘Weight (kg)’, ‘tutsplus’ ),
‘type’ => ‘number’,
‘description’ => __( ‘Maximum allowed weight’, ‘tutsplus’ ),
‘default’ => 100
),
);
}
/**
* This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
*
* @public access
* @param mixed $package
* @return void
*/
public function calculate_shipping( $package ) {
$weight = 0;
$cost = 0;
$country = $package[“destination”][“country”];
foreach ( $package[‘contents’] as $item_id => $values )
{
$_product = $values[‘data’];
$weight = $weight + $_product->get_weight() * $values[‘quantity’];
}
$weight = wc_get_weight( $weight, ‘kg’ );
if( $weight <= 10 ) {
$cost = 0;
} elseif( $weight <= 30 ) {
$cost = 5;
} elseif( $weight 0,
‘US’ => 3,
‘GB’ => 2,
‘CA’ => 3,
‘ES’ => 2,
‘DE’ => 1,
‘IT’ => 1
);
$zonePrices = array(
0 => 10,
1 => 30,
2 => 50,
3 => 70
);
$zoneFromCountry = $countryZones[ $country ];
$priceFromZone = $zonePrices[ $zoneFromCountry ];
$cost += $priceFromZone;
$rate = array(
‘id’ => $this->id,
‘label’ => $this->title,
‘cost’ => $cost
);
$this->add_rate( $rate );
}
}
}
}
add_action( ‘woocommerce_shipping_init’, ‘tutsplus_shipping_method’ );
function add_tutsplus_shipping_method( $methods ) {
$methods[] = ‘TutsPlus_Shipping_Method’;
return $methods;
}
add_filter( ‘woocommerce_shipping_methods’, ‘add_tutsplus_shipping_method’ );
function tutsplus_validate_order( $posted ) {
$packages = WC()->shipping->get_packages();
$chosen_methods = WC()->session->get( ‘chosen_shipping_methods’ );
if( is_array( $chosen_methods ) && in_array( ‘tutsplus’, $chosen_methods ) ) {
foreach ( $packages as $i => $package ) {
if ( $chosen_methods[ $i ] != “tutsplus” ) {
continue;
}
$TutsPlus_Shipping_Method = new TutsPlus_Shipping_Method();
$weightLimit = (int) $TutsPlus_Shipping_Method->settings[‘weight’];
$weight = 0;
foreach ( $package[‘contents’] as $item_id => $values )
{
$_product = $values[‘data’];
$weight = $weight + $_product->get_weight() * $values[‘quantity’];
}
$weight = wc_get_weight( $weight, ‘kg’ );
if( $weight > $weightLimit ) {
$message = sprintf( __( ‘Sorry, %d kg exceeds the maximum weight of %d kg for %s’, ‘tutsplus’ ), $weight, $weightLimit, $TutsPlus_Shipping_Method->title );
$messageType = “error”;
if( ! wc_has_notice( $message, $messageType ) ) {
wc_add_notice( $message, $messageType );
}
}
}
}
}
add_action( ‘woocommerce_review_order_before_cart_contents’, ‘tutsplus_validate_order’ , 10 );
add_action( ‘woocommerce_after_checkout_validation’, ‘tutsplus_validate_order’ , 10 );
}

Висновок

WooCommerce Shipping API дозволяє вам створити свій власний метод доставки з допомогою простих кроків. Обмеження і доступність можуть бути встановлені всередині методу доставки при розрахунку доступності або вартості методу доставки, але вони також можуть бути встановлені за межами способу доставки з використанням дій WooCommerce.