Как добавить собственный способ доставки в WooCommerce

Опубликовано: 2020-09-01

WooCommerce Добавить пользовательский способ доставки Если вы знакомы с WooCommerce, вы знаете, что это отличное бесплатное решение для электронной коммерции с невероятно полезным набором функций. Что выделяется, так это то, что WooCommerce разработан с учетом расширяемости, аналогичной модульности WordPress.

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

Кроме того, вы узнаете, как добавить некоторые ограничения в наш плагин, чтобы способ доставки был доступен для некоторых стран.

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

В этом разделе мы создадим пользовательские правила доставки для методов доставки, которые мы собираемся использовать для создания кода. Мы определим, как метод доставки будет рассчитывать стоимость и куда он может быть доставлен. Это означает, что стоимость будет определяться весом и зоной, в которую нам нужно отправить товар.

В этом примере мы отправим товар в США, Канаду, Германию, Великобританию, Италию, Испанию и Кению. Кения будет нашей зоной 0 за 10 долларов, Италия, зона 1 за 30 долларов, Испания, зона 2 за 50 долларов, Великобритания, зона 2 за 50 долларов, США и Канада, зона 3 за 70 долларов.

Что касается веса, мы будем оценивать их следующим образом: 0–10 кг бесплатно, 11–30 кг за 5 долларов, 31–50 кг за 10 долларов и 51–100 кг за 20 долларов.

Возможно, вы готовы начать кодирование, но не сейчас! Во-первых, вам нужно узнать об API доставки WooCommerce . Если вы хотите создать собственный метод доставки, вам необходимо расширить класс из абстрактного класса WooCommerce WC_Shipping_Method. Он имеет некоторые определенные атрибуты, а именно:

  • $id : Идентификатор (слаг, ключевое слово) нашей доставки, который требуется.
  • $number : это целочисленный идентификатор.
  • $method_title : название нашей доставки, отображаемое в админке.
  • $method_description : краткое описание нашей доставки, отображаемое в админке (необязательно).
  • $enabled : Строковое логическое значение, «да» или «нет», которое дает информацию о том, включена ли наша доставка и можно ли ее использовать или нет.
  • $title : используется для отображения нашего имени доставки на нашем сайте.
  • $availability : это определяет, доступна ли доставка или нет.
  • $countries : Массив стран, для которых включен этот метод. Значение по умолчанию — пустой массив.
  • $tax_status : значение по умолчанию облагается налогом. Если объект подлежит налогообложению, то налог будет взиматься.
  • $fee : значение по умолчанию равно 0.
  • $minimum_fee : минимальная плата за метод и значение по умолчанию равно нулю.
  • $has_settings : определяет, имеет ли этот метод какие-либо настройки. Значение по умолчанию верно.
  • $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 : это идентификатор ставки.
  • label : это метка для скорости.
  • cost : Сумма доставки.
  • taxes : он принимает массив налогов или ничего, поэтому налог рассчитывается WooCommerce. Если вы не хотите, чтобы он принимал налог, он может принять ложный.
  • calc_tax : принимает per_order или per_item. Если вы используете per_item, необходимо указать массив затрат.

Мы будем использовать фильтр WordPress, чтобы получить массив, который добавляет наш метод доставки в массив зарегистрированного метода, передав имя нашего класса, используя фильтр WordPress, определенный внутри плагина WooCommerce. Фильтр называется woocommerce_shipping_methods.

С этим на столе давайте теперь перейдем к разделу кодирования этого краткого руководства, чтобы вы могли понять всю концепцию в фрагментах PHP, которыми я собираюсь поделиться.

а) Шаги по созданию нового класса доставки

В этом разделе мы создадим наш способ доставки в виде нового плагина, расширяющего возможности WooCommerce.

  1. Во-первых, вам нужно открыть wp-content > plugins и создать новую папку. Для этого я буду использовать имя njengah -shipping.
  2. Затем вам нужно создать файл с тем же именем njengah —shipping.php
  3. В этот файл добавьте следующий код:
 <?php

/**
* Название плагина: Njengah Shipping
* URI плагина: https://njengah.com/plugins/
* Описание: 
* Версия: 1.0.0
* Автор: Джо Нженга
* URI автора: https://njengah.com
с
*/

если ( ! определено ('WPINC') ) {

умри;

}
/*
* Проверьте, активен ли WooCommerce
*/
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')) )) {

