Jak dodać niestandardową metodę wysyłki w WooCommerce?

Opublikowany: 2020-09-01

WooCommerce Dodaj niestandardową metodę wysyłki Jeśli znasz WooCommerce, wiesz, że jest to świetne darmowe rozwiązanie e-commerce, z niesamowicie przydatnym zestawem funkcji. Wyróżnia się tym, że WooCommerce został opracowany z myślą o rozszerzalności, podobnie jak modułowość WordPressa.

Jeśli jednak potrzebujesz czegoś ekstra od WooCommerce, często okazuje się, że WooCommerce nie daje Ci wszystkiego, czego potrzebujesz, na przykład, jeśli chcesz dodać niestandardową metodę wysyłki. Niemniej jednak nie martw się, ponieważ w tym krótkim samouczku dowiesz się, jak stworzyć prostą metodę wysyłki dla WooCommerce, która obliczy koszt wysyłki.

Dodatkowo dowiesz się, jak dodać pewne ograniczenia do naszej wtyczki, aby metoda wysyłki była dostępna dla niektórych krajów.

Niestandardowe zasady wysyłki dla metod wysyłki

W tej sekcji utworzymy niestandardowe reguły wysyłki dla metod wysyłki, których będziemy używać do tworzenia kodu. Określimy, w jaki sposób metoda wysyłki obliczy koszt i gdzie można go wysłać. Oznacza to, że koszt będzie zależał od wagi i strefy, do której musimy wysłać przesyłkę.

W tym przykładzie wysyłamy do USA, Kanady, Niemiec, Wielkiej Brytanii, Włoch, Hiszpanii i Kenii. Kenia będzie naszą Strefą 0 za 10 USD, Włochy Strefą 1 za 30 USD, Hiszpańską Strefą 2 za 50 USD, Wielką Brytanią Strefą 2 za 50 USD, USA i Kanadą Strefą 3 za 70 USD.

Za wagę wycenimy je następująco: 0-10kg za darmo, 11-30kg za 5$, 31-50kg za 10$ i 51-100kg za 20$.

Możesz być gotowy do rozpoczęcia kodowania, ale jeszcze nie teraz! Najpierw musisz poznać API WooCommerce Shipping . Jeśli chcesz stworzyć niestandardową metodę wysyłki, musisz rozszerzyć klasę z abstrakcyjnej klasy WooCommerce WC_Shipping_Method. Ma kilka zdefiniowanych atrybutów, którymi są:

  • $id : wymagany identyfikator (slug, słowo kluczowe) naszej wysyłki.
  • $number : To jest ID typu Integer.
  • $method_title : Nazwa naszej wysyłki pokazana w admin.
  • $method_description : Krótki opis naszej wysyłki wyświetlany w admin (opcjonalnie).
  • $enabled : String Boolean, „tak” lub „nie”, który podaje informację, czy nasza wysyłka jest włączona i czy można jej użyć, czy nie.
  • $title : Służy do wyświetlania nazwy wysyłki w naszej witrynie.
  • $availability : Określa, czy wysyłka jest dostępna, czy nie.
  • $countries : tablica krajów, dla których ta metoda jest włączona. Wartość domyślna to pusta tablica.
  • $tax_status : Wartość domyślna podlega opodatkowaniu. Jeśli przedmiot podlega opodatkowaniu, zostanie naliczony podatek.
  • $fee : domyślna wartość to 0
  • $minimum_fee : Minimalna opłata za metodę i wartość domyślna to null.
  • $has_settings : Określa, czy ta metoda ma jakieś ustawienia. Wartość domyślna to prawda.
  • $supports : tablica zawierająca funkcje obsługiwane przez tę metodę. Wartość domyślna to pusta tablica.
  • $rates : tablica stawek, którą należy wypełnić, aby zarejestrować koszty wysyłki. Wartość domyślna to pusta tablica.

