WordPress插件OOP开发调用add_menu_page报未定义函数错误如何解决?
问题原因
- 调用顺序错误:你在实例化类之后直接调用了
addingpage()方法,这时候WordPress还没有加载完后台管理相关的核心函数,add_menu_page()还未定义,所以触发致命错误。你本来应该是把addingpage挂载到admin_menu钩子上由WordPress在合适的时机触发,而不是自己手动调用这个方法。 - 链式调用逻辑错误:你写的
$x->addingpage()->hooking()是先执行添加菜单的逻辑,再注册钩子,完全反过来了,钩子注册还没生效就先跑了菜单添加逻辑,肯定会报错。
修复后的代码
class abc_adding_page{ public function addingpage(){ add_menu_page('abcba_products' ,'abcba_products' ,'manage_options' ,'abcba_products', function(){} ,'dashicons-store' ,110); } public function hooking(){ add_action('admin_menu' , array($this ,'addingpage')); } } $x = new abc_adding_page(); $x->hooking(); // 只需要注册钩子即可,不需要手动调用addingpage方法
可选优化写法
可以把钩子注册逻辑放到构造方法里,实例化时自动完成注册,使用更简洁:
class abc_adding_page{ // 构造方法,实例化时自动注册钩子 public function __construct(){ add_action('admin_menu' , array($this ,'addingpage')); } public function addingpage(){ add_menu_page('abcba_products' ,'abcba_products' ,'manage_options' ,'abcba_products', function(){} ,'dashicons-store' ,110); } } new abc_adding_page(); // 直接实例化即可完成注册
注意事项
- 所有WordPress核心函数的调用都必须挂载到对应的官方钩子上执行,不要在全局作用域或者类实例化的同步流程里直接调用,避免核心函数未加载的报错。
admin_menu钩子是WordPress专门用来加载后台菜单相关逻辑的触发点,只有到这个钩子执行的阶段,add_menu_page这类后台菜单函数才会被定义完成。
内容的提问来源于stack exchange,提问作者Abdullah Manafikhi
相关产品推荐
相关产品推荐

