Erstellen Sie eine benutzerdefinierte Versandmethode für WooCommerce
() translation by (you can also view the original English article)
Wenn Sie jemals etwas für WordPress entwickelt haben, sei es ein Design oder ein einfaches Plugin, sind Sie bereits mit der Modularität von WordPress vertraut. WooCommerce wurde auch im Hinblick auf Erweiterbarkeit entwickelt.
In diesem Lernprogramm erstellen wir eine einfache Versandmethode für WooCommerce, mit der die Versandkosten berechnet werden. Wir werden auch einige Einschränkungen für unser Plugin hinzufügen, sodass unsere Versandart nur für bestimmte Länder verfügbar ist.
Um diesem Tutorial zu folgen, benötigen Sie:
- WordPress
- WooCommerce-Plugin installiert und aktiviert
- Editor der Wahl
Versandregeln für unsere Versandart
Bevor wir beginnen, müssen wir definieren, wie unsere Versandmethode die Kosten berechnet und wo sie versendet werden kann.
Die Kosten richten sich nach dem Gewicht, das wir versenden müssen, und nach der Zone, in die wir versenden müssen. Eine Zone ist eine Nummer, die Ländern und Preisen zugeordnet ist. Je höher die Anzahl, desto länger ist die Versandentfernung. Unsere fiktive Reederei versendet nur in einige Länder:
- USA
- Kanada
- Deutschland
- Großbritannien
- Italien
- Spanien
- Kroatien
Unsere Reederei kommt aus Kroatien, also ist Kroatien in Zone 0. Definieren Sie Zonen für die anderen Länder:
- USA: 3
- Kanada: 3
- Deutschland: 1
- Vereinigtes Königreich: 2
- Italien: 1
- Spanien: 2
Nun, da wir alle Länder zum Versand mit der entsprechenden Zone zur Verfügung haben, ist es an der Zeit, Preise festzulegen.
- Zone 0: $ 10
- Zone 1: $30
- Zone 2: $50
- Zone 3: $70
Ich habe auch das Gewicht erwähnt, oder? Unsere Reederei kann bis zu 100 kg versenden, und die Preise sind:
- 0–10 kg: $0
- 11–30 kg: $5
- 31–50 kg: $10
- 51–100 kg: $20
Wir haben alles, was wir brauchen, um unsere Versandart zu erstellen. Erfahren Sie ein wenig über die WooCommerce Shipping API.
Einführung in die WooCommerce-Versandmethoden-API
Wenn Sie eine Versandmethode erstellen, müssen Sie die Klasse um die abstrakte WooCommerce-Klasse WC_Shipping_Method
erweitern. Definierte Attribute in dieser Klasse sind:
-
$id
: ID (Slug, Keyword) unseres Versandes. Erforderlich. -
$number
: Integer-ID.
-
$method_title
: Name des in admin angezeigten Versandes.
-
$method_description
: Kurze Beschreibung unserer Versandkosten in admin (optional).
-
$enabled
: String Boolean ("yes" oder "no"), das die Informationen gibt, wenn unser Versand aktiviert ist und verwendet werden kann oder nicht. -
$title
: Wird verwendet, um unseren Versandnamen auf unserer Website anzuzeigen.
-
$Availability
: Legt fest, ob der Versand verfügbar ist oder nicht.
-
$countries
: Array von Ländern, für die diese Methode aktiviert ist. Der Standardwert ist ein leeres Array.
-
$tax_status
: Der Standardwert ist steuerpflichtig. Wenn es steuerpflichtig ist, wird die Steuer erhoben.
-
$fee
: Der Standardwert ist 0. Gebühren für die Methode.
-
$minimum_fee
: Die Mindestgebühr für die Methode. Der Standardwert ist null.
-
$has_settings
: Legt fest, ob diese Methode Einstellungen hat. Der Standardwert ist true.
-
$supports
: Array mit Funktionen, die diese Methode unterstützt. Der Standardwert ist ein leeres Array.
-
$rates
: Array von Preisen. Dies muss ausgefüllt werden, um die Versandkosten zu registrieren. Der Standardwert ist ein leeres Array.
Definierte Methoden in der WC_Shipping_Method
sind:
-
is_taxable()
: Gibt zurück, ob wir die Steuer zusätzlich zur Versandrate berechnen müssen oder nicht. -
add_rate($args=array())
: Setzt eine im Parameter $ args definierte Versandrate in das Attribut $ rates.
-
has_settings()
: Gibt den Wert des Attributs $ has_settings zurück. -
is_available()
: Gibt zurück, wenn der Versand verfügbar ist. Wenn im Attribut$countries
Länder festgelegt sind und das Attribut$availability
auf Werte einschließlich spezifisch oder ausschließend gesetzt ist, wird true oder false zurückgegeben, wenn das Land für den Versand verfügbar ist.
-
get_title()
: Gibt den Titel dieses Versands zurück.
-
get_fee($fee,$total)
: Gibt den Gebührenwert für diesen Versand basierend auf der analysierten$fee
und dem$total
zurück.
-
supports( $feature )
: Gibt zurück, ob diese Versandart eine Funktion unterstützt oder nicht.
Da die Klasse WC_Shipping_Method
die Klasse WC_Settings_API
erweitert, gibt es weitere Attribute und Methoden, die hier der Einfachheit halber nicht erläutert werden.
Es gibt auch andere Methoden, die definiert werden müssen, damit der Versand Einstellungen abrufen oder festlegen und auch die tatsächlichen Versandkosten berechnen kann. Diese Methoden sind:
-
init()
: Erstellt die Formularfelder und -einstellungen (kann unterschiedlich benannt werden, solange wir die darin enthaltenen Methoden verwenden und in der__constructor
-Methode aufrufen).
-
calculate_shipping( $package )
: Dies ist die Methode, mit der die Kosten für diesen Versand berechnet werden. Paket ist einarray
mit den zu versendenden Produkten.
In der calculate_shipping
-Methode addieren wir die Rate mit der Methode add_rate
. Diese Methode akzeptiert ein Array mit mehreren Optionen:
-
id
: ID des Tarifs. -
label
: Etikett für die Rate.
-
cost
: Menge des Versandes. Es kann ein einzelner Wert oder einarray
mit Kosten für jeden Artikel im Warenkorb sein.
-
taxes
: Es akzeptiert einearray
von Steuern oder nichts, so dass die Steuer von WooCommerce berechnet wird. Es kann sogarfalse
sein, wenn Sie nicht möchten, dass die Steuer berechnet wird. -
calc_tax
: Akzeptiertper_order
oderper_item
. Wenn Sieper_item
verwenden, müssen Sie einearray
von Kosten angeben.
Um die Versandart zu registrieren, müssen wir unsere Versandart im array
der registrierten Methode hinzufügen, indem Sie den Namen unserer Klasse übergeben. Wir können auf dieses array
zugreifen und das modifizierte array
mit einem WordPress-Filter zurückschicken, der im WooCommerce-Plugin definiert ist. Dieser Filter heißt woocommerce_shipping_methods
.
Erstellen der neuen Versandklasse
Wir erstellen unsere Versandart als neues Plugin, das das WooCommerce-Plugin erweitert. Legen Sie unter wp-content/plugins
einen neuen Ordner tutsplus-shipping an. Erstellen Sie auch eine Datei mit dem gleichen Namen tutsplus-shipping.php
und fügen Sie diesen Code hinzu:
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
* Plugin Name: TutsPlus Shipping
|
5 |
* Plugin URI: https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098
|
6 |
* Description: Custom Shipping Method for WooCommerce
|
7 |
* Version: 1.0.0
|
8 |
* Author: Igor Benić
|
9 |
* Author URI: http://www.ibenic.com
|
10 |
* License: GPL-3.0+
|
11 |
* License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
12 |
* Domain Path: /lang
|
13 |
* Text Domain: tutsplus
|
14 |
*/
|
15 |
|
16 |
if ( ! defined( 'WPINC' ) ) { |
17 |
|
18 |
die; |
19 |
|
20 |
}
|
21 |
|
22 |
/*
|
23 |
* Check if WooCommerce is active
|
24 |
*/
|
25 |
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { |
26 |
|
27 |
function tutsplus_shipping_method() { |
28 |
if ( ! class_exists( 'TutsPlus_Shipping_Method' ) ) { |
29 |
class TutsPlus_Shipping_Method extends WC_Shipping_Method { |
30 |
/**
|
31 |
* Constructor for your shipping class
|
32 |
*
|
33 |
* @access public
|
34 |
* @return void
|
35 |
*/
|
36 |
public function __construct() { |
37 |
$this->id = 'tutsplus'; |
38 |
$this->method_title = __( 'TutsPlus Shipping', 'tutsplus' ); |
39 |
$this->method_description = __( 'Custom Shipping Method for TutsPlus', 'tutsplus' ); |
40 |
|
41 |
$this->init(); |
42 |
|
43 |
$this->enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'yes'; |
44 |
$this->title = isset( $this->settings['title'] ) ? $this->settings['title'] : __( 'TutsPlus Shipping', 'tutsplus' ); |
45 |
}
|
46 |
|
47 |
/**
|
48 |
* Init your settings
|
49 |
*
|
50 |
* @access public
|
51 |
* @return void
|
52 |
*/
|
53 |
function init() { |
54 |
// Load the settings API
|
55 |
$this->init_form_fields(); |
56 |
$this->init_settings(); |
57 |
|
58 |
// Save settings in admin if you have any defined
|
59 |
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) ); |
60 |
}
|
61 |
|
62 |
/**
|
63 |
* Define settings field for this shipping
|
64 |
* @return void
|
65 |
*/
|
66 |
function init_form_fields() { |
67 |
|
68 |
// We will add our settings here
|
69 |
|
70 |
}
|
71 |
|
72 |
/**
|
73 |
* This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
|
74 |
*
|
75 |
* @access public
|
76 |
* @param mixed $package
|
77 |
* @return void
|
78 |
*/
|
79 |
public function calculate_shipping( $package ) { |
80 |
|
81 |
// We will add the cost, rate and logics in here
|
82 |
|
83 |
}
|
84 |
}
|
85 |
}
|
86 |
}
|
87 |
|
88 |
add_action( 'woocommerce_shipping_init', 'tutsplus_shipping_method' ); |
89 |
|
90 |
function add_tutsplus_shipping_method( $methods ) { |
91 |
$methods[] = 'TutsPlus_Shipping_Method'; |
92 |
return $methods; |
93 |
}
|
94 |
|
95 |
add_filter( 'woocommerce_shipping_methods', 'add_tutsplus_shipping_method' ); |
96 |
}
|
Es scheint, als gäbe es viel zu verstehen, aber es ist ziemlich einfach. Zuerst prüfen wir, ob die Konstante WPINC
definiert ist. Wenn dies nicht der Fall ist, versucht jemand, auf diese Datei direkt oder von einem Ort aus zuzugreifen, der nicht WordPress ist.
Nun, da wir sicher sind, dass auf WordPress zugegriffen werden kann, können wir weitermachen. Bevor wir mit der Erstellung unserer Versandmethode für WooCommerce beginnen, müssen wir sicherstellen, dass WooCommerce aktiv ist. Wir prüfen, ob sich die Datei woocommerce.php
im Array der aktiven Plugins befindet, die in der Datenbank unter der Option active_plugins
gespeichert sind.
Dann erstellen wir die Funktion tutsplus_shipping_method
, die wir ebenfalls in der Aktion woocommerce_shipping_init
hinzufügen. Die Aktion woocommerce_shipping_init
ist die Hauptaktion für WooCommerce Shippings, die alle Versandklassen umfasst, bevor sie instanziiert werden. Mit dieser Aktion sind wir sicher, dass unsere Versandmethode nach der Initialisierung von WooCommerce und an der richtigen Stelle für WooCommerce verwendet wird.
Die __construct
-Methode unserer Klasse legt einige allgemeine Attribute fest. Einige davon können leicht überschrieben werden, nachdem die Einstellungen in der Methode init
aus der Datenbank geladen wurden. Zwei andere Methoden bleiben leer, da wir sie später definieren werden.
Länderverfügbarkeit festlegen
Unsere Versandart ist nur in der zuvor festgelegten Länderliste verfügbar. Dies wird vor der Methode init
innerhalb der Methode __construct
gesetzt. Fügen Sie dies in der Methode __construct
hinzu:
1 |
<?php
|
2 |
//...
|
3 |
$this->method_description = __( 'Custom Shipping Method for TutsPlus', 'tutsplus' ); |
4 |
|
5 |
// Availability & Countries
|
6 |
$this->availability = 'including'; |
7 |
$this->countries = array( |
8 |
'US', // Unites States of America |
9 |
'CA', // Canada |
10 |
'DE', // Germany |
11 |
'GB', // United Kingdom |
12 |
'IT', // Italy |
13 |
'ES', // Spain |
14 |
'HR' // Croatia |
15 |
);
|
16 |
|
17 |
$this->init(); |
18 |
//...
|
Das Attribut availability
ist auf 'Including'
gesetzt, sodass dieser Versand nur für die Länder verfügbar ist, die im Attribut countries
enthalten sind. Wenn WooCommerce unserem Kunden die verfügbaren Sendungen anzeigen möchte, wird geprüft, ob das Versandland in dem Attribut countries
für diesen Versand enthalten ist.
Einstellungen erstellen
Wenn Sie sich unsere Methode __construct
genau ansehen, können Sie feststellen, dass wir die Einstellungen für die Eigenschaften enabled
und title
überprüfen. Wir erstellen Felder, in denen unsere Eigenschaften geändert werden können.
Kopieren Sie diesen Code und füllen Sie unsere Methode init_form_fields
aus:
1 |
<?php
|
2 |
|
3 |
function init_form_fields() { |
4 |
|
5 |
$this->form_fields = array( |
6 |
|
7 |
'enabled' => array( |
8 |
'title' => __( 'Enable', 'tutsplus' ), |
9 |
'type' => 'checkbox', |
10 |
'description' => __( 'Enable this shipping.', 'tutsplus' ), |
11 |
'default' => 'yes' |
12 |
),
|
13 |
|
14 |
'title' => array( |
15 |
'title' => __( 'Title', 'tutsplus' ), |
16 |
'type' => 'text', |
17 |
'description' => __( 'Title to be display on site', 'tutsplus' ), |
18 |
'default' => __( 'TutsPlus Shipping', 'tutsplus' ) |
19 |
),
|
20 |
|
21 |
);
|
22 |
|
23 |
}
|
Jetzt können Sie zur WordPress-Verwaltung gehen und diese Einstellungen unter WooCommerce > Settings > Shipping > TutsPlus Shipping.



