WordPress插件多类拆分报错:非对象上下文使用$this
解决WordPress插件中“Using $this when not in object context”错误
错误根源
你在Settings类的register_pages方法里,用静态类名的方式注册钩子回调:
add_action('admin_menu', array('Settings', 'add_admin_menu'));
这种写法会让WordPress以静态方法的形式调用add_admin_menu,但这个方法里依赖$this访问实例属性admin_pages,静态调用时没有对象上下文,所以触发钩子时就会抛出错误。
修复步骤
把钩子回调的写法改成传入当前对象实例,也就是将array('Settings', 'add_admin_menu')替换为array($this, 'add_admin_menu')。这样WordPress会以对象方法的形式调用add_admin_menu,就能正常访问$this指向的实例属性了。
修改后的register_pages方法代码:
public function register_pages(){ if( !empty( $this->admin_pages ) ): add_action('admin_menu', array($this, 'add_admin_menu')); endif; }
完整修正后的Settings类
class Settings { public $admin_pages = array(); public $admin_subpages = array(); public function __construct(){ $this->admin_pages = array( array( 'page_title' => 'Dashboard', 'menu_title' => 'Dashboard', 'capability' => 'manage_options', 'menu_slug' => SS_PLUGIN, 'callback' => 'dashboard_template', 'icon_url' => 'dashicons-store', 'position' => 55 ) ); } public function register_pages(){ if( !empty( $this->admin_pages ) ): add_action('admin_menu', array($this, 'add_admin_menu')); endif; } public function add_admin_menu(){ foreach( $this->admin_pages as $page ): add_menu_page ( $page['page_title'], $page['menu_title'], $page['capability'], $page['menu_slug'], $page['callback'], $page['icon_url'], $page['position'] ); endforeach; } }
内容的提问来源于stack exchange,提问作者Inst1nct
相关产品推荐
相关产品推荐

