web-dev-qa-db-fra.com

Supprimer automatiquement une commande annulée dans Woocommerce

Vous avez cherché sur ce site et sur Internet, mais vous n'arrivez pas à trouver une solution. Mon client souhaite que toutes les commandes dont le statut est annulé soient complètement supprimées de WooCommerce après un certain temps.

<?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);    
   }    


}

J'ai actuellement l'extrait de code ci-dessus, mais je souhaite que cette action soit retardée de 5 minutes, car les commandes en attente pourraient toujours être en cours de paiement.

Donc, TL; Les commandes DR avec le statut 'annulé', 'échoué' & 'en attente' doivent être complètement supprimées au bout de 5 minutes.

Quelqu'un qui pourrait m'aider sur celui-ci?

Cordialement, Dylan

1
Dylan Smit

faites le code suivant dans le fichier function.php de votre thème enfant, comme indiqué ci-dessous.

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

Je pense que l'utilisateur peut modifier l'état de la commande dans les cinq minutes. J'ai donc écrit le code ci-dessous avec 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;
}

Nous détectons ici le changement d'état de la commande par hook et le vérifions à nouveau après le réveil. Donc, si l'utilisateur modifie le statut de la commande dans cinq minutes, la suppression n'aura pas lieu. S'il vous plaît testez-le. Je ne l'ai pas testé. J'espère que cela vous aidera.

P.S. Je pense que la fonction sleep() causera un certain retard dans le cycle de vie de WordPress. Donc, mieux nous utilisons la fonction wp_schedule_single_event. J'ai donc mis à jour mon code.

1
CodeMascot

Hmm ... Si nous utilisons votre script, je pense que si vous gagnez du temps comme:

<?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);    
   }    


}

Ecoute, je ne sais pas si ça va marcher, mais ça vaut le coup d'essayer.

0
user23355