Zdefiniowane metody w WC_Shipping_Method to:

  • is_taxable() : Zwraca czy musimy doliczyć podatek do stawki wysyłki.
  • add_rate( $args = array() ) : Wstawia koszt dostawy zdefiniowany w parametrze $args do atrybutu $rates.
  • has_settings() : Zwraca wartość atrybutu $has_settings.
  • is_available() : Zwraca, jeśli wysyłka jest dostępna i jeśli w atrybucie $countries są ustawione kraje, a atrybut $availability jest ustawiony na wartości zawierające, specyficzne lub wykluczające, zwróci wartość true lub false, jeśli kraj jest dostępny do wysyłki .
  • get_title() : Zwraca tytuł tej przesyłki.
  • get_fee( $fee, $total ) : Zwraca wartość opłaty za tę wysyłkę w oparciu o przeanalizowane $opłata i $ogółem.
  • supports( $feature ) : Zwraca się, jeśli ta metoda wysyłki obsługuje funkcję, czy nie.

Ponieważ klasa WC_Shipping_Method rozszerza klasę WC_Settings_API, istnieje więcej atrybutów i metod, których dla uproszczenia nie będę tutaj wyjaśniał.

Należy również zdefiniować inne metody, aby wysyłka mogła pobrać lub ustawić ustawienia i obliczyć rzeczywisty koszt wysyłki. Te metody wymienione tutaj:

  • init() : Tworzy pola formularza i ustawienia. Można go jednak nazwać inaczej, o ile używamy znajdujących się w nim metod i wywołujemy go w metodzie __constructor.
  • calculate_shipping( $package ) : Ta metoda służy do obliczania kosztu tej wysyłki, a paczka jest tablicą zawierającą produkty do wysłania.

Chciałbym położyć trochę nacisku na metodę obliczania_wysyłki. W naszym przykładzie użyjemy tej metody i dodamy ją do metody add_rate. Ta metoda zaakceptuje tablicę z kilkoma opcjami, takimi jak:

  • id : to jest identyfikator stawki.
  • label : to jest etykieta stawki.
  • cost : Kwota wysyłki.
  • taxes : akceptuje szereg podatków lub nic, więc podatek jest obliczany przez WooCommerce. Jeśli nie chcesz, aby akceptowała podatek, może przyjąć fałsz.
  • calc_tax : Akceptuje per_order lub per_item. Jeśli używasz per_item, musisz podać tablicę kosztów.

Użyjemy filtra WordPress, aby uzyskać tablicę, która dodaje naszą metodę wysyłki do tablicy zarejestrowanej metody, przekazując nazwę naszej klasy, używając filtra WordPress, który jest zdefiniowany we wtyczce WooCommerce. Filtr nazywa się woocommerce_shipping_methods.

Mając to na stole, przejdźmy teraz do sekcji kodowania tego krótkiego samouczka, abyś mógł zrozumieć całą koncepcję we fragmentach PHP, którymi zamierzam się podzielić.

a) Kroki tworzenia nowej klasy wysyłkowej

W tej sekcji stworzymy naszą metodę wysyłki jako nową wtyczkę rozszerzającą WooCommerce.

  1. Najpierw musisz otworzyć wp-content> wtyczki i utworzyć nowy folder. W tym celu będę używał nazwy njengah -shipping
  2. Następnie musisz utworzyć plik o tej samej nazwie njengah –shipping.php
  3. W tym pliku dodaj następujący kod:
 <?php

/**
* Nazwa wtyczki: Njengah Shipping
* URI wtyczki: https://njengah.com/plugins/
* Opis: 
* Wersja: 1.0.0
* Autor: Joe Njenga
* URI autora: https://njengah.com
s
*/

if ( ! zdefiniowano( 'WPINC' )) {

umierać;

}
/*
* Sprawdź, czy WooCommerce jest aktywne
*/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' )) ) ) {

