描述
这个函数接受一个能力(capability),它将被用来确定一个页面是否包括在菜单中。
用于处理页面输出的函数必须检查用户是否具有所需的能力。
参数
- $parent_slug
-
(string)(必填) 父菜单的slug名称(或标准WordPress管理页面的文件名)。
- $page_title
-
(string)(必填) 选中菜单时要在页面标题标签中显示的文本。
- $menu_title
-
(string)(必填) 要用于菜单的文本。
- $capability
-
(string)(必填) 向用户显示此菜单所需的能力。
- $menu_slug
-
(string)(必填) 用于引用此菜单的slug名称。此菜单应是唯一的,并且仅包括小写字母数字、破折号和下划线字符,以与sanitize_key()兼容。
- $callback
-
(callable)(可选) 要调用以输出此页面内容的函数。
默认值: ''
- $position
-
(int|float)(可选) 此项应出现在菜单顺序中的位置。
默认值: null
返回
(string|false) 如果用户不具备所需的能力,则为false。
更多信息
注意
- 注意:如果您在wp_die()屏幕中遇到“您没有足够的权限访问此页面”消息,则说明您过早地挂钩。您应该使用的挂钩是admin_menu。
- 对于
$menu_slug
,请不要使用__FILE__
。这会造成一个丑陋的URL,并且是一个轻微的安全问题。 - 在渲染函数
$function
中,您可能希望访问add_submenu_page()使用的参数,例如$page_title
。通常情况下,这些方法可以起效:- $parent_slug:get_admin_page_parent()
- $page_title: get_admin_page_title(), 或
global $title
- $menu_slug:
global $plugin_page
- 此函数通常应与admin_menu动作之一连接,具体取决于子菜单出现的菜单:
admin_menu 正常的,或网站,管理菜单 user_admin_menu 用户管理菜单 network_admin_menu 网络管理菜单
源码
更新日志
版本 | 描述 |
---|---|
5.3.0 | 添加了$position 参数。 |
1.5.0 | 开始引入 |
使用示例
$parent_slug的slug(第一个参数)
Dashboard(仪表盘): ‘index.php’
Posts(文章): ‘edit.php’
Media(媒体): ‘upload.php’
Pages(页面): ‘edit.php?post_type=page’
Comments(评论): ‘edit-comments.php’
Custom Post Types(自定义文章类型): ‘edit.php?post_type=your_post_type’
Appearance(外观): ‘themes.php’
Plugins(插件): ‘plugins.php’
Users(用户): ‘users.php’
Tools(工具): ‘tools.php’
Settings(设置): ‘options-general.php’
Network Settings(网络设置): ‘settings.php’将子菜单页添加到自定义文章类型
如果要将子菜单类型添加到自定义文章类型,例如插件创建的自定义文章类型的参考页,则可以将$parent_slug
参数用于该文章类型的“所有文章”视图顶部显示的任何内容。例如,对于自定义文章类型“Book,$parent_slug
可以是'edit.php?post_type=book'
。例子:
/** * Adds a submenu page under a custom post type parent. */ function books_register_ref_page() { add_submenu_page( 'edit.php?post_type=book', __( 'Books Shortcode Reference', 'textdomain' ), __( 'Shortcode Reference', 'textdomain' ), 'manage_options', 'books-shortcode-ref', 'books_ref_page_callback' ); } /** * Display callback for the submenu page. */ function books_ref_page_callback() { ?> <div class="wrap"> <h1><?php _e( 'Books Shortcode Reference', 'textdomain' ); ?></h1> <p><?php _e( 'Helpful stuff here', 'textdomain' ); ?></p> </div> <?php }
在使用add_menu_page()
如果你试图在通过add_menu_page()
创建的菜单页上添加一个子菜单页,那么第一个子菜单页将是父级add_menu_page()
的副本。如果在此场景中需要子菜单页,应首先创建
add_menu_page()
的副本,然后添加add_submenu_page()
:add_menu_page('My Custom Page', 'My Custom Page', 'manage_options', 'my-top-level-slug'); add_submenu_page( 'my-top-level-slug', 'My Custom Page', 'My Custom Page', 'manage_options', 'my-top-level-slug'); add_submenu_page( 'my-top-level-slug', 'My Custom Submenu Page', 'My Custom Submenu Page', 'manage_options', 'my-secondary-slug');
使用php类的子菜单实例
/** * Sub menu class * * @author Mostafa <mostafa.soufi@hotmail.com> */ class Sub_menu { /** * Autoload method * @return void */ public function __construct() { add_action( 'admin_menu', array(&$this, 'register_sub_menu') ); } /** * Register submenu * @return void */ public function register_sub_menu() { add_submenu_page( 'options-general.php', 'Submenu title', 'Submenu title', 'manage_options', 'submenu-page', array(&$this, 'submenu_page_callback') ); } /** * Render submenu * @return void */ public function submenu_page_callback() { echo '<div class="wrap">'; echo '<h2>Submenu title</h2>'; echo '</div>'; } } new Sub_menu();
实例
add_action('admin_menu', 'wpdocs_register_my_custom_submenu_page'); function wpdocs_register_my_custom_submenu_page() { add_submenu_page( 'tools.php', 'My Custom Submenu Page', 'My Custom Submenu Page', 'manage_options', 'my-custom-submenu-page', 'wpdocs_my_custom_submenu_page_callback' ); } function wpdocs_my_custom_submenu_page_callback() { echo '<div class="wrap"><div id="icon-tools" class="icon32"></div>'; echo '<h2>My Custom Submenu Page</h2>'; echo '</div>'; }
要隐藏子菜单链接到它所属的顶级菜单项,您可以执行以下操作:
add_action('admin_menu', 'wpdocs_register_my_custom_submenu_page'); function wpdocs_register_my_custom_submenu_page() { add_submenu_page( null, //or 'options.php' 'My Custom Submenu Page', 'My Custom Submenu Page', 'manage_options', 'my-custom-submenu-page', 'my_custom_submenu_page_callback', ); }
当使用这些类时,您可以add_submenu_page通过以下操作确保可调用函数是静态函数。
add_submenu_page( 'admin_menu', 'Custom Menu', 'My Custom Menu', 'manage_options', 'my-custom-menu', __CLASS__ .'::menu_page_output' ); public menu_page_output() { //Menu Page output code }
如果其他人对该函数的意外问题进行故障排除,请注意最后一个参数,特别是$function,它必须是字符串、函数名称,而不是函数本身的调用。业余的错误,我知道,但有时你只会犯最简单的错误。
错的:
add_menu_page('My Custom Page', 'My Custom Page', 'manage_options', 'my-top-level-slug', my-output-function());
对的:
add_menu_page('My Custom Page', 'My Custom Page', 'manage_options', 'my-top-level-slug', 'my-output-function');
为了进一步说明如何添加页面而不在菜单/子菜单中显示,请使用以下代码:
add_action('admin_menu', 'wpdocs_register_my_custom_submenu_page'); function wpdocs_register_my_custom_submenu_page() { add_submenu_page( 'options.php', 'My Custom Submenu Page', 'My Custom Submenu Page', 'manage_options', 'my-custom-submenu-page', 'my_custom_submenu_page_callback', ); }
然后,您将通过以下URL访问此页面:
/wp-admin/options.php?page=my-custom-submenu-page
如果您试图将自定义子页置于url下,如:
https://www.example.com/wp-admin/admin.php?page=custom-settings
那么您应该只使用
custom-settings
作为父slug。在我的用例中,我想在ACF选项页面下放置一个自定义分类法,我使用了以下方法:
add_submenu_page( 'custom-settings', 'Product Filter By Ambient Noise', 'Product Filter By Ambient Noise', 'manage_options', 'edit-tags.php?taxonomy=product-filter-ambient-noise' );
关于上面的更多信息部分中的第一个注释,即使您已正确连接到
admin_menu
挂钩,您也可能会遇到“抱歉,您不允许访问此页面”消息。如果所有这些都为真,则会出现此错误消息:- 父页面是您使用
add_menu_page
添加的自定义页面 - 该父页面是在另一个插件中创建的,而不是在创建子菜单页面的同一个插件中
- 您没有为
add_submenu_page
调用的admin_menu
挂钩添加较低优先级,因此子菜单页可能会在父页之前触发,从而导致错误。
解决方案:为创建子菜单页的动作添加较低优先级,如99。例如:
add_action( 'admin_menu', 'wpdocs_register_my_custom_submenu_page', 99 );
- 父页面是您使用
如果您在一个类中工作,add_submenu_page的“function”参数应该是一个数组,数组中的第一个值是该类的实例,而数组中的第二个值将是对象中的一个方法(以字符串形式给出)。
下面的示例
Class WPDocs_AdminPage { private $_plugin_name; private $_version; public function __construct( $plugin_name, $version ) { $this->_plugin_name = $plugin_name; $this->_version = $version; } public function wpdocs_create_menu_and_submenu_page() { add_menu_page( 'PAGE TITLE', 'MENU TITLE', 'CAPABILITY', 'menu_slug', array( $this, 'wpdocs_method_name_in_the_class' ), 'icon_url', 'POSITION' ); add_submenu_page( 'parent_slug', 'PAGE TITLE', 'MENU TITLE', 'CAPABILITY', 'menu_slug', array( $this, 'wpdocs_method_name_in_the_class' ) ); } } $admin_page = new WPDocs_AdminPage; add_action( 'admin_menu', array( $admin_page, 'wpdocs_create_menu_and_submenu_page' ) );