当前浏览:首页 / WordPress函数 / add_submenu_page()

add_submenu_page( string $parent_slug, string $page_title, string $menu_title, string $capability, string $menu_slug, callable $callback = '', int|float $position = null )

添加子菜单页

addmore...

menu_page 菜单页more...


描述

这个函数接受一个能力(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。通常情况下,这些方法可以起效:
  • 此函数通常应与admin_menu动作之一连接,具体取决于子菜单出现的菜单:
    admin_menu 正常的,或网站,管理菜单
    user_admin_menu 用户管理菜单
    network_admin_menu 网络管理菜单


源码

查看源码 官方文档


更新日志

版本描述
5.3.0添加了$position参数。
1.5.0开始引入

使用示例

  • 示例1

    $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’

  • 示例2

    将子菜单页添加到自定义文章类型
    如果要将子菜单类型添加到自定义文章类型,例如插件创建的自定义文章类型的参考页,则可以将$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
    }
    
  • 示例3

    在使用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');
    
    
  • 示例4

    使用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();
  • 示例5

    实例

    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',
    	);
    }
    
  • 示例6

    当使用这些类时,您可以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
    }
    
  • 示例7

    如果其他人对该函数的意外问题进行故障排除,请注意最后一个参数,特别是$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');
  • 示例8

    为了进一步说明如何添加页面而不在菜单/子菜单中显示,请使用以下代码:

    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

  • 示例9

    如果您试图将自定义子页置于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'
            );
  • 示例10

    关于上面的更多信息部分中的第一个注释,即使您已正确连接到admin_menu挂钩,您也可能会遇到“抱歉,您不允许访问此页面”消息。如果所有这些都为真,则会出现此错误消息:

    • 父页面是您使用add_menu_page添加的自定义页面
    • 该父页面是在另一个插件中创建的,而不是在创建子菜单页面的同一个插件中
    • 您没有为add_submenu_page调用的admin_menu挂钩添加较低优先级,因此子菜单页可能会在父页之前触发,从而导致错误。

    解决方案:为创建子菜单页的动作添加较低优先级,如99。例如:

    add_action( 'admin_menu', 'wpdocs_register_my_custom_submenu_page', 99 );
  • 示例11

    如果您在一个类中工作,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' ) );