本文旨在帮助开发者解决 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’),并设置合适的计划任务来定期执行取消订单的逻辑。 此外,请务必在测试环境中进行充分测试,以确保代码能够正确运行。