如何获取指定起始日期之后创建的WooCommerce订单?
如何获取指定起始日期之后创建的WooCommerce订单?
没问题,我帮你调整代码来实现从指定起始日期筛选WooCommerce订单的需求~ 核心思路是把你指定的起始日期转换成WooCommerce专用的WC_DateTime对象,然后和订单的日期做直接比较(避免原代码中24小时差值的局限),同时要注意时区统一,防止跨时区的判断误差。
思路说明
原代码通过计算当前时间与订单时间的24小时差值来筛选订单,现在我们需要把逻辑改成:判断订单的创建/完成日期是否晚于或等于你指定的起始日期。关键是要让起始日期和订单日期使用相同的时区,确保比较结果准确。
修改后的完整代码(推荐写法)
// 1. 定义你的起始日期(注意格式要和createFromFormat的参数对应) $my_start_date = '2024/11/01'; // 将字符串日期转换为WC_DateTime对象,同时统一使用站点默认时区 $start_date = WC_DateTime::createFromFormat('Y/m/d', $my_start_date); $start_date->setTimezone( wc_timezone() ); // 对齐WooCommerce站点时区 // 2. 处理单个订单(假设你在循环订单列表,这里是单条订单的判断逻辑) $order = wc_get_order( $customer_order ); // 注意:根据需求选择日期类型 // - 订单创建日期:用get_date_created() // - 订单完成日期:用get_date_completed() $order_date_dt = $order->get_date_created(); $order_date_dt->setTimezone( wc_timezone() ); // 统一时区 // 3. 核心判断:订单日期是否晚于/等于起始日期 if ( $order_date_dt >= $start_date ) { echo '<p>订单是从2024/11/01至今创建的</p>'; }
基于你原代码结构的适配版本
如果你想保留原代码的变量结构,只需要替换掉24小时差值的逻辑,改成时间戳比较即可:
$my_start_date = '2024/11/01'; // 转换起始日期为WC_DateTime对象并对齐时区 $start_date = WC_DateTime::createFromFormat('Y/m/d', $my_start_date); $start_date->setTimezone( wc_timezone() ); $start_ts = $start_date->getTimestamp(); // 起始日期的时间戳 $order = wc_get_order( $customer_order ); $date_created_dt = $order->get_date_completed(); $date_created_dt->setTimezone( wc_timezone() ); // 统一时区 $date_created_ts = $date_created_dt->getTimestamp(); // 订单完成日期的时间戳 // 直接比较时间戳:订单时间 >= 起始日期时间 if ( $date_created_ts >= $start_ts ) { echo '<p>订单是从2024/11/01至今完成的</p>'; }
关键注意事项
- 时区必须统一:WooCommerce的
WC_DateTime对象自带时区属性,一定要确保起始日期和订单日期使用相同的时区(推荐用wc_timezone()获取站点默认时区),否则会出现跨时区的判断错误。 - 日期格式要对应:
createFromFormat的第一个参数必须和你的日期字符串格式完全匹配,比如你用01/11/2024(日/月/年)的话,就要把格式改成d/m/Y,否则日期转换会失败。 - 明确日期类型:仔细区分你要筛选的是「订单创建日期」还是「订单完成日期」,分别对应
get_date_created()和get_date_completed(),不要搞混。
备注:内容来源于stack exchange,提问作者JPashs
相关产品推荐
相关产品推荐

