WooCommerce如何在工作日8-16点自动将订单状态改为已完成
WooCommerce 营业时间自动变更订单状态实现方案
你之前的代码容易失效主要是两个核心问题:
- 绑定在下单触发的函数中,仅当用户下单瞬间会执行判断,如果订单是运营人员在营业时间手动改成「处理中」的,或者订单在非营业时间下单、营业时间才进入「处理中」状态,都不会触发状态变更
- 时间判断逻辑冗余,且硬编码时区容易和WordPress后台设置冲突,导致时间判断错误
以下是可直接放到主题functions.php文件中使用的实现代码:
add_action('woocommerce_order_status_processing', 'auto_complete_order_during_working_hours', 10, 1); function auto_complete_order_during_working_hours( $order_id ) { // 获取订单对象,已完成的订单直接跳过 $order = wc_get_order( $order_id ); if( !$order || $order->get_status() === 'completed' ) return; // 读取WordPress后台设置的时区,避免硬编码冲突 $timezone = get_option('timezone_string'); if( empty($timezone) ) $timezone = 'Europe/London'; // 兜底时区,可按需修改 $datetime = new DateTime('now', new DateTimeZone($timezone)); // 判断是否为周一到周五 $week_day = $datetime->format('w'); if( !in_array( $week_day, [1,2,3,4,5] ) ) return; // 判断是否在8:00-16:00之间 $current_hour = $datetime->format('H'); if( $current_hour < 8 || $current_hour >= 16 ) return; // 所有条件符合,更新订单为已完成 $order->update_status('completed'); }
该方案的优势:
- 绑定WooCommerce官方的
woocommerce_order_status_processing钩子,只要订单状态变为「处理中」就会触发判断,不管是用户下单自动触发、还是运营人员手动修改的状态,都不会漏执行 - 直接读取WordPress后台的时区设置,不需要硬编码时区,避免时间判断偏差
- 逻辑简化,冗余判断全部去掉,执行效率更高
- 自带已完成状态校验,不会重复执行修改操作
内容的提问来源于stack exchange,提问作者AspireP
相关产品推荐
相关产品推荐