funkcja njengahplus_shipping_method() {

if ( ! class_exists( 'NjengahPlus_Shipping_Method' ) ) {

klasa NjengahPlus_Shipping_Method rozszerza WC_Shipping_Method {

/**

* Konstruktor dla Twojej klasy wysyłkowej

*

* @dostęp publiczny

* @zwrot nieważny

*/

funkcja publiczna __construct() {

$this->id = 'njengahplus';

$this->method_title = __( 'Przesyłka NjengahPlus', 'njengahplus' );

$this->method_description = __( 'Niestandardowa metoda wysyłki dla NjengahPlus', 'njengahplus' );

$this->init();

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

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

}

/**
* Uruchom swoje ustawienia
*
* @dostęp publiczny

* @zwrot nieważny

*/

funkcja init() {

// Załaduj ustawienia API

$this->init_form_fields();

$this->init_settings();

// Zapisz ustawienia w admin, jeśli masz jakieś zdefiniowane

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

}


/**

* Zdefiniuj pole ustawień dla tej wysyłki

* @zwrot nieważny

*/

function init_form_fields() {

// Tutaj dodamy nasze ustawienia

}

/**
* Ta funkcja służy do obliczania kosztów wysyłki. W ramach tej funkcji możemy sprawdzić wagi, wymiary i inne parametry.
*
* @dostęp publiczny
* @param mieszany pakiet $
 @zwrot nieważny
*/

funkcja publiczna kalkulacja_wysyłki ( $pakiet ) {


// Tutaj dodamy koszt, stawkę i logikę

}

}

}

}


add_action( 'woocommerce_shipping_init', 'njengahplus_shipping_method' );

funkcja add_njengahplus_shipping_method( $metody ) {

$methods[] = 'NjengahPlus_Shipping_Method';
zwróć $metody;
}

add_filter( 'woocommerce_shipping_methods', 'add_njengahplus_shipping_method' );

}

Jak to działa

  • Najpierw sprawdzamy, czy zdefiniowana jest stała WPINC. Jeśli nie jest zdefiniowany, oznacza to, że ktoś próbuje uzyskać dostęp do tego pliku bezpośrednio lub z lokalizacji, która nie jest WordPress.
  • Następnie musimy sprawdzić, czy WooCommerce jest aktywne. Tutaj sprawdzamy, czy woocommerce.php znajduje się w tablicy aktywnych wtyczek zapisanych w bazie danych pod opcją active_plugins.
  • woocommerce_shipping_init to główna akcja dla WooCommerce Shipping, która obejmuje wszystkie klasy wysyłkowe, zanim zostaną utworzone. Użycie tej akcji sprawi, że nasza metoda wysyłki zostanie uwzględniona po zainicjowaniu WooCommerce i we właściwym miejscu, aby WooCommerce z niej korzystał.
  • Metoda __construct ustawia pewne ogólne atrybuty, a niektóre z nich można łatwo nadpisać po załadowaniu ustawień z bazy danych w metodzie init.
  • Pozostałe metody pozostają puste, ponieważ zdefiniujemy je w dalszej części samouczka.

Następnie musisz przejść do aktywacji wtyczki, wykonując czynności pokazane poniżej:

  1. Zaloguj się do swojej witryny WordPress i uzyskaj dostęp do pulpitu nawigacyjnego jako administrator.
  2. W menu Pulpit nawigacyjny kliknij Wtyczki i aktywuj wysyłkę Njengah, jak pokazano poniżej: aktywacja wtyczki
  3. Po aktywacji wtyczki przejdź do WooCommerce > Ustawienia . Kliknij zakładkę WooCommerce, a następnie kliknij opcję Wysyłka NjengahPlus . Powinieneś być w stanie to zobaczyć: Wynik pierwszego kodu

b) Ustawianie dostępności w kraju

Stworzony przez nas sposób wysyłki jest dostępny tylko we wcześniej ustalonej liście krajów.

  1. Dodaj to w metodzie __construct :
 <?php

//...

