使用Woocommerce Advanced Export导出当日WooCommerce预订订单的代码报错求助
自定义代码实现当日预订记录导出的开发问题
基础情况
- 使用环境为搭载WooCommerce的电商站点,同时安装两个配套插件:WooCommerce Booking(预订功能插件)、WooCommerce Advanced Export(高级订单导出插件)
- 核心需求:执行订单导出操作时,仅筛选导出当日的预订记录,排除其他非当日、非预订类的订单数据
- 已完成的前置配置:搭建好目标导出表格,完成导出规则、字段映射的全部相关配置
遇到的异常
- 不加载自定义筛选代码时,导出流程默认输出站点全量订单,无法实现当日预订的筛选效果
- 加载自行编写的筛选代码时,程序直接触发报错,无法正常运行导出流程,对应报错截图见原提问附图
已尝试编写的代码
第一版测试代码
参考现有过滤器示例的逻辑编写:
// 原参考示例注释:仅导出总金额大于10的订单 add_filter( 'woe_order_export_started', function ( $order_id ) { $order = new WC_Order($order_id); return ($order->get_booking_field_start_date() = str_replace( '{today}', $today, $settings)); });
第二版调整代码
因不确定第一版调用的预订字段是否正确,调整字段获取方法后写出第二版测试代码:
// 原参考示例注释:仅导出总金额大于10的订单 add_filter( 'woe_order_export_started', function ( $order_id ) { $order = new WC_Order($order_id); return ($order->woe_get_order_product_value_booking_start_date() = str_replace( '{today}', $today, $settings)); });
原编写代码存在的核心问题
- 过滤器逻辑认知偏差:
woe_order_export_started过滤器的返回值为布尔类型,返回true则将当前订单纳入导出范围,返回false则跳过该订单。原代码中使用赋值运算符=替代比较运算符,且未定义$today、$settings两个变量,会直接触发语法报错。 - 字段获取逻辑错误:WooCommerce Booking的预订开始日期属于独立的预订对象属性,既不是订单对象的内置方法,也不是WooCommerce Advanced Export自带的调用方法,无法通过
$order->xxx()的链式调用直接获取。 - 筛选逻辑错误:原代码使用字符串匹配替换的方式判断日期,没有实际完成「预订日期等于当日」的对比判断。
适配需求的正确实现代码
将以下代码添加到主题的functions.php文件或自定义功能插件中即可实现目标功能:
add_filter( 'woe_order_export_started', function( $order_id ) { // 默认状态为不导出当前订单 $allow_export = false; // 获取标准化订单对象 $order = wc_get_order( $order_id ); // 遍历订单下的所有商品行项目 foreach( $order->get_items() as $item ) { // 获取行项目关联的预订ID $booking_id = wc_get_order_item_meta( $item->get_id(), '_booking_id', true ); if( $booking_id ) { // 加载对应预订对象 $booking = get_wc_booking( $booking_id ); // 格式化预订开始日期为标准年月日格式 $booking_start_date = date( 'Y-m-d', $booking->get_start() ); // 对比是否为当日日期 if( $booking_start_date === date( 'Y-m-d' ) ) { $allow_export = true; break; } } } // 返回布尔值控制导出范围 return $allow_export; });
代码说明
- 代码通过WooCommerce Booking官方内置函数获取预订关联数据,无需手动拼接自定义字段名,可避免因字段调用错误触发的程序报错。
- 日期对比环节统一使用
Y-m-d格式,可规避时区差异、时间格式不统一导致的判断失效问题。 - 遍历订单行项目时,只要匹配到一条当日的预订记录,就将对应订单纳入导出范围,符合实际业务操作习惯。
内容的提问来源于stack exchange,提问作者Alasdair MacEwan
相关产品推荐
相关产品推荐

