【问题标题】:Wordpress plugin: Call to undefined function add_menu_page()Wordpress 插件:调用未定义的函数 add_menu_page()
【发布时间】:2015-10-24 06:45:00
【问题描述】:

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

我是 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' );    
}

}

谢谢大家

【问题讨论】:

  • 你是从插件调用这个吗? WordPress 是否已加载?
  • 您最初在哪里以及如何从您的班级SetupAdminMenu 中调用add_menu()
  • 我已将插件分解为类,add_menu() 在类外部被称为“控制器”fi,您希望将其称为将管理菜单放在一起的“控制器”。细节$page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position 被分配为一个数组,在wp 的add_action() 之后调用add_menu($menu) will hand to load_menu()` 来创建菜单。不知道这是否有意义。

标签: php wordpress plugins


【解决方案1】:

这里发生了几件事。首先澄清一下,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 = integer,如果一个钩子有多个动作,优先级将决定加载的顺序。默认值为 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!';
}

这个link 列出了一系列关于 WP 插件开发的“操作方法”。

【讨论】:

  • 感谢您的帮助。您的示例有效@Practical,但这就是我以程序方式开始的方式,我不是为了可读性和易用性而尝试这样做。我的班级应该能够“动态”加载菜单和子菜单。这就是我试图实现的 load_view() 将调用 load_page() 来加载每个菜单页面上的管理 css(我没有包含该功能,因为它不是我的重点),这是根据 wp 法典的最佳实践和在您发布的其中一个链接中。我会以某种方式得到它并在我完成后发布。再次感谢。
  • 我上面展示的是OOP。如果你想加载 CSS,那么你应该在菜单页面的回调中进行,因为这是在加载相关菜单页面时调用的。在那里使用 wp_register_style 。从技术上讲,可以使用您拥有的动作挂钩手动添加 WP 设计方法之外的样式,但指向实际功能。
【解决方案2】:

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

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(),并将下面的方法添加到可以使用任何操作的必要参数调用的基类中

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

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

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2011-09-01
    • 2020-04-24
    • 2014-02-13
    • 1970-01-01
    • 2016-06-24
    • 2020-01-08
    • 2021-09-21
    • 2021-11-10
    相关资源
    最近更新 更多