$this->method_description = __( 'Niestandardowa metoda wysyłki dla NjengahPlus', 'njengahplus' );

// Dostępność i kraje

$this->dostępność = 'w tym';

$this->kraje = tablica(

„USA”, // Stany Zjednoczone Ameryki

'CA', // Kanada

'DE', // Niemcy

'GB', // Wielka Brytania

'IT', // Włochy

'ES', // Hiszpania

„HR” // Kenia

);

$this->init();

//...

Jak działa kod

Atrybut dostępności jest ustawiony na „w tym”, więc ta dostawa jest dostępna tylko dla krajów w atrybucie kraje.

WooCommerce sprawdzi, czy kraj wysyłki jest uwzględniony w krajach atrybutu.

Tworzenie ustawień

Musisz po prostu skopiować ten kod i wypełnić naszą metodę init_form_fields:

 <?php



function init_form_fields() {

$this->form_fields = tablica(

'włączone' => tablica(

'title' => __( 'Włącz', 'njengahplus' ),

'typ' => 'pole wyboru',

'description' => __( 'Włącz tę wysyłkę.', 'njengahplus' ),

'domyślnie' => 'tak'

),


'tytuł' => tablica (

'tytuł' => __( 'Tytuł', 'njengahplus' ),

'typ' => 'tekst',

'description' => __( 'Tytuł do wyświetlenia na stronie', 'njengahplus' ),

'default' => __( 'NjengahPlus', 'njengahplus' )

),


);


}

Aby sprawdzić wynik, wykonaj następujące kroki:

  1. Zaloguj się do swojej witryny WordPress i uzyskaj dostęp do pulpitu nawigacyjnego jako administrator W menu pulpitu nawigacyjnego kliknij WooCommerce > Ustawienia
  2. Kliknij kartę Wysyłka i kliknij opcję Wysyłka NjengahPlus, jak pokazano poniżej: Njengah plus wysyłka
  3. Zaznacz pole wyboru i zapisz zmiany.

Możemy ustawić sposób wysyłki na wysyłkę do 100 kg. Następnie pozwolimy na edycję tego w ustawieniach, jeśli ta reguła wkrótce się zmieni. Po ustawieniu kod ustawień będzie wyglądał tak:

 <?php




function init_form_fields() {

$this->form_fields = tablica(

'włączone' => tablica(

'title' => __( 'Włącz', 'njengahplus' ),

'typ' => 'pole wyboru',

'description' => __( 'Włącz tę wysyłkę.', 'njengahplus' ),

'domyślnie' => 'tak'

),


'tytuł' => tablica (

'tytuł' => __( 'Tytuł', 'njengahplus' ),

'typ' => 'tekst',

'description' => __( 'Tytuł do wyświetlenia na stronie', 'njengahplus' ),

'default' => __( 'NjengahPlus', 'njengahplus' )

),


'waga' => tablica(

'tytuł' => __( 'Waga (kg)', 'njengahplus' ),

'typ' => 'liczba',

'description' => __( 'Maksymalna dopuszczalna waga', 'njengahplus' ),

„domyślny” => 100

),


);

}

W powyższym kodzie ustawiliśmy teraz maksymalną wagę w ustawieniach. Oto wynik: Maksymalna waga

c) Obliczanie kosztu wysyłki

Aby obliczyć koszt wysyłki, zaktualizujemy metodę kalkulacji_wysyłki krok po kroku, tak abyś mógł zrozumieć każdy krok.

  1. Najpierw musimy obliczyć koszt według wagi . Aby to zrobić, po prostu dodaj ten kod do metody kalkulacja_wysyłka:
 <?php

//...

