You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交表单时WooCommerce自定义邮件类未加载问题咨询

WooCommerce admin-post表单提交时邮件子类加载失败问题解决

核心问题根源

admin-post.php的加载流程和WooCommerce邮件类的初始化时机不匹配:后台设置页面是在WooCommerce完全加载后渲染的,所以邮件子类能正常显示;但admin-post请求的触发时机更早——*admin_post_钩子会在WooCommerce邮件系统完成注册前执行,导致你调用时子类还没被加载,自然返回null,自定义钩子也无响应。

具体解决步骤

1. 提前加载邮件类文件

把你的RMA邮件类(父类+子类)的加载逻辑绑定到plugins_loaded的高优先级(比如优先级5),确保在admin_post钩子触发前完成类的注册:

add_action('plugins_loaded', 'load_rma_email_components', 5);
function load_rma_email_components() {
    // 替换为你的实际文件路径
    require_once plugin_dir_path(__FILE__) . 'includes/class-rma-wc-email.php';
    require_once plugin_dir_path(__FILE__) . 'includes/class-rma-approved-email.php';
    
    // 调用注册方法
    RMA_WC_Email::register_email();
}

2. 手动初始化WooCommerce邮件系统(兜底方案)

如果提前加载还是无效,在你的process_request_action函数开头,手动触发WooCommerce邮件系统初始化,强制完成所有邮件类的注册:

function process_request_action() {
    // 确保WooCommerce邮件系统已初始化
    if (!class_exists('WC_Emails')) {
        WC()->mailer();
    }

    // 现在再触发自定义钩子或调用邮件类
    $order_id = isset($_POST['order_id']) ? absint($_POST['order_id']) : 0;
    do_action('woocommerce_rma_pending_to_approved_notification', $order_id);

    // 处理完后跳转回原页面(可选)
    wp_redirect(wp_get_referer());
    exit;
}
add_action('admin_post_rma_process_request', 'process_request_action');

3. 检查钩子绑定正确性

确认你的邮件子类里正确绑定了自定义钩子,比如:

class RMA_Approved_Email extends RMA_WC_Email {
    public function __construct() {
        parent::__construct();
        // 绑定到自定义钩子,确保优先级和参数匹配
        add_action('woocommerce_rma_pending_to_approved_notification', array($this, 'trigger'), 10, 1);
    }

    public function trigger($order_id) {
        // 邮件触发逻辑:获取订单、设置收件人、发送邮件等
        if (!$order_id) return;
        
        $this->object = wc_get_order($order_id);
        $this->recipient = $this->object->get_billing_email();
        
        if (!$this->is_enabled() || !$this->get_recipient()) return;
        
        $this->send($this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments());
    }
}

4. 调试验证

在process_request_action里加调试代码,确认邮件类是否已注册:

// 打印所有已注册的邮件类到WP错误日志
$registered_emails = WC()->mailer()->get_emails();
error_log(print_r(array_keys($registered_emails), true));

查看WP的错误日志,确认你的RMA邮件子类是否在列表中,以此排查注册是否成功。

内容的提问来源于stack exchange,提问作者Alexandra Chavez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 16:33:19