web-dev-qa-db-ja.com

Woocommerceでキャンセルされた注文を自動的に削除

このWebサイトとインターネットを見回していましたが、解決策を見つけることができないようです。私のクライアントは、注文ステータスがキャンセルされたすべての注文をしばらくしてからWooCommerceから完全に削除することを望んでいます。

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


}

私は現在上記のコードスニペットを持っていますが、未決注文がまだ支払中である可能性があるので、私はこのアクションが5分遅れるようにしたいです。

そのため、TL; DRのステータスが「キャンセル済み」、「失敗」、「保留中」の場合、5分後に完全に削除されます。

これを手伝ってくれる人は誰?

よろしく、ディラン

1
Dylan Smit

下記のようにあなたの子供のテーマのfunction.phpファイルで次のコードをしてください。

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

ユーザーは5分以内に注文状況を変更できると思います。だから私はフックで以下のコードを書きました -

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

ここでは、注文ステータスの変更をフックで検出し、スリープからの復帰後に再度注文ステータスを確認しています。そのため、ユーザーが5分以内にで注文のステータスを変更した場合、削除は行われません。テストしてください。私はそれをテストしていません。お役に立てば幸いです。

P.S sleep()関数はWordPressのライフサイクルを遅らせると思います。もっと良いのはwp_schedule_single_event関数を使うことです。そこで私は自分のコードを更新しました。

1
CodeMascot

うーん...私達があなたのスクリプトを使用する場合は、私はあなたがように時間を節約するかどうかと思います:

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


}

これがうまくいくかどうかはわかりませんが、試してみる価値があります。

0
user23355