AutomateWoo自定义触发器传参异常:无法获取自定义变量
AutomateWoo自定义触发器无法读取自定义变量的解决方案
问题背景
已依据AutomateWoo官方文档创建多个可正常运行的自定义触发器,现开发复杂触发器时需将product_id、product_name、date_created传递到AutomateWoo用于邮件内容。编写代码后触发器可正常显示,但无法找到这三个自定义变量。
问题原因
核心问题是自定义数据项未在触发器类的supplied_data_items数组中声明,AutomateWoo仅会识别该数组中定义的数据项,未声明的字段无法在邮件模板或规则中被调用。此外代码中还有几处细节需要修正。
解决方案
1. 声明自定义数据项
在触发器类的supplied_data_items数组中添加自定义字段,明确告知AutomateWoo这些数据是可用的:
public $supplied_data_items = array('product', 'product_name', 'product_id', 'created_date');
2. 修正数据传递逻辑
- 确保
catch_hooks方法中传递的变量名清晰准确,同时将WC_DateTime类型的日期转为字符串格式,方便邮件使用:
public function catch_hooks( $product, $product_id ) { $product_name = $product->get_name(); // 将日期对象格式化为可读字符串,可根据需求调整格式 $date_created = $product->get_date_created()->format('Y-m-d H:i:s'); $this->maybe_run(array( 'product' => $product, 'product_name' => $product_name, 'product_id' => $product_id, 'created_date' => $date_created, )); }
注:如果外部传入的
$product_id实际是SKU,建议改用$product->get_sku()获取,避免依赖外部参数导致数据错误。
3. 优化验证逻辑
若无需额外验证,validate_workflow方法可简化为直接返回true,移除多余的数据读取代码:
public function validate_workflow( $workflow ) { return true; }
4. 确保触发动作参数正确
触发触发器时,需保证do_action的参数顺序与catch_hooks方法一致:
do_action('product_created', $product_object, $product_id);
完整修改后的代码
<?php if ( ! defined( 'ABSPATH' ) ) { exit; // 禁止直接访问 } /** * 自定义产品创建触发器 * 触发方式: do_action('product_created', $product, $product_id ); */ class Product_Created_Trigger extends AutomateWoo\Trigger { /** * 声明触发器提供的数据项 * @var array */ public $supplied_data_items = array('product', 'product_name', 'product_id', 'created_date'); /** * 初始化触发器 */ public function init() { $this->title = __( '产品已创建', 'automatewoo-custom' ); $this->group = __( '产品', 'automatewoo-custom' ); } /** * 加载触发器字段(可选) */ public function load_fields() {} /** * 注册钩子 */ public function register_hooks() { add_action( 'product_created', array( $this, 'catch_hooks' ), 9999, 2 ); } /** * 捕获钩子并触发触发器 * @param WC_Product $product * @param int $product_id */ public function catch_hooks( $product, $product_id ) { $product_name = $product->get_name(); // 格式化创建日期为字符串 $date_created = $product->get_date_created()->format('Y-m-d H:i:s'); $this->maybe_run(array( 'product' => $product, 'product_name' => $product_name, 'product_id' => $product_id, 'created_date' => $date_created, )); } /** * 验证工作流(可选) * @param AutomateWoo\Workflow $workflow * @return bool */ public function validate_workflow( $workflow ) { // 如需验证可在此添加逻辑,示例直接返回true return true; } } // 在functions.php中注册触发器 add_filter( 'automatewoo/triggers', 'product_created_trigger' ); /** * @param array $triggers * @return array */ function product_created_trigger( $triggers ) { include_once 'woocommerce/automatewoo/product_created_trigger.php'; $triggers['product_created_trigger'] = 'Product_Created_Trigger'; return $triggers; }
使用说明
修改完成后,在AutomateWoo的邮件模板或规则配置中,即可通过以下变量调用自定义数据:
{{ product_name }}:产品名称{{ product_id }}:产品ID{{ created_date }}:产品创建日期
内容的提问来源于stack exchange,提问作者TechGhost
相关产品推荐
相关产品推荐

