Auto Complete Orders in WooCommerce – vielleicht ist dir auch schon einmal aufgefallen, dass einige deiner Orders in WooCommerce immer nur auf “In Bearbeitung” stehen. Allerdings, wenn du Software oder andere herunterladbare oder einfach virtuelle Produkte verkaufst, ist es eigentlich nicht nötig, dass die Bestellung “bearbeitet” wird.
Sobald der Kunde auscheckt, wird das Produkt normalerweise geliefert. Deshalb ist es sinnvoll, die Bestellung automatisch als abgeschlossen zu markieren.
Auto Complete Orders in WooCommerce
Das folgende Snippet zeigt dir genau, wie du das machen kannst. Kopiere den Teil einfach in deine functions.php deines Themes, oder in die Datei eines Custom Plugins.
/**
*
* @author Chris Martens
* @link https://chris-martens.com/
* @link https://chris-martens.com/auto-complete-orders-woocommerce/
* @snippet Auto complete orders in WooCommerce. Dadurch wird verhindert, dass sie sich in der "Bearbeitung" befinden und auf einen manuellen Abschluss warten.
*
*/
add_action('woocommerce_thankyou', 'chrmrtns_autocomplete_virtual_orders', 10, 1);
function chrmrtns_autocomplete_virtual_orders($order_id)
{
if (!$order_id) {
return;
}
// Get the order
$order = wc_get_order($order_id);
// Check if all items are virtual
$only_virtual = true;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product || !$product->is_virtual()) {
$only_virtual = false;
break;
}
}
// Update order status if all items are virtual
if ($only_virtual) {
$order->update_status('completed');
}
}
WooCommerce-Bestellungen automatisch abschließen
Das war’s im Grunde schon. Entscheidend ist der Abschnitt am Ende des Snippets, wo es heißt: $order->update_status( ‘completed’ );
Wenn du weitere Filter einbauen willst, kannst du das Snippet natürlich auch noch anpassen.
Auch das folgende Snioppet kannst du in deine functions.php oder in ein Custom Plugin setzen. Achte aber darauf, nicht beide gleichzeitig zu nutzen, oder du musst die Funktionen anpassen.
Der Code macht im Grunde dasselbe wie der davor – aber hier haben wir im Grunde eine Schleife durch die Bestellung, um zu prüfen, ob alle Produkte herunterladbar oder virtuell sind.
Diese Schleife durchläuft jede Position in der Bestellung mit der Methode get_items() des Bestellobjekts. Für jede Position wird das Produktobjekt mit wc_get_product() abgerufen und geprüft, ob es nicht virtuell, nicht herunterladbar und nicht vom Typ “Abonnement” oder “variables Abonnement” ist. Wenn ein Artikel diese Bedingungen nicht erfüllt, wird die Variable $only_virtual auf false gesetzt und die Schleife mit break verlassen.
/**
*
* @author Chris Martens
* @link https://chris-martens.com/
* @link https://chris-martens.com/auto-complete-orders-woocommerce/
* @snippet Auto complete orders in WooCommerce. Dadurch wird verhindert, dass sie sich in der "Bearbeitung" befinden und auf einen manuellen Abschluss warten.
*
*/
add_action('woocommerce_thankyou', 'chrmrtns_autocomplete_virtual_orders', 10, 1);
function chrmrtns_autocomplete_virtual_orders($order_id)
{
if (!$order_id) {
return;
}
// Get order
$order = wc_get_order($order_id);
// Check if all items are virtual
$only_virtual = true;
foreach ($order->get_items() as $item) {
$product = wc_get_product($item->get_product_id());
if (!$product->is_virtual() && !$product->is_downloadable() && !$product->is_type(['subscription', 'variable-subscription'])) {
$only_virtual = false;
break;
}
}
// Update order status if all items are virtual
if ($only_virtual) {
$order->update_status('completed');
}
}
Du kannst den Status so ändern, wie du ihn haben möchtest. Eine Liste der Standardstatus von WooCommerce findest du hier.
So vervollständigen wir WooCommerce-Bestellungen automatisch. Viel Spaß damit. Wenn du Fragen hast oder es bei dir nicht funktioniert, kannst du unten einen Kommentar hinterlassen, damit ich dir weiterhelfen kann.
Ergänzung/Update 03.11.2023 – Autocomplete für alle virtuallen Orders, egal ob Subscription oder nur einfaches Produkt
Update: Auto Complete Orders in WooCommerce für alle virtuellen Produkte
In dieser aktualisierten Funktion: Wir initialisieren zwei Flags: $all_items_virtual und $all_subscriptions_virtual.
Wir prüfen mit wcs_order_contains_subscription(), ob die Bestellung ein Abonnement enthält. Wir gehen in einer Schleife durch jede Position in der Bestellung. Für jede Position prüfen wir, ob sie virtuell ist. Wenn wir eine nicht-virtuelle Position finden, setzen wir $all_items_virtual auf false.
Insofern die Bestellung ein Abonnement enthält, prüfen wir auch, ob jedes Abonnementprodukt virtuell ist. Sobald wir ein nicht-virtuelles Abonnement finden, setzen wir $all_subscriptions_virtual auf false.
Am Ende der Schleife überprüfen wir zwei Bedingungen: Wenn alle Artikel virtuell sind, schließen wir die Bestellung ab. Wenn die Bestellung ein Abonnement enthält und alle Artikel des Abonnements virtuell sind, schließen wir die Bestellung ebenfalls ab.
Dieser Code schließt die Bestellung ab, wenn sie ausschließlich aus virtuellen Produkten besteht oder wenn sie virtuelle Abonnements enthält. Er setzt voraus, dass das WooCommerce Subscriptions Plugin installiert und aktiviert ist, damit die abonnementbezogenen Funktionen funktionieren.
/**
*
* @author Chris Martens
* @link https://chris-martens.com/
* @link https://chris-martens.com/auto-complete-orders-woocommerce/
* @snippet Auto complete orders in WooCommerce. Dadurch wird verhindert, dass sie sich in der "Bearbeitung" befinden und auf einen manuellen Abschluss warten.
*
*/
function chrmrtns_autocomplete_virtual_orders($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
$all_items_virtual = true; // Assume all items are virtual initially
$all_subscriptions_virtual = true; // Assume all subscriptions are virtual initially
// Check if the order contains a subscription
$contains_subscription = function_exists('wcs_order_contains_subscription') && wcs_order_contains_subscription($order);
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
// If there's a non-virtual product, set the flag to false
if ($product && !$product->is_virtual()) {
$all_items_virtual = false;
}
// If there's a non-virtual subscription, set the flag to false
if ($contains_subscription && $product && wcs_is_subscription_product($product) && !$product->is_virtual()) {
$all_subscriptions_virtual = false;
}
}
// If all items are virtual or if all subscriptions are virtual, update the order status to 'completed'
if ($all_items_virtual || ($contains_subscription && $all_subscriptions_virtual)) {
$order->update_status('completed');
}
}
add_action('woocommerce_thankyou', 'chrmrtns_autocomplete_virtual_orders', 10, 1);
Eine weitere Möglichkeit, deine WooCommerce Orders zu bearbeiten
Wenn du in WooCommerce mit Abonnements zu tun hast, verwendest du in der Regel die WooCommerce Subscriptions-Erweiterung, um sie zu verwalten. Diese Erweiterung bietet eine Möglichkeit, den Status von Abonnements zu verwalten.
Wenn eine Bestellung, die ein Abonnement enthält, abgeschlossen ist, sollte WooCommerce Subscriptions das/die mit der Bestellung verbundene(n) Abonnement(e) automatisch auf “aktiv” setzen. Wenn du jedoch sicherstellen möchtest, dass dies geschieht, oder den Status der Abonnements manuell auf “aktiv” setzen möchtest, kannst du die WooCommerce-Aktion, die bei Abschluss einer Bestellung aufgerufen wird, einbinden.
Hier erfährst du, wie du deine bestehende Funktion so ändern kannst, dass sie auch verwandte Abonnements auf “aktiv” setzt:
/**
*
* @author Chris Martens
* @link https://chris-martens.com/
* @link https://chris-martens.com/auto-complete-orders-woocommerce/
* @snippet Auto complete orders in WooCommerce. Dadurch wird verhindert, dass sie sich in der "Bearbeitung" befinden und auf einen manuellen Abschluss warten.
*
*/
function chrmrtns_autocomplete_virtual_orders($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
$all_items_virtual = true; // Assume all items are virtual initially
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
// If there's a non-virtual product, set the flag to false
if ($product && !$product->is_virtual()) {
$all_items_virtual = false;
break; // No need to check other items if one is non-virtual
}
}
// If all items are virtual, update the order status to 'completed'
if ($all_items_virtual) {
$order->update_status('completed');
// If the order contains subscriptions, set them to 'active'
if (class_exists('WC_Subscriptions') && function_exists('wcs_order_contains_subscription') && wcs_order_contains_subscription($order)) {
$subscriptions = wcs_get_subscriptions_for_order($order_id);
foreach ($subscriptions as $subscription) {
// Only set the subscription to 'active' if it's not already set to 'active'
if (!$subscription->has_status('active')) {
$subscription->update_status('active');
}
}
}
}
}
add_action('woocommerce_thankyou', 'chrmrtns_autocomplete_virtual_orders', 10, 1);
Dieser Code prüft, ob die Bestellung Abonnements enthält, indem er die Funktion wcs_order_contains_subscription() verwendet. Ist dies der Fall, werden alle mit der Bestellung verknüpften Abonnements mit wcs_get_subscriptions_for_order() abgerufen. Dann wird jedes Abonnement in einer Schleife durchlaufen und sein Status auf “aktiv” gesetzt, wenn es nicht bereits aktiv ist.
Du kannst natürlich die einzelnen Blöcke auch miteinander verbinden – ich hoffe, ich konnte dir eine kleine Übersicht geben, was möglich ist, und wie du ggfs. deine Funktionen so anpasst, dass deine Orders in WooCommerce automatisch vervollständigt werden.
Wenn du Fragen hast, komm gern auf mich zu oder hinterlasse einen Kommentar.