To choose an icon for a new WordPress admin page, pass a Dashicons class, image URL, SVG data URI, or none to add_menu_page(). For a custom post type, set its menu_icon property. Changing an icon on an existing core or third-party menu is different: WordPress’s documented menu-array example changes labels, but does not establish a general supported method for replacing those icons.
Choose the method for the menu you want to change
| Target | Documented approach |
|---|---|
| A new top-level plugin page | Pass the icon as the sixth argument to add_menu_page(). |
| A custom post type | Set menu_icon in the arguments to register_post_type(). |
| An existing core or third-party menu item | Identify the exact item and WordPress version. The documented admin_menu example shows changing labels, not a general icon-replacement recipe. |
WordPress calls Dashicons its official admin icon font, in use since WordPress 3.8. Its Dashicons catalog lists available class names. The project is no longer accepting icon requests.
Set an icon on a new top-level admin page
Register the page on the admin_menu hook, then supply the icon as add_menu_page()’s sixth argument, named icon_url. This example uses a built-in Dashicon:
add_action( 'admin_menu', 'acme_register_tools_page' );
function acme_register_tools_page() {
add_menu_page(
__( 'Acme Tools', 'acme' ),
__( 'Acme Tools', 'acme' ),
'manage_options',
'acme-tools',
'acme_render_tools_page',
'dashicons-admin-tools'
);
}
function acme_render_tools_page() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
echo '<div class="wrap"><h1>' . esc_html__( 'Acme Tools', 'acme' ) . '</h1></div>';
}
Replace manage_options with the capability appropriate for your page. It controls whether the menu appears, and the page callback should also check the required capability before rendering protected content. Calling add_menu_page() too early can result in a permissions error. The function reference documents its arguments and accepted icon values; the Top-Level Menus guide provides additional menu API guidance.
Recommended Free Tools
The seventh argument, if provided, is the menu position. If the icon argument is empty, WordPress uses the generic dashicons-admin-generic icon.
Choose a Dashicon
Find the icon in the official catalog and use its exact class name, including the dashicons- prefix. For example, the catalog documents dashicons-admin-media. Don’t guess a class name: a typo or unavailable class won’t select the intended icon. The Dashicons project is licensed GPLv2 or later with a font exception.
Rank #2
Use an image, SVG, or no built-in icon
The icon_url argument also accepts an image URL, a base64-encoded SVG data URI beginning with data:image/svg+xml;base64,, or none. A valid SVG with a fill style attribute can be colored to match the admin color scheme. The reference documents these accepted formats and color behavior, but not a complete design specification for every SVG; keep the graphic simple and check it in the admin color scheme and WordPress version you support.
Use none when you intend to provide the visual treatment separately with CSS. A missing or empty icon argument is not the same: it falls back to the generic admin Dashicon.
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #3
Set the sidebar icon for a custom post type
For a post type’s menu entry, set menu_icon in the post type registration arguments rather than creating an additional top-level page:
register_post_type(
'acme_product',
array(
'labels' => array(
'name' => __( 'Products', 'acme' ),
'singular_name' => __( 'Product', 'acme' ),
),
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-products',
)
);
As with a new page, use a class listed in the Dashicons catalog when choosing a Dashicon. The register_post_type() reference documents the registration arguments.
Rank #4
Can you change an existing menu item’s icon?
First establish whether the entry belongs to your own plugin, is a custom post type, or comes from WordPress core or another plugin. For a page you own, set the icon when registering it; for a custom post type, use menu_icon.
The admin_menu hook reference demonstrates modifying the global $menu and $submenu arrays to change existing menu labels. That example does not establish a general supported procedure for replacing every existing menu icon. Avoid relying on a guessed array index or CSS selector as if it were a stable API. Any workaround for a particular menu should be tied to the specific WordPress version and plugin and tested in that context.
Quick Recap
Best Value
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