funkcja publiczna kalkulacja_wysyłki ( $pakiet ) {


$waga = 0;

$koszt = 0;

$kraj = $pakiet["miejsce docelowe"]["kraj"];

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

{

$_produkt = $wartości['dane'];

$waga = $waga + $_product->get_weight() * $values['ilość'];

}

$waga = wc_get_weight( $waga, 'kg' );

if( $waga <= 10 ) {

$koszt = 0;

} elseif( $waga <= 30 ) {

$koszt = 5;


} elseif( $waga <= 50 ) {


$koszt = 10;


} w przeciwnym razie {

$koszt = 20;

}

}
  1. Z powyższego kodu mamy koszt w oparciu o wagę koszyka, musimy obliczyć koszt dla wybranego kraju wysyłki. Aby to zrobić, dodaj ten kod:
 <?php


funkcja publiczna kalkulacja_wysyłki ( $pakiet ) {


$countryZones = tablica(

'HR' => 0,

'USA' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'TO' => 1

);


$zoneCeny = tablica(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country ];

$priceFromZone = $zoneCeny[ $zoneFromCountry ];


$koszt += $cenaOdStrefy;

}

  1. Koszt obliczyliśmy według wagi całkowitej, a także dodaliśmy koszt według kraju wysyłki. Ostatnim krokiem jest dodanie tego kodu w celu zarejestrowania stawki.

Jak działa kod

W pierwszym fragmencie w tej sekcji zdefiniowaliśmy kilka zmiennych początkowych: $weight , $cost , i $country . Aby uzyskać sumę, uzyskujemy całkowitą wagę, iterując koszyk i dodając wagę każdego produktu w koszyku do zmiennej $weight .

Po uzyskaniu wagi całkowitej używamy function wc_get_weight , aby przeliczyć wagę na kilogramy, ponieważ jest to jednostka, której limit ustaliła nasza metoda wysyłki. Potem ostatnią rzeczą było ustalenie limitu na 100kg.

W drugim fragmencie tablica $countryZones zawiera strefy dla każdego kraju, a druga tablica $zonePrices zawiera ceny dla każdej strefy.

To będzie wynik dla włoskiej strefy 1: wynik włochy

To będzie wynik dla hiszpańskiej strefy 2: wynik Hiszpania

Taki będzie wynik dla strefy Kanady:

Ostateczny wynik

Jeśli miałeś trudności z zaimplementowaniem tego kodu, oto pełny kod:

 <?php


funkcja publiczna kalkulacja_wysyłki ( $pakiet ) {

$waga = 0;

$koszt = 0;

$kraj = $pakiet["miejsce docelowe"]["kraj"];

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

{

$_produkt = $wartości['dane'];

$waga = $waga + $_product->get_weight() * $values['ilość'];

}
$waga = wc_get_weight( $waga, 'kg' );

if( $waga <= 10 ) {

$koszt = 0;

} elseif( $waga <= 30 ) {

$koszt = 5;

} elseif( $waga <= 50 ) {

$koszt = 10;

} w przeciwnym razie {

$koszt = 20;

}

$countryZones = tablica(

'HR' => 0,

'USA' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'TO' => 1

);




$zoneCeny = tablica(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country ];

$priceFromZone = $zoneCeny[ $zoneFromCountry ];

$koszt += $cenaOdStrefy;

$stawka = tablica (

'id' => $to->id,

'label' => $this->tytuł,

'koszt' => $koszt

);

$this->add_rate( $rate );

}

Wniosek

W tym poście stworzyliśmy niestandardową wtyczkę, aby dodać niestandardową metodę wysyłki w WooCommerce. Dodatkowo udostępniłem Ci interfejs API wysyłki WooCommerce, który umożliwia stworzenie metody wysyłki za pomocą prostych kroków. Ponadto ograniczenia i dostępność można ustawić w ramach metody wysyłki podczas obliczania dostępności lub kosztu metody wysyłki. Można je jednak ustawić poza metodą wysyłki za pomocą akcji WooCommerce. Mam nadzieję, że ten samouczek dostarczył rozwiązania umożliwiającego dodanie niestandardowej metody wysyłki w WooCommerce.

Podobne artykuły