функция njengahplus_shipping_method () {

если (! class_exists('NjengahPlus_Shipping_Method') ) {

класс NjengahPlus_Shipping_Method расширяет WC_Shipping_Method {

/**

* Конструктор для вашего класса доставки

*

* @публичный доступ

* @возврат недействителен

*/

публичная функция __construct() {

$this->id = 'njengahplus';

$this->method_title = __('Доставка NjengahPlus', 'njengahplus');

$this->method_description = __('Специальный метод доставки для NjengahPlus', 'njengahplus');

$это->инициализировать();

$this->enabled = isset($this->settings['enabled'] )? $this->settings['enabled'] : 'да';

$this->title = isset($this->settings['title'] ) ? $this->settings['title'] : __('NjengahShipping', 'njengahplus');

}

/**
* Запустите свои настройки
*
* @публичный доступ

* @возврат недействителен

*/

инициализация функции () {

// Загружаем API настроек

$this->init_form_fields();

$this->init_settings();

// Сохраняем настройки в админке, если у вас есть определенные

add_action('woocommerce_update_options_shipping_'. $this->id, array($this, 'process_admin_options'));

}


/**

* Определить поле настроек для этой доставки

* @возврат недействителен

*/

функция init_form_fields() {

// Сюда мы добавим наши настройки

}

/**
* Эта функция используется для расчета стоимости доставки. В рамках этой функции мы можем проверить вес, размеры и другие параметры.
*
* @публичный доступ
* @param смешанный пакет $
 @вернуть недействительным
*/

общедоступная функция calculate_shipping ($ пакет) {


// Сюда мы добавим стоимость, скорость и логику

}

}

}

}


add_action('woocommerce_shipping_init', 'njengahplus_shipping_method');

функция add_njengahplus_shipping_method ($ методы) {

$methods[] = 'NjengahPlus_Shipping_Method';
методы возврата $;
}

add_filter('woocommerce_shipping_methods', 'add_njengahplus_shipping_method');

}

Как это работает

  • Сначала мы проверяем, определена ли константа WPINC. Если он не определен, то это означает, что кто-то пытается получить доступ к этому файлу напрямую или из места, которое не является WordPress.
  • Затем нам нужно проверить, активен ли WooCommerce. Здесь мы проверяем, находится ли woocommerce.php в массиве активных плагинов, которые сохраняются в базе данных под опцией active_plugins.
  • woocommerce_shipping_init — это основное действие для доставки WooCommerce, которое включает все классы доставки до того, как они будут созданы. Использование этого действия гарантирует, что наш способ доставки будет включен после инициализации WooCommerce и в правильном месте, где WooCommerce сможет его использовать.
  • Метод __construct устанавливает некоторые общие атрибуты, и некоторые из них могут быть легко перезаписаны после загрузки настроек из базы данных в методе init.
  • Другие методы оставлены пустыми, потому что мы определим их позже в этом руководстве.

Затем вам нужно активировать плагин, выполнив шаги, показанные ниже:

  1. Войдите на свой сайт WordPress и получите доступ к панели инструментов в качестве пользователя-администратора.
  2. В меню «Панель инструментов» нажмите « Плагины» и активируйте доставку Njengah, как показано ниже: активация плагина
  3. После активации плагина перейдите в WooCommerce > Settings . Нажмите на вкладку WooCommerce, затем нажмите на доставку NjengahPlus . Вы должны увидеть это: Результат для первого кода

б) Настройка доступности страны

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

  1. Добавьте это в метод __construct :
 <?php

//...

$this->method_description = __('Специальный метод доставки для NjengahPlus', 'njengahplus');

// Доступность и страны

$this->availability = 'включая';

$this->countries = массив(

«США», // Соединенные Штаты Америки

'Калифорния', // Канада

'DE', // Германия

'ГБ', // Великобритания

'ИТ', // Италия

'ES', // Испания

HR // Кения

);

$это->инициализировать();

//...

Как работает код

Для атрибута доступности установлено значение «включая», чтобы эта доставка была доступна только для стран, указанных в атрибуте «страны».

WooCommerce проверит, включена ли страна доставки в страны атрибутов.

Создание настроек

Вам нужно просто скопировать этот код и заполнить наш метод init_form_fields:

 <?php



функция init_form_fields() {

$this->form_fields = массив(

'включено' => массив(

'title' => __('Включить', 'njengahplus'),

'тип' => 'флажок',

'description' => __('Включить эту доставку.', 'njengahplus'),

'по умолчанию' => 'да'

),


'название' => массив (

'title' => __('Название', 'njengahplus'),

'тип' => 'текст',

'description' => __('Заголовок для отображения на сайте', 'njengahplus'),

'по умолчанию' => __( 'Доставка NjengahPlus', 'njengahplus' )

),


);


}

Чтобы проверить результат, выполните следующие действия:

  1. Войдите на свой сайт WordPress и получите доступ к панели инструментов в качестве пользователя-администратора. В меню панели инструментов выберите WooCommerce > Настройки .
  2. Перейдите на вкладку « Доставка » и нажмите «Доставка NjengahPlus», как показано ниже: Нженга плюс доставка
  3. Установите флажок и сохраните изменения.

Мы можем установить способ доставки до 100 кг. Затем мы разрешим редактировать это в настройках, если это правило скоро изменится. После этого код настроек будет выглядеть так:

 <?php




