WordPress插件开发问题:跨文件调用类方法添加菜单无响应
问题原因及解决方案
核心问题:激活钩子的执行时机错误
register_activation_hook 仅在插件激活瞬间执行一次,而 admin_menu 是每次进入WordPress后台都会触发的动作。你把添加admin_menu动作的代码放在激活方法里,激活完成后这个动作就不会再被注册,自然无法生效。
具体修复步骤
1. 调整钩子注册时机,移出激活方法
把加载Admin类和注册admin_menu动作的逻辑,放在插件初始化钩子(比如plugins_loaded)里,而非激活钩子:
修改1file.php代码:
defined( 'ABSPATH' ) or die('Nie masz dostępu'); class PluginRzeczoznawcy{ public function __construct() { // 初始化时注册后台相关钩子 add_action( 'plugins_loaded', [ $this, 'init_admin' ] ); } public function init_admin() { if ( is_admin() ) { require_once( 'admin/admin.php' ); // 实例化Admin类,因为adminMenu是实例方法 $admin_instance = new Mango\Admin(); add_action('admin_menu', [ $admin_instance, 'adminMenu' ] ); } } public function activate(){ // 仅存放插件激活时需执行的操作,如创建数据库表、设置默认选项等 } function deactivate(){ // 停用逻辑 } function uninstall(){ // 卸载逻辑 } function CPT_rzeczoznawcy(){ } } if( class_exists( 'PluginRzeczoznawcy' )){ $rzeczoznawcyPlugin = new PluginRzeczoznawcy(); } // 激活钩子 register_activation_hook(__FILE__, array($rzeczoznawcyPlugin,'activate')); // 停用钩子 register_deactivation_hook(__FILE__, array($rzeczoznawcyPlugin,'deactivate'));
2. 修复Admin类的方法调用问题
原代码中用['Mango\Admin', 'adminMenu']是把adminMenu当作静态方法调用,但方法内使用$this调用settingsPage会触发致命错误。必须实例化Admin类后,用实例对象注册动作,如上述代码所示。
3. 开启错误调试(可选)
若后续仍有问题,可在wp-config.php中开启WordPress调试模式,方便定位问题:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true );
错误信息会输出到屏幕或wp-content/debug.log文件中。
验证修复
- 先停用插件,再重新激活
- 进入WordPress后台,即可看到名为
MenuTest的菜单,点击后会显示Test内容
内容的提问来源于stack exchange,提问作者Alotofproblemshere
相关产品推荐
相关产品推荐