Ändern Sie die Einstellung Enable und sehen Sie auf der Registerkarte Shipping Options, ob unsere Versandart aktiviert ist oder nicht.
Wir haben auch festgelegt, dass unsere Versandart bis zu 100 kg transportieren kann. Was ist, wenn sich diese Regel in naher Zukunft ändert? Wir können dies problemlos in den Einstellungen bearbeiten lassen. Wir werden diese Einstellung hinzufügen, sodass unsere Methode init_form_fields
jetzt wie folgt aussieht:
1 |
<?php
|
2 |
|
3 |
function init_form_fields() { |
4 |
|
5 |
$this->form_fields = array( |
6 |
|
7 |
'enabled' => array( |
8 |
'title' => __( 'Enable', 'tutsplus' ), |
9 |
'type' => 'checkbox', |
10 |
'description' => __( 'Enable this shipping.', 'tutsplus' ), |
11 |
'default' => 'yes' |
12 |
),
|
13 |
|
14 |
'title' => array( |
15 |
'title' => __( 'Title', 'tutsplus' ), |
16 |
'type' => 'text', |
17 |
'description' => __( 'Title to be display on site', 'tutsplus' ), |
18 |
'default' => __( 'TutsPlus Shipping', 'tutsplus' ) |
19 |
),
|
20 |
|
21 |
'weight' => array( |
22 |
'title' => __( 'Weight (kg)', 'tutsplus' ), |
23 |
'type' => 'number', |
24 |
'description' => __( 'Maximum allowed weight', 'tutsplus' ), |
25 |
'default' => 100 |
26 |
),
|
27 |
|
28 |
);
|
29 |
|
30 |
}
|
Jetzt können wir sogar das maximale Gewicht unter den Einstellungen einstellen. Wir könnten unsere Länder, Zonen und alles andere auch anpassbar machen, aber der Einfachheit halber überspringen wir diesen Teil.
Berechnung der Versandkosten
Nachdem jetzt alles eingestellt ist, haben wir einen weiteren Schritt, bevor wir beim Versand unserer Produkte unsere Versandart verwenden können. Wir müssen die Versandkosten basierend auf den Produkten im Warenkorb des Besuchers berechnen.
Wir werden die Methode calculate_shipping
Schritt für Schritt aktualisieren, damit Sie jeden Schritt verstehen können. Der erste Schritt besteht darin, die Kosten nach Gewicht zu berechnen. Fügen Sie dieser Methode diesen Code hinzu:
1 |
<?php
|
2 |
//...
|
3 |
public function calculate_shipping( $package ) { |
4 |
|
5 |
$weight = 0; |
6 |
$cost = 0; |
7 |
$country = $package["destination"]["country"]; |
8 |
|
9 |
foreach ( $package['contents'] as $item_id => $values ) |
10 |
{
|
11 |
$_product = $values['data']; |
12 |
$weight = $weight + $_product->get_weight() * $values['quantity']; |
13 |
}
|
14 |
|
15 |
$weight = wc_get_weight( $weight, 'kg' ); |
16 |
|
17 |
if( $weight <= 10 ) { |
18 |
|
19 |
$cost = 0; |
20 |
|
21 |
} elseif( $weight <= 30 ) { |
22 |
|
23 |
$cost = 5; |
24 |
|
25 |
} elseif( $weight <= 50 ) { |
26 |
|
27 |
$cost = 10; |
28 |
|
29 |
} else { |
30 |
|
31 |
$cost = 20; |
32 |
|
33 |
}
|
34 |
|
35 |
}
|
36 |
|
37 |
//...
|
Wir haben einige Startvariablen definiert: $weight
, $cost
und $country
. Die Variable $weight
enthält das Gesamtgewicht aller Produkte, die variablen $cost
die Kosten dieser Versandart und die Variable $country
den ISO-Code für das ausgewählte Versandland.
Wir erhalten das Gesamtgewicht, indem wir den Wagen iterieren und das Gewicht für jedes Produkt im Warenkorb zu der Variablen $weight
addieren. Sobald wir unser Gesamtgewicht haben, verwenden wir die Funktion wc_get_weight
, um das Gewicht in Kilogramm umzuwandeln, da dies die Einheit ist, in der unsere Versandmethode das Limit festgelegt hat.
Als letztes müssen Sie die Kosten für das berechnete Gewicht berechnen. Wenn Sie sich den letzten Teil genau ansehen, haben wir, wie gesagt, die Grenze für die 100 kg nicht festgelegt. Unsere Versandkosten zeigen die Kosten auch für einen Wagen mit einem Gesamtgewicht von 101 kg oder mehr an. Dieser Teil unserer Versandlimits wird später im Artikel als Einschränkung bei der Abwicklung der Bestellung oder der Aktualisierung der Bestellung festgelegt.
Berechnung der Kosten für das ausgewählte Versandland
Da wir nun die Kosten basierend auf dem Gewicht des Wagens haben, müssen wir die Kosten für das ausgewählte Versandland berechnen. Fügen Sie diesen Code als nächstes hinzu:
1 |
<?php
|
2 |
//...
|
3 |
public function calculate_shipping( $package ) { |
4 |
|
5 |
//...
|
6 |
|
7 |
$countryZones = array( |
8 |
'HR' => 0, |
9 |
'US' => 3, |
10 |
'GB' => 2, |
11 |
'CA' => 3, |
12 |
'ES' => 2, |
13 |
'DE' => 1, |
14 |
'IT' => 1 |
15 |
);
|
16 |
|
17 |
$zonePrices = array( |
18 |
0 => 10, |
19 |
1 => 30, |
20 |
2 => 50, |
21 |
3 => 70 |
22 |
);
|
23 |
|
24 |
$zoneFromCountry = $countryZones[ $country ]; |
25 |
$priceFromZone = $zonePrices[ $zoneFromCountry ]; |
26 |
|
27 |
$cost += $priceFromZone; |
28 |
|
29 |
}
|
30 |
//...
|
Das Array $countryZones
enthält die Zonen für jedes Land. Das zweite Array $zonePreise
enthält die Preise für jede Zone. Nachdem wir beide Arrays festgelegt haben, erhalten Sie die Kosten pro Zone folgendermaßen:
- Wir übergeben den ISO-Ländercode an das Array
$countryZones
, um die Zone zu erhalten. - Wir übergeben die zurückgegebene Zone an das Array
$zonePreise
, um die Kosten zu ermitteln. - Wir addieren die zurückgegebenen Kosten zu den variablen
$cost
.
Die Rate registrieren
Wir haben die Kosten nach dem Gesamtgewicht berechnet und die Kosten nach Versandland addiert. Der letzte Schritt hier ist das Registrieren der Rate, fügen Sie also den letzten Teil hinzu:
1 |
<?php
|
2 |
|
3 |
//...
|
4 |
public function calculate_shipping( $package ) { |
5 |
//...
|
6 |
$rate = array( |
7 |
'id' => $this->id, |
8 |
'label' => $this->title, |
9 |
'cost' => $cost |
10 |
);
|
11 |
|
12 |
$this->add_rate( $rate ); |
13 |
}
|
14 |
//...
|
Hier ist der gesamte Code für diese Methode, falls Sie Schwierigkeiten hatten, ihr zu folgen:
1 |
<?php
|
2 |
|
3 |
//...
|
4 |
|
5 |
public function calculate_shipping( $package ) { |
6 |
|
7 |
$weight = 0; |
8 |
$cost = 0; |
9 |
$country = $package["destination"]["country"]; |
10 |
|
11 |
foreach ( $package['contents'] as $item_id => $values ) |
12 |
{
|
13 |
$_product = $values['data']; |
14 |
$weight = $weight + $_product->get_weight() * $values['quantity']; |
15 |
}
|
16 |
|
17 |
$weight = wc_get_weight( $weight, 'kg' ); |
18 |
|
19 |
if( $weight <= 10 ) { |
20 |
|
21 |
$cost = 0; |
22 |
|
23 |
} elseif( $weight <= 30 ) { |
24 |
|
25 |
$cost = 5; |
26 |
|
27 |
} elseif( $weight <= 50 ) { |
28 |
|
29 |
$cost = 10; |
30 |
|
31 |
} else { |
32 |
|
33 |
$cost = 20; |
34 |
|
35 |
}
|
36 |
|
37 |
$countryZones = array( |
38 |
'HR' => 0, |
39 |
'US' => 3, |
40 |
'GB' => 2, |
41 |
'CA' => 3, |
42 |
'ES' => 2, |
43 |
'DE' => 1, |
44 |
'IT' => 1 |
45 |
);
|
46 |
|
47 |
$zonePrices = array( |
48 |
0 => 10, |
49 |
1 => 30, |
50 |
2 => 50, |
51 |
3 => 70 |
52 |
);
|
53 |
|
54 |
$zoneFromCountry = $countryZones[ $country ]; |
55 |
$priceFromZone = $zonePrices[ $zoneFromCountry ]; |
56 |
|
57 |
$cost += $priceFromZone; |
58 |
|
59 |
$rate = array( |
60 |
'id' => $this->id, |
61 |
'label' => $this->title, |
62 |
'cost' => $cost |
63 |
);
|
64 |
|
65 |
$this->add_rate( $rate ); |
66 |
|
67 |
}
|
68 |
|
69 |
//...
|
Wenn Sie jetzt versuchen, Ihren Einkaufswagen anzuzeigen oder zur Bestellseite gehen und ein Land auswählen, das für diesen Versand verfügbar ist, werden bei dieser benutzerdefinierten Versandmethode Versandkosten angezeigt. Hier ist ein Bild mit einem Land aus Zone 3:



Einschränkungen hinzufügen
Da wir der Versandart erlaubt haben, ihren Tarif zu registrieren, auch wenn das Gesamtgewicht unseres Warenkorbs über unserem Limit liegt, müssen wir einige Einschränkungen hinzufügen. Unsere Einschränkung informiert den Kunden darüber, dass die Bestellung aufgrund ihres Gewichts nicht versendet werden kann.



Einschränkungsfunktion
In unserer Funktion suchen wir nach der Versandart, die Sie gewählt haben. Wenn die Methode unsere TutsPlus_Shipping_Method
ist, überprüfen wir das Gewichtslimit und das Gesamtgewicht im Wagen. Wenn das Gewicht aus dem Wagen die Gewichtsgrenze überschreitet, werden wir unseren Kunden darüber informieren.
Fügen Sie nach dem Filter woocommerce_shipping_methods
diesen Code hinzu:
1 |
<?php
|
2 |
|
3 |
function tutsplus_validate_order( $posted ) { |
4 |
|
5 |
$packages = WC()->shipping->get_packages(); |
6 |
|
7 |
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); |
8 |
|
9 |
if( is_array( $chosen_methods ) && in_array( 'tutsplus', $chosen_methods ) ) { |
10 |
|
11 |
foreach ( $packages as $i => $package ) { |
12 |
|
13 |
if ( $chosen_methods[ $i ] != "tutsplus" ) { |
14 |
|
15 |
continue; |
16 |
|
17 |
}
|
18 |
|
19 |
$TutsPlus_Shipping_Method = new TutsPlus_Shipping_Method(); |
20 |
$weightLimit = (int) $TutsPlus_Shipping_Method->settings['weight']; |
21 |
$weight = 0; |
22 |
|
23 |
foreach ( $package['contents'] as $item_id => $values ) |
24 |
{
|
25 |
$_product = $values['data']; |
26 |
$weight = $weight + $_product->get_weight() * $values['quantity']; |
27 |
}
|
28 |
|
29 |
$weight = wc_get_weight( $weight, 'kg' ); |
30 |
|
31 |
if( $weight > $weightLimit ) { |
32 |
|
33 |
$message = sprintf( __( 'Sorry, %d kg exceeds the maximum weight of %d kg for %s', 'tutsplus' ), $weight, $weightLimit, $TutsPlus_Shipping_Method->title ); |
34 |
|
35 |
$messageType = "error"; |
36 |
|
37 |
if( ! wc_has_notice( $message, $messageType ) ) { |
38 |
|
39 |
wc_add_notice( $message, $messageType ); |
40 |
|
41 |
}
|
42 |
}
|
43 |
}
|
44 |
}
|
45 |
}
|
Wir erhalten die Pakete, die durch Versand getrennt werden. Wenn alle Produkte denselben Versand verwenden, wird nur ein Paket mit allen Produkten zurückgegeben. Danach erhalten wir die ausgewählten Methoden und dann prüfen wir für jedes Paket, ob dieses Paket mit unserer Versandmethode versendet wird.
Wenn das Paket mit unserer Versandmethode versendet werden soll, setzen wir die Gewichtsgrenze aus den Einstellungen und berechnen anschließend das Gesamtgewicht unseres Pakets. Wenn das Gesamtgewicht unsere Gewichtsgrenze überschreitet, wird es den Kunden darüber informieren.
Benachrichtigung bei Bestellaktualisierung
Die Bestellaktualisierung erfolgt jedes Mal, wenn der Kunde etwas auf der Checkout-Seite ändert. Wir fügen die Funktion tutsplus_validate_order
zur Aktion woocommerce_review_order_before_cart_contents
hinzu. Diese Aktion wird aufgerufen, nachdem alles festgelegt wurde, sodass wir die ausgewählten Versandmethoden aus der Sitzung und die Pakete vom Versand abrufen können. Sobald der Kunde etwas ändert, löst diese Aktion unsere Funktion aus und fügt gegebenenfalls die Benachrichtigung hinzu.
Fügen Sie diesen Code nach unserer Funktion tutsplus_validate_order
hinzu:
1 |
<?php
|
2 |
|
3 |
add_action( 'woocommerce_review_order_before_cart_contents', 'tutsplus_validate_order' , 10 ); |
Benachrichtigung bei Kasse
Wenn der Kunde auf die Schaltfläche klickt, um die Bestellung aufzugeben oder zu kaufen, verarbeitet WooCommerce alle Abrechnungs- und Versanddaten neben dem Warenkorbinhalt und dem ausgewählten Versand.
Wenn WooCommerce-Fehlermeldungen angezeigt werden, wird der Checkout-Vorgang angehalten und dem Kunden alle Fehlermeldungen angezeigt. Da wir eine Funktion erstellt haben, die die Sitzung verwendet, um die ausgewählten Versandmethoden abzurufen, müssen wir diese Funktion einer Aktion hinzufügen, die nach dem Festlegen der Sitzung ausgelöst wird. Die Aktion, die ausgelöst wird, bevor WooCommerce prüft, ob ein Fehler gemeldet wird, ist woocommerce_after_checkout_validation
.
Fügen wir unserer Aktion unsere Funktion hinzu:
1 |
<?php
|
2 |
|
3 |
add_action( 'woocommerce_after_checkout_validation', 'tutsplus_validate_order' , 10 ); |
Vollständiger Code
Hier ist der vollständige Code für diese benutzerdefinierte Versandmethode. Wenn Sie Probleme mit diesem Tutorial hatten, können Sie hier nachschauen:
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
* Plugin Name: TutsPlus Shipping
|
5 |
* Plugin URI: http://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098
|
6 |
* Description: Custom Shipping Method for WooCommerce
|
7 |
* Version: 1.0.0
|
8 |
* Author: Igor Benić
|
9 |
* Author URI: http://www.ibenic.com
|
10 |
* License: GPL-3.0+
|
11 |
* License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
12 |
* Domain Path: /lang
|
13 |
* Text Domain: tutsplus
|
14 |
*/
|
15 |
|
16 |
if ( ! defined( 'WPINC' ) ) { |
17 |
|
18 |
die; |
19 |
|
20 |
}
|
21 |
|
22 |
/*
|
23 |
* Check if WooCommerce is active
|
24 |
*/
|
25 |
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { |
26 |
|
27 |
function tutsplus_shipping_method() { |
28 |
if ( ! class_exists( 'TutsPlus_Shipping_Method' ) ) { |
29 |
class TutsPlus_Shipping_Method extends WC_Shipping_Method { |
30 |
/**
|
31 |
* Constructor for your shipping class
|
32 |
*
|
33 |
* @access public
|
34 |
* @return void
|
35 |
*/
|
36 |
public function __construct() { |
37 |
$this->id = 'tutsplus'; |
38 |
$this->method_title = __( 'TutsPlus Shipping', 'tutsplus' ); |
39 |
$this->method_description = __( 'Custom Shipping Method for TutsPlus', 'tutsplus' ); |
40 |
|
41 |
// Availability & Countries
|
42 |
$this->availability = 'including'; |
43 |
$this->countries = array( |
44 |
'US', // Unites States of America |
45 |
'CA', // Canada |
46 |
'DE', // Germany |
47 |
'GB', // United Kingdom |
48 |
'IT', // Italy |
49 |
'ES', // Spain |
50 |
'HR' // Croatia |
51 |
);
|
52 |
|
53 |
$this->init(); |
54 |
|
55 |
$this->enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'yes'; |
56 |
$this->title = isset( $this->settings['title'] ) ? $this->settings['title'] : __( 'TutsPlus Shipping', 'tutsplus' ); |
57 |
}
|
58 |
|
59 |
/**
|
60 |
* Init your settings
|
61 |
*
|
62 |
* @access public
|
63 |
* @return void
|
64 |
*/
|
65 |
function init() { |
66 |
// Load the settings API
|
67 |
$this->init_form_fields(); |
68 |
$this->init_settings(); |
69 |
|
70 |
// Save settings in admin if you have any defined
|
71 |
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) ); |
72 |
}
|
73 |
|
74 |
/**
|
75 |
* Define settings field for this shipping
|
76 |
* @return void
|
77 |
*/
|
78 |
function init_form_fields() { |
79 |
|
80 |
$this->form_fields = array( |
81 |
|
82 |
'enabled' => array( |
83 |
'title' => __( 'Enable', 'tutsplus' ), |
84 |
'type' => 'checkbox', |
85 |
'description' => __( 'Enable this shipping.', 'tutsplus' ), |
86 |
'default' => 'yes' |
87 |
),
|
88 |
|
89 |
'title' => array( |
90 |
'title' => __( 'Title', 'tutsplus' ), |
91 |
'type' => 'text', |
92 |
'description' => __( 'Title to be display on site', 'tutsplus' ), |
93 |
'default' => __( 'TutsPlus Shipping', 'tutsplus' ) |
94 |
),
|
95 |
|
96 |
'weight' => array( |
97 |
'title' => __( 'Weight (kg)', 'tutsplus' ), |
98 |
'type' => 'number', |
99 |
'description' => __( 'Maximum allowed weight', 'tutsplus' ), |
100 |
'default' => 100 |
101 |
),
|
102 |
|
103 |
);
|
104 |
|
105 |
}
|
106 |
|
107 |
/**
|
108 |
* This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
|
109 |
*
|
110 |
* @access public
|
111 |
* @param mixed $package
|
112 |
* @return void
|
113 |
*/
|
114 |
public function calculate_shipping( $package ) { |
115 |
|
116 |
$weight = 0; |
117 |
$cost = 0; |
118 |
$country = $package["destination"]["country"]; |
119 |
|
120 |
foreach ( $package['contents'] as $item_id => $values ) |
121 |
{
|
122 |
$_product = $values['data']; |
123 |
$weight = $weight + $_product->get_weight() * $values['quantity']; |
124 |
}
|
125 |
|
126 |
$weight = wc_get_weight( $weight, 'kg' ); |
127 |
|
128 |
if( $weight <= 10 ) { |
129 |
|
130 |
$cost = 0; |
131 |
|
132 |
} elseif( $weight <= 30 ) { |
133 |
|
134 |
$cost = 5; |
135 |
|
136 |
} elseif( $weight <= 50 ) { |
137 |
|
138 |
$cost = 10; |
139 |
|
140 |
} else { |
141 |
|
142 |
$cost = 20; |
143 |
|
144 |
}
|
145 |
|
146 |
$countryZones = array( |
147 |
'HR' => 0, |
148 |
'US' => 3, |
149 |
'GB' => 2, |
150 |
'CA' => 3, |
151 |
'ES' => 2, |
152 |
'DE' => 1, |
153 |
'IT' => 1 |
154 |
);
|
155 |
|
156 |
$zonePrices = array( |
157 |
0 => 10, |
158 |
1 => 30, |
159 |
2 => 50, |
160 |
3 => 70 |
161 |
);
|
162 |
|
163 |
$zoneFromCountry = $countryZones[ $country ]; |
164 |
$priceFromZone = $zonePrices[ $zoneFromCountry ]; |
165 |
|
166 |
$cost += $priceFromZone; |
167 |
|
168 |
$rate = array( |
169 |
'id' => $this->id, |
170 |
'label' => $this->title, |
171 |
'cost' => $cost |
172 |
);
|
173 |
|
174 |
$this->add_rate( $rate ); |
175 |
|
176 |
}
|
177 |
}
|
178 |
}
|
179 |
}
|
180 |
|
181 |
add_action( 'woocommerce_shipping_init', 'tutsplus_shipping_method' ); |
182 |
|
183 |
function add_tutsplus_shipping_method( $methods ) { |
184 |
$methods[] = 'TutsPlus_Shipping_Method'; |
185 |
return $methods; |
186 |
}
|
187 |
|
188 |
add_filter( 'woocommerce_shipping_methods', 'add_tutsplus_shipping_method' ); |
189 |
|
190 |
function tutsplus_validate_order( $posted ) { |
191 |
|
192 |
$packages = WC()->shipping->get_packages(); |
193 |
|
194 |
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); |
195 |
|
196 |
if( is_array( $chosen_methods ) && in_array( 'tutsplus', $chosen_methods ) ) { |
197 |
|
198 |
foreach ( $packages as $i => $package ) { |
199 |
|
200 |
if ( $chosen_methods[ $i ] != "tutsplus" ) { |
201 |
|
202 |
continue; |
203 |
|
204 |
}
|
205 |
|
206 |
$TutsPlus_Shipping_Method = new TutsPlus_Shipping_Method(); |
207 |
$weightLimit = (int) $TutsPlus_Shipping_Method->settings['weight']; |
208 |
$weight = 0; |
209 |
|
210 |
foreach ( $package['contents'] as $item_id => $values ) |
211 |
{
|
212 |
$_product = $values['data']; |
213 |
$weight = $weight + $_product->get_weight() * $values['quantity']; |
214 |
}
|
215 |
|
216 |
$weight = wc_get_weight( $weight, 'kg' ); |
217 |
|
218 |
if( $weight > $weightLimit ) { |
219 |
|
220 |
$message = sprintf( __( 'Sorry, %d kg exceeds the maximum weight of %d kg for %s', 'tutsplus' ), $weight, $weightLimit, $TutsPlus_Shipping_Method->title ); |
221 |
|
222 |
$messageType = "error"; |
223 |
|
224 |
if( ! wc_has_notice( $message, $messageType ) ) { |
225 |
|
226 |
wc_add_notice( $message, $messageType ); |
227 |
|
228 |
}
|
229 |
}
|
230 |
}
|
231 |
}
|
232 |
}
|
233 |
|
234 |
add_action( 'woocommerce_review_order_before_cart_contents', 'tutsplus_validate_order' , 10 ); |
235 |
add_action( 'woocommerce_after_checkout_validation', 'tutsplus_validate_order' , 10 ); |
236 |
}
|
Fazit
Mit der WooCommerce-Versand-API können Sie mit einfachen Schritten Ihre eigene Versandart erstellen. Einschränkungen und Verfügbarkeit können bei der Berechnung der Verfügbarkeit oder der Kosten für die Versandart innerhalb der Versandart festgelegt werden. Sie können jedoch auch außerhalb der Versandart mithilfe von WooCommerce-Aktionen festgelegt werden.
Wenn Sie nach anderen Dienstprogrammen suchen, die Sie beim Entwickeln Ihres wachsenden Satzes von Werkzeugen für WordPress oder nach Code unterstützen, der sich mit WordPress auskennt, sollten Sie nicht vergessen, was wir in Envato Market anbieten.
Wenn Sie Fragen zu dieser oder einer anderen Versandart haben, können Sie diese in den Kommentaren unten posten. Sie können mir auch auf meinem Blog oder auf Twitter @igorbenic folgen.