функция init_form_fields() {

$this->form_fields = массив(

'включено' => массив(

'title' => __('Включить', 'njengahplus'),

'тип' => 'флажок',

'description' => __('Включить эту доставку.', 'njengahplus'),

'по умолчанию' => 'да'

),


'название' => массив (

'title' => __('Название', 'njengahplus'),

'тип' => 'текст',

'description' => __('Заголовок для отображения на сайте', 'njengahplus'),

'по умолчанию' => __( 'Доставка NjengahPlus', 'njengahplus' )

),


'вес' => массив(

'title' => __( 'Вес (кг)', 'njengahplus' ),

'тип' => 'число',

'description' => __('Максимально допустимый вес', 'njengahplus'),

'по умолчанию' => 100

),


);

}

В приведенном выше коде мы установили максимальный вес в настройках. Вот результат: Максимальный вес

в) Расчет стоимости доставки

Чтобы рассчитать стоимость доставки, мы будем обновлять метод calculate_shipping шаг за шагом, чтобы вы могли понять каждый шаг.

  1. Во-первых, нам нужно получить стоимость по весу . Для этого просто добавьте этот код в метод calculate_shipping:
 <?php

//...

общедоступная функция calculate_shipping ($ пакет) {


$ вес = 0;

$стоимость = 0;

$country = $package["назначение"]["страна"];

foreach ($package['contents'] as $item_id => $values)

{

$_product = $значения['данные'];

$вес = $вес + $_product->get_weight() * $values['количество'];

}

$вес = wc_get_weight($вес, 'кг');

если ( $ вес <= 10 ) {

$стоимость = 0;

} elseif($вес <= 30) {

$стоимость = 5;


} elseif($вес <= 50) {


$стоимость = 10;


} еще {

$стоимость = 20;

}

}
  1. Из приведенного выше кода у нас есть стоимость, основанная на весе тележки, мы должны рассчитать стоимость для выбранной страны доставки. Для этого добавьте этот код:
 <?php


общедоступная функция calculate_shipping ($ пакет) {


$countryZones = массив(

'ЧСС' => 0,

'США' => 3,

'ГБ' => 2,

'КА' => 3,

'ЭС' => 2,

'ДЕ' => 1,

'ЭТО' => 1

);


$zonePrices = массив (

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[$country];

$priceFromZone = $zonePrices[$zoneFromCountry];


$cost += $priceFromZone;

}

  1. Мы рассчитали стоимость по общему весу, а также добавили стоимость по стране доставки. Последний шаг — добавить этот код для регистрации скорости.

Как работает код

В первом фрагменте этого раздела мы определили несколько начальных переменных: $weight , $cost и $country . Чтобы получить общее количество, мы получаем общий вес, повторяя корзину и добавляя вес каждого продукта в корзине к переменной $weight .

Получив общий вес, мы используем function wc_get_weight для преобразования веса в килограммы, поскольку это единица, для которой наш метод доставки установил ограничение. Тогда последним делом было ограничение в 100 кг.

Во втором фрагменте массив $countryZones содержит зоны для каждой страны, а второй массив $zonePrices содержит цены для каждой зоны.

Это будет результат для Италии, Зона 1: Италия

Это будет результат для зоны Испании 2: исход Испания

Это будет результат для Зоны Канады:

окончательный результат

Если вам было трудно реализовать этот код, вот полный код:

 <?php


общедоступная функция calculate_shipping ($ пакет) {

$ вес = 0;

$стоимость = 0;

$country = $package["назначение"]["страна"];

foreach ($package['contents'] as $item_id => $values)

{

$_product = $значения['данные'];

$вес = $вес + $_product->get_weight() * $values['количество'];

}
$вес = wc_get_weight($вес, 'кг');

если ( $ вес <= 10 ) {

$стоимость = 0;

} elseif($вес <= 30) {

$стоимость = 5;

} elseif($вес <= 50) {

$стоимость = 10;

} еще {

$стоимость = 20;

}

$countryZones = массив(

'ЧСС' => 0,

'США' => 3,

'ГБ' => 2,

'КА' => 3,

'ЭС' => 2,

'ДЕ' => 1,

'ЭТО' => 1

);




$zonePrices = массив (

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[$country];

$priceFromZone = $zonePrices[$zoneFromCountry];

$cost += $priceFromZone;

$ скорость = массив (

'id' => $this->id,

'метка' => $this->название,

'стоимость' => $стоимость

);

$this->add_rate($rate);

}

Вывод

В этом посте мы создали собственный плагин для добавления пользовательского метода доставки в WooCommerce. Кроме того, я поделился с вами API доставки WooCommerce, который позволяет вам создать свой способ доставки с помощью простых шагов. Кроме того, ограничения и доступность могут быть установлены внутри метода доставки при расчете доступности или стоимости метода доставки. Однако их можно установить вне метода доставки с помощью действий WooCommerce. Я надеюсь, что это руководство предоставило решение для добавления пользовательского метода доставки в WooCommerce.

Похожие статьи