WordPress Version: 6.1
//
// Menu.
//
/**
* Adds a top-level menu page.
*
* 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 1.5.0
*
* @global array $menu
* @global array $admin_page_hooks
* @global array $_registered_pages
* @global array $_parent_pages
*
* @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 page and only
* include lowercase alphanumeric, dashes, and underscores characters to be compatible
* with sanitize_key().
* @param callable $callback Optional. The function to be called to output the content for this page.
* @param string $icon_url Optional. The URL to the icon to be used for this menu.
* * Pass a base64-encoded SVG using a data URI, which will be colored to match
* the color scheme. This should begin with 'data:image/svg+xml;base64,'.
* * Pass the name of a Dashicons helper class to use a font icon,
* e.g. 'dashicons-chart-pie'.
* * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS.
* @param int|float $position Optional. The position in the menu order this item should appear.
* @return string The resulting page's hook_suffix.
*/
function add_menu_page($page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '', $position = null)
{
global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;
$menu_slug = plugin_basename($menu_slug);
$admin_page_hooks[$menu_slug] = sanitize_title($menu_title);
$hookname = get_plugin_page_hookname($menu_slug, '');
if (!empty($callback) && !empty($hookname) && current_user_can($capability)) {
add_action($hookname, $callback);
}
if (empty($icon_url)) {
$icon_url = 'dashicons-admin-generic';
$icon_class = 'menu-icon-generic ';
} else {
$icon_url = set_url_scheme($icon_url);
$icon_class = '';
}
$new_menu = array($menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url);
if (null !== $position && !is_numeric($position)) {
_doing_it_wrong(__FUNCTION__, sprintf(
/* translators: %s: add_menu_page() */
__('The seventh parameter passed to %s should be numeric representing menu position.'),
'<code>add_menu_page()</code>'
), '6.0.0');
$position = null;
}
if (null === $position || !is_numeric($position)) {
$menu[] = $new_menu;
} elseif (isset($menu[(string) $position])) {
$collision_avoider = base_convert(substr(md5($menu_slug . $menu_title), -4), 16, 10) * 1.0E-5;
$position = (string) ($position + $collision_avoider);
$menu[$position] = $new_menu;
} else {
/*
* Cast menu position to a string.
*
* This allows for floats to be passed as the position. PHP will normally cast a float to an
* integer value, this ensures the float retains its mantissa (positive fractional part).
*
* A string containing an integer value, eg "10", is treated as a numeric index.
*/
$position = (string) $position;
$menu[$position] = $new_menu;
}
$_registered_pages[$hookname] = true;
// No parent as top level.
$_parent_pages[$menu_slug] = false;
return $hookname;
}