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

Fatal error: 在非对象上下文使用$this - Dokan WordPress插件求助

解决WooCommerce订单邮件添加卖家名称的代码错误

你遇到的错误其实很好理解:$this这个关键字只能在PHP类的方法内部使用,而你直接在functions.php的全局代码里用它,PHP根本找不到对应的类实例,自然会报错。我给你准备了两种解决方案,第一种更简单,适合非开发者,第二种是面向对象的写法(也就是你提到的构造函数方式)。

方案1:简单的面向过程写法(推荐)

不需要搞复杂的类和构造函数,直接把动作绑定到你的普通函数上就行。我还帮你优化了代码,避免一些潜在问题:

// 定义显示卖家名称的函数
function order_email_include_saler_name( $order ) {
    // 获取卖家ID(WooCommerce 3.0+ 推荐用get_id()代替直接访问id属性)
    $saler_id = dokan_get_seller_id_by_order( $order->get_id() );
    if ( !$saler_id ) {
        return; // 如果没找到卖家ID,直接退出,防止报错
    }
    
    // 获取卖家用户信息
    $saler_info = get_user_by( 'id', $saler_id );
    if ( !$saler_info ) {
        return; // 如果用户不存在,直接退出
    }
    ?>
    <table cellspacing="0" cellpadding="6" style="width: 100%; border: 1px solid #eee;" border="1" bordercolor="#eee">
        <tfoot>
            <tr>
                <th scope="row" style="text-align:left; width: 57%; border: 1px solid #eee; border-top-width: 4px;"><?php _e( 'Saler Name:' ); ?></th>
                <td style="text-align:left; border: 1px solid #eee; border-top-width: 4px;"><?php echo esc_html( $saler_info->display_name ); ?></td>
            </tr>
        </tfoot>
    </table>
    <?php
}

// 把函数绑定到WooCommerce邮件的钩子上
add_action( 'woocommerce_email_after_order_table', 'order_email_include_saler_name' );

额外优化点说明:

  • 替换$order->id为$order->get_id():WooCommerce 3.0版本后,直接访问id属性会触发警告,用官方推荐的getter方法更稳妥。
  • 增加了两个判断:防止因为卖家ID无效、用户不存在导致的报错。
  • 用esc_html()包裹卖家名称:确保输出内容经过安全转义,避免潜在的网站安全问题。

方案2:面向对象+构造函数写法

如果你确实想用构造函数的方式,也可以这样写,把代码放在functions.php里即可:

class Custom_WooCommerce_Email_Modifier {
    // 构造函数:类实例化时自动执行
    public function __construct() {
        // 这里的$this代表当前类的实例,所以是合法的
        add_action( 'woocommerce_email_after_order_table', array( $this, 'order_email_include_saler_name' ) );
    }

    // 显示卖家名称的方法
    public function order_email_include_saler_name( $order ) {
        $saler_id = dokan_get_seller_id_by_order( $order->get_id() );
        if ( !$saler_id ) {
            return;
        }
        
        $saler_info = get_user_by( 'id', $saler_id );
        if ( !$saler_info ) {
            return;
        }
        ?>
        <table cellspacing="0" cellpadding="6" style="width: 100%; border: 1px solid #eee;" border="1" bordercolor="#eee">
            <tfoot>
                <tr>
                    <th scope="row" style="text-align:left; width: 57%; border: 1px solid #eee; border-top-width: 4px;"><?php _e( 'Saler Name:' ); ?></th>
                    <td style="text-align:left; border: 1px solid #eee; border-top-width: 4px;"><?php echo esc_html( $saler_info->display_name ); ?></td>
                </tr>
            </tfoot>
        </table>
        <?php
    }
}

// 必须实例化这个类,构造函数才会生效
new Custom_WooCommerce_Email_Modifier();

写法说明:

  • 我们创建了一个自定义类,在构造函数__construct()里绑定动作,这里的$this指向当前类的实例,所以不会报错。
  • 最后一行new Custom_WooCommerce_Email_Modifier();一定要写,否则类不会被实例化,构造函数也不会执行。

使用步骤:

  1. 打开WordPress主题的functions.php文件(可以在「外观→主题编辑器」里找到,或者通过FTP访问wp-content/themes/你的主题名/functions.php)。
  2. 删除你原来的两段代码,替换成上面任意一种方案的代码。
  3. 保存文件,然后测试一下订单邮件,就能看到卖家名称显示在订单表格后面了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:30