Der Bestellstatus in WooCommerce

Eine oft zu wenig beachtete Eigenschaft von WooCommerce ist der Bestellstatus. Viele wichtige (Automatisierungs-)Prozesse basieren auf dem Status einer Bestellung.

Wenn dein Kunde eine neue Bestellung aufgibt, erhält die Bestellung einen bestimmten Status. Dieser Bestellstatus ist normalerweise von der gewählten Zahlungsmethode abhängig. Die folgenden Bestellstatus sind im WooCommerce standardmäßig vorhanden:

  • Pending – Ausstehende Zahlung – Bestellung erhalten, keine Zahlung eingeleitet. In Erwartung der Zahlung (unbezahlt).
  • Failed – Fehlgeschlagen – Zahlung fehlgeschlagen oder wurde abgelehnt (unbezahlt) oder erfordert eine Authentifizierung (SCA). Beachte, dass dieser Status möglicherweise nicht sofort angezeigt wird und stattdessen bis zur Verifizierung (z.B. PayPal) als pending angezeigt wird.
  • Processing – Verarbeitung – Zahlung eingegangen (bezahlt) und der Bestand wurde reduziert; die Bestellung wartet auf ihre Erfüllung. Alle Produktbestellungen müssen bearbeitet werden, mit Ausnahme derer, die nur Produkte enthalten, die sowohl virtuell als auch herunterladbar sind.
  • Completed – Erledigt – Bestellung erfüllt und abgeschlossen – erfordert keine weiteren Maßnahmen.
  • On-Hold – In Wartestellung – Warten auf Zahlung – der Lagerbestand wurde reduziert, aber Sie müssen die Zahlung bestätigen.
  • Cancelled – Storniert – von einem Admin oder dem Kunden storniert – der Lagerbestand wird erhöht, es sind keine weiteren Maßnahmen erforderlich.
  • Refunded – Erstattet – Von einem Admin erstattet – keine weitere Aktion erforderlich.
  • Authentication required – Authentifizierung erforderlich – Warten auf eine Aktion des Kunden, um die Transaktion zu authentifizieren und/oder die SCA-Anforderungen zu erfüllen.

Zahlungsmethoden wie PayPal, die eine automatische Zahlung (z.B. über API) anbieten, weisen in der Regel den Status Pending auf. Dieser Status impliziert, dass die Bestellung “bezahlbar” ist. Bei einer manuellen Zahlungsmethode wie der Banküberweisung ist die Situation anders. In diesem Fall wird der Status on-hold zugewiesen. Obwohl dieser Status auch anzeigt, dass noch keine Zahlung erfolgt ist, wird ein anderer Status verwendet als bei automatischen Zahlungsmethoden. Ein Grund dafür ist, dass Bestellungen mit dem Status pending standardmäßig über den Endpunkt “Bestellung bezahlen” aufgerufen werden können, d.h. der Kunde kann über einen Link die Bestellung bezahlen oder die Zahlungsmethode ändern.

Standardstatus

Wie bereits erwähnt, hängt der Standardstatus nach der Bestellung von der gewählten Zahlungsmethode ab. In einigen Fällen ist es jedoch nötig, den Standardstatus anzupassen oder zu manipulieren. Dafür stellt WooCommerce den Filter woocommerce_default_order_status bereit.

 
function fs_wc_default_order_status( $status ) { 
    return 'on-hold'; 
} 
add_filter( 'woocommerce_default_order_status', 'fs_wc_default_order_status', 10, 1 ); 

Bezahlen der Bestellung

Gleiches gilt für die Möglichkeit, in welchem Status einer Bestellung es dem Kunden möglich ist, den Bezahlen Endpunkt aufzurufen. Im Standard ist das im Status pending und failed vorgesehen. Um das zu ändern, und auch in einem anderen Status das Bezahlen zu erlauben, stellt WooCommerce den Filter woocommerce_valid_order_statuses_for_payment bereit, über den das Array mit den erlaubten Status manipuliert werden kann.

 
function fs_wc_add_need_payment_statuses( $statuses ) { 
    $statuses[] = 'on-hold'; 
    return $statuses; 
} 
add_filter( 'woocommerce_valid_order_statuses_for_payment', 'fs_wc_add_need_payment_statuses', 10, 1 ); 

Wechsel des Bestellstatus

