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' ); } }
问题分析
- 原代码中
$dteDiff->format("%a")返回的是绝对值天数,所以$Diff<2只能匹配未来0-1天的订单,无法匹配已过期的订单。 - 错误尝试中直接用
$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
相关产品推荐
相关产品推荐

