Auto Complete Orders in WooCommerce

Auto Complete Orders WooCommerce

Table of content

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.

Related posts

WP Mail ist nicht kaputt - DKIM für wp_mail

WP_Mail ist nicht kaputt

Reading Time: 10:54 min

Warum versuchen dann alle, es zu reparieren? Ich versuche, es zu erklären. WP_Mail() ohne funktionierendem DKIM schlägt fehl – und hier bekommst du die Lösung. Ich zeige dir, wie du…

View post
Offset für Anchor Links in Bricks

Offset für Smooth Scroll in Bricks hinzufügen

Reading Time: 1:22 min

Wie du das Offset für Anchor Links in Bricks anpassen kannst, siehst du hier. Wenn du Anchor Links in Bricks nutzt, dann musst du ggfs. dein Offset anpassen. Was ist…

View post
Mann am Computer - Cyberpanel Block 7080

Cyberpanel webAdmin – Blocke Port 7080

Reading Time: 1:37 min

Wie blockt man den Zugriff auf den Port 7080 in Cyberpanel? Möchtest du den Zugang zu 7080 blockieren und die Firewall-Regeln werden nicht wie erwartet aktualisiert? Wenn du Openlitespeed für…

View post

Hinterlasse den ersten Kommentar