Wenn sich bei einer Bestellung der Status ändert wird beim speichern der Bestellung die Methode status_transition der Klasse WC_Order aufgerufen, die überprüft von welchen Status zu welchen Status gewechselt wurde und führt entsprechende Hooks aus.. Zunächst wird der Hook woocommerce_order_status_{new_status} ausgeführt. Dabei muss der Platzhalter {new_status} durch den neuen Status ersetzt werden, z.B. “completed”, wenn die Bestellung als abgeschlossen markiert ist. Danach werden weitere Hooks ausgeführt – der allgemeine Hook woocommerce_order_status_changed und der spezifische Hook woocommerce_order_status_{old_status}_{new_status}. Letzterer kann zur Ausführung spezifischer Aufgaben verwendet werden, die nur dann ausgeführt werden sollen, wenn ein bestimmter Statuswechsel von -> nach eingetreten ist.
Diese Hooks können verwendet werden, jenach Zielstatus entsprechende Aktion durchzuführen. Die Erstellung einer PDF Rechnung, Rückmeldung an eine Warenwirtschaft usw.

function fs_do_something( $order_id, $order ) {
	// Bestellung ist im Stauts completed angekommen
	// Jetzt irgendwas ausführen...
}
add_action( 'woocommerce_order_status_completed', 'fs_do_something', 10, 2 );

Bestellstatus hinzufügen

Manchmal ist es nötig, einen weiteren Bestellstatus hinzuzufügen. Dazu muss zu einem über den Hook wc_order_statuses der Status zugefügt werden und dieser Status muss auch über die Funktion register_post_status WordPress bekannt gemacht werden, da Bestellungen von WooCommerce CPTs in WordPress sind und diese den Bestellstatus als Poststatus bekommen.

// New order status 
function fs_register_my_new_order_statuses() {
    register_post_status( 'wc-shipped', array(
        'label'                     => _x( 'Shipped', 'Order status', 'textdomain' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Shipped <span class="count">(%s)</span>', 'Shipped<span class="count">(%s)</span>', 'textdomain' )
    ) );
}
add_action( 'init', 'fs_register_my_new_order_statuses' );


// Register in wc_order_statuses.
function fs_my_new_wc_order_statuses( $order_statuses ) {
    $order_statuses['wc-shipped'] = _x( 'Shipped', 'Order status', 'textdomain' );
    return $order_statuses;
}
add_filter( 'wc_order_statuses', 'fs_my_new_wc_order_statuses' );

Beim bearbeiten einer Bestellung steht der neue Status nun zur Verfügung. Allerdings steht er noch nicht im Mehrfachbearbeitungsmodus (Bulk-Edit) zur Verfügung.

Dafür ist der Filter bulk_actions-edit-shop_order zuständig, über den die Status des Pulldowns bearbeitet werden können.

function fs_add_bulk_actions( $actions ) {
	$actions['mark_shipped'] = __( 'Mark shipped', 'textdomain' );
    return $actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'fs_add_bulk_actions', 20 );

4 Kommentare zu „Der Bestellstatus in WooCommerce“

  1. Hallo und danke für den ausführlichen Beitrag.
    Ist es korrekt, dass wenn eine Bestellung fehlschlägt (Status failed), der Bestand der bestellten Artikel nicht wieder hoch gesetzt wird?

    Gruß Christian

  2. Hallo,
    bei mir stellt Woocommerce neuerdings direkt auf Bestellstatus abgeschlossen, sobald ein Kunde “auf Rechnung” bestellt. Es wurden keine Updates durchgeführt. Einzig allein die Bezahlfunktion Klarna hinzugefügt. Kann es sein, dass dabei irgendetwas verstellt wurde?

    Wo finde ich entsprechende Stelle im Code, um das zu prüfen oder kann ich die Aktionen im Backend irgendwo ändern?

    Gruß
    Sebastian

  3. Ich habe ein Problem damit, wenn ein Kunde auf Rechnung kaufen kann.

    Den Bezahlstatus stelle ich von abgeschlossen auf Zahlung ausstehend. Das Problem ist, dass jetzt die Bestände wieder geändert werden obwohl die Ware ja garnicht mehr lagermäßig da ist. Der Kunde hat die Ware ja schon längst.

    Gibt es hierfür eine Lösung?

    Gruß,

    Kim

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert