本文旨在幫助開發者解決 WooCommerce 中自動將“失敗”狀態的訂單更改為“取消”狀態的問題。通過使用 woocommerce_cancel_unpaid_orders 動作,并結合時間條件判斷,可以實現自動取消超時未支付的訂單,從而提高訂單管理的效率。本文提供詳細的代碼示例和注意事項,助你輕松實現該功能。
在 WooCommerce 中,自動將支付失敗的訂單狀態更改為“已取消”是一個常見的需求,尤其是在未付款訂單超時后。原始代碼嘗試使用 woocommerce_cancel_unpaid_submitted 動作,但該動作并不存在。正確的動作應該是 woocommerce_cancel_unpaid_orders。以下是修改后的代碼,并附帶詳細解釋。
核心代碼實現:
<?php add_action( 'woocommerce_cancel_unpaid_orders', 'cancel_failed_orders' ); function cancel_failed_orders() { $days_delay = 1; // 設置延遲天數,例如 1 天 $one_day = 24 * 60 * 60; // 一天的秒數 $today = strtotime( date('Y-m-d') ); // 獲取今天的日期時間戳 // 獲取所有狀態為 "failed" 且創建日期早于指定天數的訂單 $failed_orders = wc_get_orders( array( 'limit' => -1, // 獲取所有符合條件的訂單 'status' => 'failed', // 訂單狀態為 "failed" 'date_created' => '<' . ( $today - ($days_delay * $one_day) ), // 創建日期早于指定天數 ) ); if ( ! empty( $failed_orders ) ) { $cancelled_text = __("No successful payment", "woocommerce"); // 取消訂單的原因 foreach ( $failed_orders as $order ) { $order->update_status( 'cancelled', $cancelled_text ); // 更新訂單狀態為 "cancelled" } } }
代碼解釋:
-
add_action( ‘woocommerce_cancel_unpaid_orders’, ‘cancel_failed_orders’ );: 這行代碼將 cancel_failed_orders 函數掛載到 woocommerce_cancel_unpaid_orders 動作上。 woocommerce_cancel_unpaid_orders 是一個 WooCommerce 提供的動作,用于處理取消未支付訂單的邏輯。
-
$days_delay = 1;: 設置延遲天數。 這里設置為 1,表示超過 1 天未支付的訂單將被取消。
-
$one_day = 24 * 60 * 60;: 計算一天的秒數,方便后續的時間計算。
-
$today = strtotime( date(‘Y-m-d’) );: 獲取今天的日期時間戳。 這用于與訂單的創建日期進行比較,判斷是否超過了延遲天數。
-
$failed_orders = wc_get_orders( … );: 使用 wc_get_orders 函數獲取所有符合條件的訂單。
- ‘limit’ => -1:獲取所有符合條件的訂單,不限制數量。
- ‘status’ => ‘failed’:指定訂單狀態為 “failed”。 注意,這里需要使用 ‘failed’ 而不是 ‘wc-failed’,因為 wc_get_orders 函數期望的是狀態的鍵名,而不是完整的狀態名稱。
- ‘date_created’ => ‘
-
if ( ! empty( $failed_orders ) ) { … }: 判斷是否找到了符合條件的訂單。
-
$cancelled_text = __(“No successful payment”, “woocommerce”);: 設置取消訂單的原因,這里設置為 “No successful payment”。
-
foreach ( $failed_orders as $order ) { … }: 遍歷所有符合條件的訂單。
-
$order->update_status( ‘cancelled’, $cancelled_text );: 更新訂單狀態為 “cancelled”,并添加取消訂單的原因。 注意,這里需要使用 ‘cancelled’ 而不是 ‘wc-cancelled’。
注意事項:
- 狀態名稱: 確保使用正確的狀態名稱(’failed’ 和 ‘cancelled’),而不是完整的狀態名稱(’wc-failed’ 和 ‘wc-cancelled’)。
- 動作選擇: 使用 woocommerce_cancel_unpaid_orders 動作,而不是 woocommerce_cancel_unpaid_submitted。
- 測試: 在生產環境中使用前,務必在測試環境中進行充分測試,確保代碼能夠正確運行。
- 計劃任務: woocommerce_cancel_unpaid_orders 動作默認情況下不會自動運行。你需要設置一個計劃任務(Cron Job)來定期觸發該動作。你可以使用 WordPress 內置的 WP-Cron,或者服務器級別的 Cron Job。
- WP-Cron 的限制: WP-Cron 依賴于網站的訪問量來觸發計劃任務。如果網站訪問量較低,計劃任務可能不會按時執行。建議使用服務器級別的 Cron Job,以確保計劃任務能夠準確執行。
總結:
通過以上步驟,你可以實現 WooCommerce 中自動取消支付失敗的訂單。 關鍵在于使用正確的動作 (woocommerce_cancel_unpaid_orders) 和狀態名稱 (‘failed’ 和 ‘cancelled’),并設置合適的計劃任務來定期執行取消訂單的邏輯。 此外,請務必在測試環境中進行充分測試,以確保代碼能夠正確運行。