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();一定要写,否则类不会被实例化,构造函数也不会执行。
使用步骤:
- 打开WordPress主题的
functions.php文件(可以在「外观→主题编辑器」里找到,或者通过FTP访问wp-content/themes/你的主题名/functions.php)。 - 删除你原来的两段代码,替换成上面任意一种方案的代码。
- 保存文件,然后测试一下订单邮件,就能看到卖家名称显示在订单表格后面了。
内容的提问来源于stack exchange,提问作者Voltaki
相关产品推荐
相关产品推荐

