webentwicklung-frage-antwort-db.com.de

Eine stornierte Bestellung in Woocommerce automatisch entfernen

Ich habe mich auf dieser Website und im Internet umgesehen, kann aber anscheinend keine Lösung finden. Mein Kunde möchte, dass jede Bestellung mit storniertem Bestellstatus nach einiger Zeit vollständig aus WooCommerce entfernt wird.

<?php
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();

if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) {    
        wp_delete_post($order_id,true);    
   }    


}

Ich habe derzeit den obigen Codeausschnitt, möchte jedoch, dass diese Aktion um 5 Minuten verzögert wird, da ausstehende Bestellungen möglicherweise noch in Zahlung gehen.

Daher sollten TL; DR-Bestellungen mit dem Status "Storniert", "Fehlgeschlagen" und "Ausstehend" nach 5 Minuten vollständig gelöscht werden.

Wer könnte mir bei diesem helfen?

Viele Grüße, Dylan

1
Dylan Smit

führen Sie den folgenden Code in der Datei function.php Ihres untergeordneten Themas aus, wie unten angegeben.

function wc_remove_cancelled_status( $statuses ){
  if( isset( $statuses['wc-cancelled'] ) ){
      unset( $statuses['wc-cancelled'] );
  }
  return $statuses;
} 
add_filter( 'wc_order_statuses', 'wc_remove_cancelled_status' );
1
Niket Joshi

Ich denke, der Benutzer kann den Auftragsstatus innerhalb von fünf Minuten ändern. Also habe ich den folgenden Code mit hook-

add_action( 'woocommerce_order_status_failed', 'the_dramatist_woocommerce_auto_delete_order' );
add_action( 'woocommerce_order_status_pending', 'the_dramatist_woocommerce_auto_delete_order' );
add_action( 'woocommerce_order_status_cancelled', 'the_dramatist_woocommerce_auto_delete_order' );

function the_dramatist_woocommerce_auto_delete_order( $order_id ) {
    // 5*60 = 300 seconds. Here 1minute = 60 seconds.
    wp_schedule_single_event(tim() + 300, 'the_dramatist_main_delete_event', $order_id);
}

function the_dramatist_main_delete_event( $order_id ) {
    global $woocommerce;
    $order = new WC_Order( $order_id );
    $order_status = $order->get_status();
    if ( !$order_id )
        return false;
    if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) {
        wp_delete_post($order_id,true);
        return true;
    }
    return false;
}

Hier stellen wir fest, dass sich der Auftragsstatus nach dem Aufwachen aus dem Ruhezustand geändert hat, und überprüfen den Auftragsstatus erneut. Wenn der Benutzer den Auftragsstatus innerhalb von fünf Minuten ändert, wird der Löschvorgang nicht ausgeführt. Bitte testen Sie es. Ich habe es nicht getestet. Hoffe das hilft dir.

P.S. Ich denke, dass die Funktion sleep() den Lebenszyklus von WordPress etwas verzögern wird. Also verwenden wir besser die wp_schedule_single_event Funktion. Also habe ich meinen Code aktualisiert.

1
CodeMascot

Hmm ... Wenn wir Ihr Skript verwenden, denke ich, wenn Sie die Zeit sparen, wie:

<?php
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();

if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) { 
        $current_time = date('h:i:s');    /* this is not necessary - not being used. */

        sleep(300);       // 300 seconds in 5 minutes

        wp_delete_post($order_id,true);    
   }    


}

Ich weiß nicht, ob das funktionieren wird, aber es ist einen Versuch wert.

0
user23355