You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8.0适配WooCommerce:含负区间的两日以内日期差计算及订单更新

问题修正:WooCommerce定时任务处理正负2天内订单状态更新

我在WooCommerce站点用定时任务(cron job)执行代码,当订单的ship_by_date_dont_edit字段日期在今日2天以内(含)时修改订单状态。目前代码能处理未来2天内的订单,但无法处理该日期已过期(负天数)的紧急订单,导致这类订单状态没更新。我尝试用$Diff->invert判断负数值,但错误触发了所有订单(包括未来60天以上的)状态修改,需要修正代码实现正负2天内的日期判断。


原代码

//==== status change to 'preparing to ship'
add_action( 'new_cron_status_update_lessthan_two_days', 'wp_order_status_update', 10, 1 );
function wp_order_status_update() {
    global $wpdb;
    $my_query = "SELECT * FROM wp_wc_order_stats where STATUS='wc-processing'";
    $result2 = $wpdb->get_results($my_query);
    foreach ($result2 as $results2) {
        $order_id = $results2->order_id;
        $thisacof7 = get_post_meta( $order_id, 'ship_by_date_dont_edit', true );
        $date1=$thisacof7; // date("Y-m-d h:i:s");
        $thisdate=date("Y-m-d h:i:s");
        $dateStart = new DateTime($date1);
        $datetoday = new DateTime($thisdate);
        $dteDiff = $dateStart->diff($datetoday);
        $Diff = $dteDiff->format("%a");
        if($Diff<2) {
            $order = new WC_Order($order_id);
            if (!empty($order)) {
                 $order->update_status( 'wc-preparing-to-ship' );
            }
        }
    }
}

错误尝试的代码片段

$resultPos = $Diff->invert;     
elseif ($resultPos=1) {
    $order = new WC_Order($order_id);
    if (!empty($order)) {
         $order->update_status( 'wc-preparing-to-ship' );
    }
}

问题分析

  1. 原代码中$dteDiff->format("%a")返回的是绝对值天数,所以$Diff<2只能匹配未来0-1天的订单,无法匹配已过期的订单。
  2. 错误尝试中直接用$Diff->invert是错误的:$Diff是格式化后的字符串,不是DateInterval对象,调用invert会报错;且$resultPos=1是赋值而非比较,导致所有订单都被错误匹配。

修正后的代码

//==== status change to 'preparing to ship'
add_action( 'new_cron_status_update_lessthan_two_days', 'wp_order_status_update', 10, 1 );
function wp_order_status_update() {
    global $wpdb;
    // 只查询processing状态的订单,减少无效循环
    $my_query = "SELECT * FROM wp_wc_order_stats where STATUS='wc-processing'";
    $result2 = $wpdb->get_results($my_query);
    
    foreach ($result2 as $results2) {
        $order_id = $results2->order_id;
        $ship_by_date = get_post_meta( $order_id, 'ship_by_date_dont_edit', true );
        
        // 跳过空日期的订单
        if (empty($ship_by_date)) {
            continue;
        }
        
        try {
            $date_ship_by = new DateTime($ship_by_date);
            $date_today = new DateTime(); // 默认取当前时间,无需手动格式化
            
            $diff = $date_ship_by->diff($date_today);
            $days_diff = (int)$diff->format("%r%a"); // %r带正负号,%a是天数
            
            // 匹配范围:已过期0-2天 或 未来0-1天(合计正负2天内)
            if ($days_diff >= -2 && $days_diff <= 1) {
                $order = wc_get_order($order_id); // WooCommerce推荐的订单获取方式
                if ($order) {
                    $order->update_status( 'wc-preparing-to-ship', '自动更新:发货日期在正负2天范围内' );
                }
            }
        } catch (Exception $e) {
            // 捕获日期格式错误,避免脚本中断
            error_log('订单'.$order_id.'的发货日期格式错误:'.$e->getMessage());
            continue;
        }
    }
}

关键修正点

  • 使用%r%a格式化差值,得到带正负号的天数:正数表示发货日期已过期,负数表示发货日期在未来。
  • 条件判断$days_diff >= -2 && $days_diff <= 1:精准覆盖已过期0-2天和未来0-1天的订单,满足正负2天内的需求。
  • 替换new WC_Order()为wc_get_order(),这是WooCommerce官方推荐的订单获取方法,兼容性更好。
  • 添加日期格式异常捕获,避免单个订单的日期错误导致整个定时任务中断。
  • 跳过空日期订单,减少无效处理逻辑。

内容的提问来源于stack exchange,提问作者Matthew Bernier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:10:46