我需要一些帮助,我已经经历过这么多"类似的" 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' );
}
}
谢谢偷看
答案 0 :(得分:2)
这里发生了一些事情。首先澄清一点,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);
有两个可选变量:
接下来,使用" 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插件开发。
答案 1 :(得分:0)
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%最好的方法,但上面目前的工作原理。