: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$new_sub_menu = array( $menu_title, $capability, $menu_slug, $page_title );
if ( null !== $position && ! is_numeric( $position ) ) {
/* translators: %s: add_submenu_page() */
__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
'<code>add_submenu_page()</code>'
( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) )
$submenu[ $parent_slug ][] = $new_sub_menu;
// Test for a negative position.
$position = max( $position, 0 );
// For negative or `0` positions, prepend the submenu.
array_unshift( $submenu[ $parent_slug ], $new_sub_menu );
$position = absint( $position );
// 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 );
$before_items[] = $new_sub_menu;
$submenu[ $parent_slug ] = array_merge( $before_items, $after_items );
// Sort the parent array.
ksort( $submenu[ $parent_slug ] );
$hookname = get_plugin_page_hookname( $menu_slug, $parent_slug );
if ( ! empty( $callback ) && ! empty( $hookname ) ) {
add_action( $hookname, $callback );
$_registered_pages[ $hookname ] = true;
* Backward-compatibility for plugins using add_management_page().
* See wp-admin/admin.php for redirect from edit.php to tools.php.
if ( 'tools.php' === $parent_slug ) {
$_registered_pages[ get_plugin_page_hookname( $menu_slug, 'edit.php' ) ] = true;
// No parent as top level.
$_parent_pages[ $menu_slug ] = $parent_slug;
* Adds a submenu page to the Tools main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Settings main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Appearance main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Plugins main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Users/Profile main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
if ( current_user_can( 'edit_users' ) ) {
return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Dashboard main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Posts main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Media main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Links main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Pages main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Adds a submenu page to the Comments main menu.
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
* @since 5.3.0 Added the `$position` parameter.
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
* @param string $menu_title The text to be used for the menu.
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param int $position Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
* Removes a top-level admin menu.
* - `remove_menu_page( 'tools.php' )`
* - `remove_menu_page( 'plugin_menu_slug' )`
* @param string $menu_slug The slug of the menu.
* @return array|false The removed menu on success, false if not found.
function remove_menu_page( $menu_slug ) {
foreach ( $menu as $i => $item ) {
if ( $menu_slug === $item[2] ) {
* Removes an admin submenu.
* - `remove_submenu_page( 'themes.php', 'nav-menus.php' )`
* - `remove_submenu_page( 'tools.php', 'plugin_submenu_slug' )`
* - `remove_submenu_page( 'plugin_menu_slug', 'plugin_submenu_slug' )`
* @param string $menu_slug The slug for the parent menu.
* @param string $submenu_slug The slug of the submenu.
* @return array|false The removed submenu on success, false if not found.
function remove_submenu_page( $menu_slug, $submenu_slug ) {
if ( ! isset( $submenu[ $menu_slug ] ) ) {
foreach ( $submenu[ $menu_slug ] as $i => $item ) {
if ( $submenu_slug === $item[2] ) {
unset( $submenu[ $menu_slug ][ $i ] );
* Gets the URL to access a particular menu page based on the slug it was registered with.
* If the slug hasn't been registered properly, no URL will be returned.
* @global array $_parent_pages
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
* @param bool $display Optional. Whether or not to display the URL. Default true.
* @return string The menu page URL.
function menu_page_url( $menu_slug, $display = true ) {
if ( isset( $_parent_pages[ $menu_slug ] ) ) {
$parent_slug = $_parent_pages[ $menu_slug ];
if ( $parent_slug && ! isset( $_parent_pages[ $parent_slug ] ) ) {
$url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) );
$url = admin_url( 'admin.php?page=' . $menu_slug );
// Pluggable Menu Support -- Private.
* Gets the parent file of the current admin page.
* @global string $parent_file
* @global string $pagenow The filename of the current screen.
* @global string $typenow The post type of the current screen.
* @global string $plugin_page
* @global array $_wp_real_parent_file
* @global array $_wp_menu_nopriv
* @global array $_wp_submenu_nopriv
* @param string $parent_page Optional. The slug name for the parent menu (or the file name
* of a standard WordPress admin page). Default empty string.
* @return string The parent file of the current admin page.
function get_admin_page_parent( $parent_page = '' ) {
global $parent_file, $menu, $submenu, $pagenow, $typenow,
$plugin_page, $_wp_real_parent_file, $_wp_menu_nopriv, $_wp_submenu_nopriv;
if ( ! empty( $parent_page ) && 'admin.php' !== $parent_page ) {
if ( isset( $_wp_real_parent_file[ $parent_page ] ) ) {
$parent_page = $_wp_real_parent_file[ $parent_page ];
if ( 'admin.php' === $pagenow && isset( $plugin_page ) ) {
foreach ( (array) $menu as $parent_menu ) {
if ( $parent_menu[2] === $plugin_page ) {
$parent_file = $plugin_page;
if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
$parent_file = $_wp_real_parent_file[ $parent_file ];
if ( isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
$parent_file = $plugin_page;
if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
$parent_file = $_wp_real_parent_file[ $parent_file ];
if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) {
if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
$parent_file = $_wp_real_parent_file[ $parent_file ];