自動取消 WooCommerce 中支付失敗的訂單

自動取消 WooCommerce 中支付失敗的訂單

本文旨在幫助開發者解決 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"         }     } }

代碼解釋:

  1. add_action( ‘woocommerce_cancel_unpaid_orders’, ‘cancel_failed_orders’ );: 這行代碼將 cancel_failed_orders 函數掛載到 woocommerce_cancel_unpaid_orders 動作上。 woocommerce_cancel_unpaid_orders 是一個 WooCommerce 提供的動作,用于處理取消未支付訂單的邏輯。

  2. $days_delay = 1;: 設置延遲天數。 這里設置為 1,表示超過 1 天未支付的訂單將被取消。

  3. $one_day = 24 * 60 * 60;: 計算一天的秒數,方便后續的時間計算。

  4. $today = strtotime( date(‘Y-m-d’) );: 獲取今天的日期時間戳。 這用于與訂單的創建日期進行比較,判斷是否超過了延遲天數。

  5. $failed_orders = wc_get_orders( … );: 使用 wc_get_orders 函數獲取所有符合條件的訂單。

    • ‘limit’ => -1:獲取所有符合條件的訂單,不限制數量。
    • ‘status’ => ‘failed’:指定訂單狀態為 “failed”。 注意,這里需要使用 ‘failed’ 而不是 ‘wc-failed’,因為 wc_get_orders 函數期望的是狀態的鍵名,而不是完整的狀態名稱。
    • ‘date_created’ => ‘
  6. if ( ! empty( $failed_orders ) ) { … }: 判斷是否找到了符合條件的訂單。

  7. $cancelled_text = __(“No successful payment”, “woocommerce”);: 設置取消訂單的原因,這里設置為 “No successful payment”。

  8. foreach ( $failed_orders as $order ) { … }: 遍歷所有符合條件的訂單。

  9. $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’),并設置合適的計劃任務來定期執行取消訂單的邏輯。 此外,請務必在測試環境中進行充分測試,以確保代碼能夠正確運行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享