WordPress开发函数add_submenu_page(),添加子菜单页面。
用法:
add_submenu_page( string $parent_slug, string $page_title, string $menu_title, string $capability, string $menu_slug, callable $function = ”, int $position = null )
描述
该函数具有一种功能,用于确定菜单中是否包含某个页面。
用于处理页面输出的函数也必须检查用户是否具备所需的功能。
参数:
$parent_slug
(string) (必需) 父菜单的slug的名字(或一个标准的WordPress管理页面的文件名)。
$page_title
(string) (必需) 选中菜单时要在页面标题标签中显示的文本。
$menu_title
(string) (必需) 要用于菜单的文本。
$capability
(string) (必需) 向用户显示该菜单所需的功能。
$menu_slug
(string) (必需) 用来引用此菜单的slug名称。该菜单应该是唯一的,只包括小写字母、数字、破折号和下划线字符,以兼容sanitize_key()。
$function
(callable) (可选) 用于输出此页面内容的函数。
默认值: ”
$position
(int) (可选) 该项目应出现在菜单顺序中的位置。
默认值: null
返回
(string|false)结果页面的hook_suffix,如果用户不具备所需的能力则为false。
来源:
文件: wp-admin/includes/plugin.php
function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = ”, $position = null ) {
global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv,
$_registered_pages, $_parent_pages;
$menu_slug = plugin_basen**e( $menu_slug );
$parent_slug = plugin_basen**e( $parent_slug );
if ( isset( $_wp_real_parent_file[ $parent_slug ] ) ) {
$parent_slug = $_wp_real_parent_file[ $parent_slug ];
}
if ( ! current_user_can( $capability ) ) {
$_wp_submenu_nopriv[ $parent_slug ][ $menu_slug ] = true;
return false;
}
/*
* If the parent doesn’t already have a submenu, add a link to the parent
* as the first item in the submenu. If the submenu file is the s**e as the
* parent file someone is trying to link back to the parent **nually. In
* this case, don’t auto**tically add a link back to avoid duplication.
*/
if ( ! isset( $submenu[ $parent_slug ] ) &**p;&**p; $menu_slug !== $parent_slug ) {
foreach ( (array) $menu as $parent_menu ) {
if ( $parent_menu[2] === $parent_slug &**p;&**p; current_user_can( $parent_menu[1] ) ) {
$submenu[ $parent_slug ][] = array_slice( $parent_menu, 0, 4 );
}
}
}
$new_sub_menu = array( $menu_title, $capability, $menu_slug, $page_title );
if ( ! is_int( $position ) ) {
if ( null !== $position ) {
_doing_it_wrong(
__FUNCTION__,
sprintf(
/* translators: s: add_submenu_page() */
__( ‘The seventh par**eter passed to s should be an integer representing menu position.’ ),
‘<code>add_submenu_page()</code>’
),
‘5.3.0’
);
}
$submenu[ $parent_slug ][] = $new_sub_menu;
} else {
// Append the submenu if the parent item is not present in the submenu,
// or if position is equal or higher than the number of items in the array.
if ( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) ) {
$submenu[ $parent_slug ][] = $new_sub_menu;
} else {
// Test for a negative position.
$position = **x( $position, 0 );
if ( 0 === $position ) {
// For negative or `0` positions, prepend the submenu.
array_unshift( $submenu[ $parent_slug ], $new_sub_menu );
} else {
// Grab all of the items before the insertion point.
$before_items = array_slice( $submenu[ $parent_slug ], 0, $position, true );
// Grab all of the items after the insertion point.
$after_items = array_slice( $submenu[ $parent_slug ], $position, null, true );
// Add the new item.
$before_items[] = $new_sub_menu;
// Merge the items.
$submenu[ $parent_slug ] = array_merge( $before_items, $after_items );
}
}
}
// Sort the parent array.
ksort( $submenu[ $parent_slug ] );
$hookn**e = get_plugin_page_hookn**e( $menu_slug, $parent_slug );
if ( ! empty( $function ) &**p;&**p; ! empty( $hookn**e ) ) {
add_action( $hookn**e, $function );
}
$_registered_pages[ $hookn**e ] = true;
/*
* Backward-compatibility for plugins using add_**nagement_page().
* See wp-admin/admin.php for redirect from edit.php to tools.php.
*/
if ( ‘tools.php’ === $parent_slug ) {
$_registered_pages[ get_plugin_page_hookn**e( $menu_slug, ‘edit.php’ ) ] = true;
}
// No parent as top level.
$_parent_pages[ $menu_slug ] = $parent_slug;
return $hookn**e;
}
更新日志:
用户贡献的笔记
(由jakeparis贡献- 5年前)
$parent_slug(第一个参数)
仪表板:“index . php”
帖子:“edit”
媒体:“upload.php”
页:“edit ? post_type =页面”
评论:“edit-comments.php”
自定义Post类型:’ edit.php?post_type=your_post_type ‘
外观:“themes.php”
插件:“plugins.php”
用户:“users.php”
工具:“tools.php”
设置:“options-general.php”
网络设置:“settings.php”
(由Codex – 6年前贡献)
用add_menu_page()创建的内部菜单
如果您试图将子菜单页添加到通过add_menu_page()创建的菜单页,那么第一个子菜单页将是父add_menu_page()的副本。
如果在这个场景中你想要一个子菜单页面,你应该首先创建一个add_menu_page()的副本,然后添加你的add_submenu_page():
add_menu_page(‘My Cus*** Page’, ‘My Cus*** Page’, ‘**nage_options’, ‘my-top-level-slug’);
add_submenu_page( ‘my-top-level-slug’, ‘My Cus*** Page’, ‘My Cus*** Page’,
‘**nage_options’, ‘my-top-level-slug’);
add_submenu_page( ‘my-top-level-slug’, ‘My Cus*** Submenu Page’, ‘My Cus*** Submenu Page’,
‘**nage_options’, ‘my-secondary-slug’);
(克里斯蒂娜·布拉斯特5年前提供)
将子菜单页添加到自定义文章类型
如果你想添加一个子菜单类型到一个自定义的文章类型,比如一个插件创建的自定义文章类型的参考页面,你可以使用$parent_slug参数,你可以在“所有的文章”视图的顶部看到这个文章类型。例如,对于自定义post类型“Book”,$parent_slug可以是’edit.php?post_type= Book ‘。
例子:
/**
* Adds a submenu page under a cus*** post type parent.
*/
function books_register_ref_page() {
add_submenu_page(
‘edit.php?post_type=book’,
__( ‘Books Shortcode Reference’, ‘textdo**in’ ),
__( ‘Shortcode Reference’, ‘textdo**in’ ),
‘**nage_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’, ‘textdo**in’ ); ?></h1>
<p><?php _e( ‘Helpful stuff here’, ‘textdo**in’ ); ?></p>
</div>
<?php
}
(穆斯塔法·苏非4年前贡献)
php类的子菜单示例
/**
* Sub menu class
*
* @author Mostafa <mostafa.soufi@hot**il.com>
*/
class Sub_menu {
/**
* Autoload method
* @return void
*/
public function __construct() {
add_action( ‘admin_menu’, array(&**p;$this, ‘register_sub_menu’) );
}
/**
* Register submenu
* @return void
*/
public function register_sub_menu() {
add_submenu_page(
‘options-general.php’, ‘Submenu title’, ‘Submenu title’, ‘**nage_options’, ‘submenu-page’, array(&**p;$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();
(由Codex – 6年前贡献)
例子
add_action(‘admin_menu’, ‘wpdocs_register_my_cus***_submenu_page’);
function wpdocs_register_my_cus***_submenu_page() {
add_submenu_page(
‘tools.php’,
‘My Cus*** Submenu Page’,
‘My Cus*** Submenu Page’,
‘**nage_options’,
‘my-cus***-submenu-page’,
‘wpdocs_my_cus***_submenu_page_callback’ );
}
function wpdocs_my_cus***_submenu_page_callback() {
echo ‘<div class=”wrap”><div id=”icon-tools” class=”icon32″></div>’;
echo ‘<h2>My Cus*** Submenu Page</h2>’;
echo ‘</div>’;
}
要从它所属的**菜单项隐藏子菜单链接,你可以这样做
add_action(‘admin_menu’, ‘wpdocs_register_my_cus***_submenu_page’);
function wpdocs_register_my_cus***_submenu_page() {
add_submenu_page(
null, //or ‘options.php’
‘My Cus*** Submenu Page’,
‘My Cus*** Submenu Page’,
‘**nage_options’,
‘my-cus***-submenu-page’,
‘my_cus***_submenu_page_callback’,
);
}
(由LogixTree在4年前贡献)
在处理这些类时,您可以通过遵循确保可调用对象是静态函数来添加_submenu_page。
add_submenu_page( ‘admin_menu’, ‘Cus*** Menu’, ‘My Cus*** Menu’, ‘**nage_options’, ‘my-cus***-menu’, __CLASS__ .’::menu_page_output’ );
public menu_page_output() {
//Menu Page output code
}
(由ILOVEWP贡献- 4年前)
对于其他故障排除此函数意外问题的人,请注意最后一个参数,特别是$函数,它必须是一个字符串,函数名,而不是对函数本身的调用。业余的错误,我知道,但有时你只是犯了最简单的错误。
缺点:
add_menu_page(‘My Cus*** Page’, ‘My Cus*** Page’, ‘**nage_options’, ‘my-top-level-slug’, my-output-function());
优势:
add_menu_page(‘My Cus*** Page’, ‘My Cus*** Page’, ‘**nage_options’, ‘my-top-level-slug’, ‘my-output-function’);
(由tripflex提供- 3年前)
为了进一步说明添加一个页面而不显示在菜单/子菜单中,使用以下代码:
add_action(‘admin_menu’, ‘wpdocs_register_my_cus***_submenu_page’);
function wpdocs_register_my_cus***_submenu_page() {
add_submenu_page(
‘options.php’,
‘My Cus*** Submenu Page’,
‘My Cus*** Submenu Page’,
‘**nage_options’,
‘my-cus***-submenu-page’,
‘my_cus***_submenu_page_callback’,
);
}
然后您将通过以下URL访问此页面:
/wp-admin/options.php?page=my-cus***-submenu-page
(由isMike()贡献- 11个月前)
如果在类中工作,add_submenu_page的“function”参数应该是一个数组,数组中的第一个值是类的实例,而数组中的第二个值是对象中的一个方法(以字符串的形式给出)。
在下面的例子
Class WPDocs_AdminPage
{
private $_plugin_n**e;
private $_version;
public function __construct( $plugin_n**e, $version )
{
$this->_plugin_n**e = $plugin_n**e;
$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_n**e_in_the_class’ ), ‘icon_url’, ‘POSITION’
);
add_submenu_page(
‘parent_slug’, ‘PAGE TITLE’, ‘MENU TITLE’, ‘CAPABILITY’, ‘menu_slug’,
array( $this, ‘wpdocs_method_n**e_in_the_class’ )
);
}
}
$admin_page = new WPDocs_AdminPage;
add_action( ‘admin_menu’, array( $admin_page, ‘wpdocs_create_menu_and_submenu_page’ ) );
(由isabel104贡献- 4个月前)
关于上面“更多信息”部分的第一个提示,你也可能会遇到“对不起,您不允许访问此页面。”消息,即使您已正确地钩入admin_menu钩子。如果所有这些都为真,则会出现此错误信息:
父页面是使用add_menu_page添加的自定义页面
父页面是在另一个插件中创建的,而不是创建子菜单页面的同一个插件
您没有为add_submenu_page调用向admin_menu钩子添加较低的优先级,因此子菜单页可能在父页面之前被触发,从而导致错误。
解决方案:向创建子菜单页面的操作添加较低的优先级,如99。例如:
add_action( ‘admin_menu’, ‘wpdocs_register_my_cus***_submenu_page’, 99 );
(rtpHarry于6个月前贡献)
如果你想把你的自定义子页面的url如下:
https://www.ex**ple.com/wp-admin/admin.php?page=cus***-settings
那你应该使用父**的自定义设置。
在我的用例中,我想把一个自定义分类法放在一个ACF选项页面下,我使用了这个:
add_submenu_page(
‘cus***-settings’,
‘Product Filter By Ambient Noise’,
‘Product Filter By Ambient Noise’,
‘**nage_options’,
‘edit-tags.php?taxonomy=product-filter-**bient-noise’
);
暂无评论内容