自定义订单状态:已注册邮件操作但邮件未发送问题排查
问题诊断与修复方案
核心问题:类内钩子注册位置错误
你代码的关键问题是在WC_Ready_For_Pickup_Email类中,直接将add_action语句写在了类的方法外部,这属于PHP语法错误,导致这些钩子根本没被正确注册,自然不会触发trigger和taf方法,也就看不到error_log的输出。
修复步骤
将两个add_action调用移动到类的__construct方法内部,放在parent::__construct();之后:
修改后的class-wc-ready-for-pickup-email.php核心代码:
class WC_Ready_For_Pickup_Email extends WC_Email { public function __construct() { $this->id = 'wc_ready_for_pickup'; $this->customer_email = true; $this->title = __( 'Ready for Pick-up', 'lockoloop-customizer' ); $this->description = __( 'Ready for Pick-up emails are sent to customers when their orders are marked ready for pick-up.', 'lockoloop-customizer' ); $this->template_base = LCLPC_ADMIN_TEMPLATES_DIR; $this->template_html = 'emails/customer-ready-for-pickup.php'; $this->template_plain = 'emails/plain/customer-ready-for-pickup.php'; $this->recipient = '{customer_email}'; $this->placeholders = array( '{order_date}' => '', '{order_number}' => '', ); parent::__construct(); // 将钩子注册移到构造函数内 add_action( 'woocommerce_order_status_ready', array( $this, 'trigger' ), 10, 2 ); add_action( 'woocommerce_order_status_changed', array( $this, 'taf' ), 10, 3 ); // 注意:该钩子实际传递3个参数 } public function taf( $order_id, $old_status, $new_status ) { error_log('Taf triggered. Order ID: ' . $order_id . ', Old Status: ' . $old_status . ', New Status: ' . $new_status); } // 其余方法保持不变... }
额外注意事项
- 钩子参数数量修正:
woocommerce_order_status_changed钩子实际传递3个参数($order_id,$old_status,$new_status),之前写的10, 2会导致参数接收不全,需修正为10, 3并更新taf方法的参数列表,方便调试。 - 邮件启用状态检查:确保WooCommerce后台「邮件设置」中,已启用「Ready for Pick-up」邮件模板。
- 增强调试日志:可在
trigger方法开头添加更详细的日志,比如:
public function trigger( $order_id, $order = false ) { error_log('Trigger called for order ID: ' . $order_id); // 其余代码... }
- 状态钩子格式确认:你注册的状态是
wc-ready,对应的WooCommerce状态切换钩子woocommerce_order_status_ready格式正确,无需修改。
验证修复
修改代码后刷新后台,将任意订单状态改为「Ready for pick-up」,查看服务器error_log文件,应该能看到Yo和Taf相关日志输出,同时邮件会正常发送。
内容的提问来源于stack exchange,提问作者Zealot
相关产品推荐
相关产品推荐

