Zahlung ausstehend in WooCommerce: So haben wir das Problem gelöst

In WooCommerce kann es vorkommen, dass Bestellungen mit dem Status „pending“ (Zahlung ausstehend) stehenbleiben, wenn der Kunde die Zahlung abbricht oder nicht abschließt. Dies kann zu Missverständnissen und unvollständigen Bestellungen führen. In diesem Artikel zeigen wir Ihnen, wie Sie mithilfe von benutzerdefiniertem Code eine Lösung implementieren können, die Bestellungen automatisch auf „failed“ setzt und eine E-Mail-Benachrichtigung an den Kunden sendet.

Schritt 1: Automatische Änderung des Bestellstatus auf „failed“

Der folgende Code überprüft alle Bestellungen, die sich im Status „pending“ befinden, und setzt diese nach einer bestimmten Zeitspanne auf „failed“.


// Automatische Änderung des Status von „pending“ zu „failed“
function check_pending_orders_for_failure() {
    $args = array(
        'status' => 'pending',
        'limit' => -1,
    );

    $orders = wc_get_orders($args);
    
    foreach ($orders as $order) {
        // Setze die Bestellung direkt auf "failed"
        $order->update_status('failed');
    }
}

// Cron-Job registrieren, falls er noch nicht existiert
if (!wp_next_scheduled('check_pending_orders')) {
    wp_schedule_event(time(), 'five_minutes', 'check_pending_orders');
}

add_action('check_pending_orders', 'check_pending_orders_for_failure');

Schritt 2: E-Mail-Benachrichtigung bei „failed“-Status

Der folgende Code sendet eine E-Mail-Benachrichtigung an den Kunden, wenn eine Bestellung auf „failed“ gesetzt wird. Die E-Mail enthält einen Zahlungslink, um die Bestellung abzuschließen.


// E-Mail senden, wenn der Status auf „failed“ gesetzt wird
function send_email_on_payment_failure_or_cancellation($order_id) {
    // Holen der Bestellung
    $order = wc_get_order($order_id);

    // Prüfen, ob die Bestellung im Status „failed“ ist
    if ($order->get_status() === 'failed') {
        // Kundendaten
        $customer_email = $order->get_billing_email();

        // Zahlungslink erstellen
        $payment_url = $order->get_checkout_payment_url();
        
        // Bestellnummer abrufen
        $order_number = $order->get_order_number();

        // E-Mail-Inhalt
        $subject = 'Ihre Zahlung steht noch aus';
        $message = 'Hallo ' . $order->get_billing_first_name() . ' ' . $order->get_billing_last_name() . ',

'; $message .= 'Ihre Zahlung für die Bestellung mit der Bestellnummer ' . $order_number . ' wurde abgebrochen oder ist fehlgeschlagen. Bitte führen Sie die Zahlung so bald als möglich durch, damit wir die Bearbeitung Ihrer Bestellung fortsetzen können.

'; $message .= 'Sie können die Zahlung über den folgenden Link durchführen:
'; $message .= 'Zahlung abschließen

'; $message .= 'Vielen Dank!
'; $message .= 'Ihr Unternehmen'; // E-Mail-Header $headers = array('Content-Type: text/html; charset=UTF-8'); // E-Mail senden wp_mail($customer_email, $subject, $message, $headers); } } add_action('woocommerce_order_status_failed', 'send_email_on_payment_failure_or_cancellation', 10, 1);

Schritt 3: Verwendung des WP Crontrol Plugins zur Überprüfung von Cron Jobs

Manchmal kann es vorkommen, dass WordPress Cron Jobs nicht korrekt registriert oder ausgeführt werden. In solchen Fällen kann das WP Crontrol Plugin helfen, die Cron Jobs zu überwachen und manuell auszuführen.

  1. Installation von WP Crontrol: Installieren und aktivieren Sie das WP Crontrol Plugin aus dem WordPress Plugin-Repository.
  2. Überprüfung der Cron Jobs: Gehen Sie in Ihrem WordPress Dashboard zu Werkzeuge > Cron-Ereignisse, um eine Liste aller registrierten Cron Jobs anzuzeigen.
  3. Überprüfen Sie, ob „check_pending_orders“ registriert ist: Suchen Sie in der Liste nach „check_pending_orders“. Falls er nicht vorhanden ist, können Sie ihn hier manuell hinzufügen oder die Registrierung im Code überprüfen.
  4. Manuelles Ausführen: Wenn Sie „check_pending_orders“ in der Liste finden, können Sie auf „Jetzt ausführen“ klicken, um den Cron Job manuell auszulösen und sicherzustellen, dass er korrekt funktioniert.

Schritt 4: Benutzer nach dem Login zur Bestellung zurückführen

Um sicherzustellen, dass Kunden nach dem Login ihre ursprüngliche Bestellung weiterbearbeiten können, haben wir einen Code integriert, der die Bestellung nach erfolgreichem Login wieder aufgreift.


// Benutzer nach dem Login zur richtigen Checkout-Seite weiterleiten
add_filter('woocommerce_login_redirect', 'redirect_to_checkout_or_payment_after_login', 10, 2);
function redirect_to_checkout_or_payment_after_login($redirect_to, $user) {
    if (isset($_GET['redirect_to_checkout'])) {
        // Prüfen, ob eine Bestellung über den "pay_for_order" und den Schlüssel vorliegt
        if (isset($_GET['pay_for_order']) && isset($_GET['key'])) {
            $order_key = sanitize_text_field($_GET['key']);
            $order_id = wc_get_order_id_by_order_key($order_key);
            $order = wc_get_order($order_id);

            // Sicherstellen, dass die Bestellung existiert und dem Benutzer gehört
            if ($order && $order->get_user_id() == $user->ID) {
                return $order->get_checkout_payment_url();
            }
        }
        // Standard-Weiterleitung zur Kasse, falls keine spezifische Bestellung gefunden wird
        return wc_get_checkout_url();
    }
    return $redirect_to;
}

Fazit

Durch die Verwendung des obigen Codes und des WP Crontrol Plugins haben Sie nun eine Möglichkeit, die Bestellverwaltung in WooCommerce zu automatisieren. Bestellungen werden automatisch auf „failed“ gesetzt, wenn sie nicht rechtzeitig abgeschlossen werden, und Kunden erhalten eine E-Mail-Benachrichtigung, um die Zahlung fortzusetzen.