Php Wordpress插件:调用未定义函数add_menu_page()

Php Wordpress插件:调用未定义函数add_menu_page(),php,wordpress,plugins,Php,Wordpress,Plugins,我需要一些帮助,我在stackoverflow和整个网络上都遇到过很多类似的问题,但似乎没有任何帮助 我是wordpress的新手,开始使用类创建插件。当我运行插件时,它抛出错误“调用未定义的函数add_menu_page()”。我已经查看了wordpress.org上的支持文档,但这也没有帮助() 下面是我的代码,请告诉我我做错了什么: class SetupAdminMenu { public static function add_menu($menu) { add_action

我需要一些帮助,我在stackoverflow和整个网络上都遇到过很多类似的问题,但似乎没有任何帮助

我是wordpress的新手,开始使用类创建插件。当我运行插件时,它抛出错误“调用未定义的函数add_menu_page()”。我已经查看了wordpress.org上的支持文档,但这也没有帮助()

下面是我的代码,请告诉我我做错了什么:

class SetupAdminMenu {

public static function add_menu($menu)
{
    add_action('admin_menu', self::load_menu($menu) );
    //I've used it according to the docs as well
    //add_action('admin_menu', array(self, self::load_menu($menu) );
}

public static function load_menu($menu)
{
    $page = add_menu_page( $menu['page_title'], $menu['menu_title'], $menu['capability'], $menu['menu_slug'], 
    array(self,self::load_view($menu['function'])), $menu['icon_url'], $menu['position'] ); 
    self::load_page($page);
}

protected static function load_view($view)
{
    if ( !current_user_can( 'activate_plugins' ) )  {
        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
    }
    //The actual page to display
    include_once($view);
}

protected static function load_page($page)
{
    add_action( 'admin_print_styles-' . $page, 'admin_styles' );    
}

}

谢谢你,这里发生了几件事。首先要澄清的是,add_menu_页面是添加一个管理设置的管理菜单页面,等等

您的添加操作应如下所示:

public static function add_menu($menu)
{
    add_action('admin_menu', array('SetupAdminMenu', 'load_menu'));
}
WordPress处理操作的方式要求您对静态类方法的add_操作进行如下格式化:

add_action('admin_menu', array('ClassName', 'methodname'), $priority, $numVars);
有两个可选变量:

  • $priority=integer,如果一个钩子有多个操作,则优先级将决定加载顺序。默认值为10。如果要对任何早期操作作出反应,请使用99;如果要在进一步操作之前定义内容,请使用1
  • $numVars=integer,如果方法或函数需要一个以上的变量,请在此处输入数字。WordPress核心钩子不需要定义它,它将根据文档传递变量
接下来,带有“add\u menu\u page”的类方法非常不合适。据我所知,默认情况下,admin_菜单钩子不会返回任何变量,即使返回了,为什么在尝试添加新项时要使用现有菜单?您自己传递这些变量:

public static function load_menu()
{
    $page_title = 'My New Page';
    $menu_title = 'New Page';
    $capability= 'manage_options'; //An administrator only capability
    $menu_slug = 'my-new-page';
    $callback = array('SetupAdminMenu', 'load_view');
    $menu_icon = ''; //use default
    $menu_position = 81 //After settings

    add_menu_page( $page_title, $menu_title, $capability, $menu_slug, 
    $callback, $menu_icon , $menu_position); 
}
您的self::加载页面($page);这是多余的。在该函数中使用的操作不起任何作用。回调是单击菜单项时显示的内容。没有理由让它受到保护,因为类方法是从WordPress中的钩子调用的,所以它很可能会失败

public static function load_view() // Removed $view because you need to define this yourself.
{
    if ( !current_user_can( 'activate_plugins' ) )  {
        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
    }
    //The actual page to display
    //include_once('/path/to/your/template'); 
    //which should have php, html for what you want to have appear. 
    //To test that the rest of the code is working... just put:
    echo 'Hello World!';
}

这有一个关于WP插件开发的“how-tos”列表

好的,我已经做了更多的阅读和游戏,下面是我的答案,可能会有所帮助

class SetupAdminMenu {

private static $menu = array();

public static function add_menu()
{
    add_action('admin_menu', array('SetupAdminMenu', 'load_menu') );
}

public static function add_sub_menu()
{
    add_action('admin_menu', array('SetupAdminMenu', 'load_sub_menu') );
}
下面的方法是我最初缺少的,因为您无法在
add\u action()

因为
add_action()
被使用了很多次,所以我从这个类中删除了
add_menu()
add_sub_menu()
,并将下面的方法添加到可以调用的基类中,并为任何操作提供必要的参数

public static function addAction($action, $callback)
{
    add_action($action, $callback);
}

可能不是100%最好的方法,但上述方法目前仍然有效

你是从插件中调用它的吗?WordPress是否已加载?您最初在何处以及如何从类中调用
添加菜单()
?我已将插件分为多个类,
添加菜单()
是从类外部调用的“控制器”fi。您希望将其称为将管理菜单放在一起的fi。详细信息
$page\u title、$menu\u title、$capability、$menu\u slug、$function、$icon\u url、$position
被分配为一个数组,在调用wp的
添加操作()
创建菜单后,
添加菜单($menu)将被交给
加载菜单()。不知道这是否有意义。谢谢你的帮助。您的示例实际上是有效的,但我就是这样开始的,以过程化的方式来做的,我不想为了可读性和易用性而这样做。我的类应该能够“动态”加载菜单和子菜单。这正是我试图实现的,load_view()将调用load_page()在每个菜单页上加载管理员css(我没有包括该函数,因为它不是我的重点),根据wp codex和您发布的一个链接,这是最佳实践。我会想办法弄到它,一弄就发。再次感谢。我上面展示的是OOP。如果您想加载CSS,那么您应该在菜单页面的回调中进行加载,因为加载相关菜单页面时会调用该回调。在那里使用wp_register_样式。从技术上讲,可以使用您拥有的动作挂钩在WP的设计方法之外手动添加样式,但要指向实际函数。
public static function addAction($action, $callback)
{
    add_action($action, $callback);
}