Advertisement
  1. Code
  2. WooCommerce

Erstellen Sie eine benutzerdefinierte Versandmethode für WooCommerce

Scroll to top
Read Time: 22 min

() 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 ein array 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 ein array mit Kosten für jeden Artikel im Warenkorb sein.
  • taxes: Es akzeptiert eine arrayvon Steuern oder nichts, so dass die Steuer von WooCommerce berechnet wird. Es kann sogar false sein, wenn Sie nicht möchten, dass die Steuer berechnet wird.
  • calc_tax: Akzeptiert per_order oder per_item. Wenn Sie per_item verwenden, müssen Sie eine arrayvon Kosten angeben.

Um die Versandart zu registrieren, müssen wir unsere Versandart im arrayder 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.

The TutsPlus Shipping Options ScreenThe TutsPlus Shipping Options ScreenThe TutsPlus Shipping Options Screen

Ä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:

Cost of our custom shipping method with a shipping country from zone 3Cost of our custom shipping method with a shipping country from zone 3Cost of our custom shipping method with a shipping country from 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.

Sorry 120 kg exceeds the maximum weight of 100 kg for TutsPlus ShippingSorry 120 kg exceeds the maximum weight of 100 kg for TutsPlus ShippingSorry 120 kg exceeds the maximum weight of 100 kg for TutsPlus Shipping

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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.