繁体   English   中英

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

[英]Wordpress plugin: Call to undefined function add_menu_page()

我需要一些帮助,我在stackoverflow和整个Web上经历了很多此类“类似”问题,但似乎无济于事。

我是wordpress的新手,并开始使用类创建插件。 当我运行插件时,它将引发错误“调用未定义函数add_menu_page()”。 我已经检查了wordpress.org上的支持文档,但这也无济于事( https://codex.wordpress.org/Adding_Administration_Menus#Inserting_the_Pages

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

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_page是添加用于管理设置等的管理菜单页面。

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

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

WordPress处理操作的方式要求您为静态类方法设置add_action的格式如下:

add_action('admin_menu', array('ClassName', 'methodname'), $priority, $numVars);

有两个可选变量:

  • $ priority =整数,如果一个钩子有多个动作,则优先级将决定加载的顺序。 默认值为10。如果要对任何先前的操作做出反应,请使用99;如果要在后续操作之前定义事物,请使用1。
  • $ numVars =整数,如果方法或函数需要多个变量,则将数字放在此处。 WordPress核心挂钩不需要对此进行定义,并将根据文档传递变量。

接下来,带有“ add_menu_page”的类方法已经相当完善了。 据我所知,admin_menu挂钩默认情况下不会返回任何变量,即使这样做,为什么在尝试添加新项目时仍要使用现有菜单? 您自己传递这些变量:

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); 
}

您自己:: load_page($ 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插件开发中的一系列“操作方法”。

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

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_action()通过回调传递参数

public static function setupPage($params)
{
    self::$menu = $params;
}

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

protected static function load_sub_menu()
{
    $page = add_submenu_page( self::$menu['parent_slug'], self::$menu['page_title'], self::$menu['menu_title'],
    self::$menu['capability'], self::$menu['menu_slug'], 'load_view');
    self::load_page($page);
}

public static function load_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(self::$menu['page']);
}

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

public static function admin_styles()
{
    wp_register_style( 'admin_styles', plugins_url('css/admin.css', __FILE__) );
    wp_enqueue_style( 'admin_styles' );
}

}

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

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

可能不是100%的最佳方法,但以上方法目前有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM