この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分後に完全に削除されます。
これを手伝ってくれる人は誰?
よろしく、ディラン
下記のようにあなたの子供のテーマの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' );
ユーザーは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
関数を使うことです。そこで私は自分のコードを更新しました。
うーん...私達があなたのスクリプトを使用する場合は、私はあなたがように時間を節約するかどうかと思います:
<?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);
}
}
これがうまくいくかどうかはわかりませんが、試してみる価値があります。