'core-admin/dashboard',
'dashicons-admin-post' => 'core-admin/pin',
'dashicons-admin-media' => 'core-admin/media',
'dashicons-admin-links' => 'core-admin/link',
'dashicons-admin-page' => 'core-admin/page',
'dashicons-admin-comments' => 'core-admin/comment',
'dashicons-admin-appearance' => 'core-admin/brush',
'dashicons-admin-plugins' => 'core-admin/plugins',
'dashicons-admin-users' => 'core-admin/people',
'dashicons-admin-tools' => 'core-admin/tool',
'dashicons-admin-settings' => 'core-admin/settings',
'dashicons-admin-multisite' => 'core-admin/sites',
);
$first = true;
// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url.
foreach ( $menu as $key => $item ) {
$admin_is_parent = false;
$class = array();
$aria_attributes = '';
$aria_hidden = '';
$is_separator = false;
if ( $first ) {
$class[] = 'wp-first-item';
$first = false;
}
$submenu_items = array();
if ( ! empty( $submenu[ $item[2] ] ) ) {
$class[] = 'wp-has-submenu';
$submenu_items = $submenu[ $item[2] ];
}
if ( ( $parent_file && $item[2] === $parent_file ) || ( empty( $typenow ) && $self === $item[2] ) ) {
if ( ! empty( $submenu_items ) ) {
$class[] = 'wp-has-current-submenu wp-menu-open';
} else {
$class[] = 'current';
$aria_attributes .= 'aria-current="page"';
}
} else {
$class[] = 'wp-not-current-submenu';
if ( ! empty( $submenu_items ) ) {
$aria_attributes .= 'data-ariahaspopup';
}
}
if ( ! empty( $item[4] ) ) {
$class[] = esc_attr( $item[4] );
}
$class = ' class="' . implode( ' ', $class ) . '"';
$id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : '';
$img = '';
$img_style = '';
$img_class = ' dashicons-before';
if ( str_contains( $class, 'wp-menu-separator' ) ) {
$is_separator = true;
}
/*
* If the string 'none' (previously 'div') is passed instead of a URL, don't output
* the default menu image so an icon can be added to div.wp-menu-image as background
* with CSS. Dashicons and base64-encoded data:image/svg_xml URIs are also handled
* as special cases. Dashicons that have a replacement, and namespaced icon names, are
* rendered as inline SVG, or leave the menu image empty if the icon is not found.
* Any other value is treated as an image URL.
*/
if ( ! empty( $item[6] ) ) {
$img = '';
$icon_name = $dashicon_replacements[ $item[6] ] ?? $item[6];
if ( 'none' === $item[6] || 'div' === $item[6] ) {
$img = '
';
} elseif ( str_starts_with( $item[6], 'data:image/svg+xml;base64,' ) ) {
$img = '
';
// The value is base64-encoded data, so esc_attr() is used here instead of esc_url().
$img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"';
$img_class = ' svg';
} elseif ( wp_is_valid_icon_name( $icon_name ) ) {
$img = '
';
$icon = wp_get_icon( $icon_name );
if ( '' !== $icon ) {
$img = $icon;
$img_class = ' dashicons-before svg-icon';
} elseif ( ! WP_Icons_Registry::get_instance()->is_registered( $icon_name ) ) {
_doing_it_wrong(
__FUNCTION__,
sprintf(
/* translators: 1: Icon name, 2: Admin menu item slug. */
__( 'The icon "%1$s" of the admin menu item "%2$s" is not registered.' ),
$icon_name,
$item[2]
),
'7.2.0'
);
}
} elseif ( str_starts_with( $item[6], 'dashicons-' ) ) {
$img = '
';
$img_class = ' dashicons-before ' . sanitize_html_class( $item[6] );
}
}
$title = wptexturize( $item[0] );
// Hide separators from screen readers.
if ( $is_separator ) {
$aria_hidden = ' aria-hidden="true"';
}
echo "\n\t