Using WordPress ‘admin_menu’ PHP action

The admin_menu WordPress PHP action fires before the administration menu loads in the admin, allowing you to add extra submenus and menu options to the admin panel’s menu structure.


add_action('admin_menu', 'your_function_name');

function your_function_name() {
    // your custom code here


  • $context (string): Empty context.

More information

See WordPress Developer Resources: admin_menu

Important: Do not place this action in an admin_init action function, as admin_init is called after admin_menu.


Add a Top-Level Menu Item

To add a new top-level menu item to the admin menu:

add_action('admin_menu', 'add_my_custom_menu');

function add_my_custom_menu() {
        'My Custom Menu', // Page title
        'My Custom Menu', // Menu title
        'manage_options', // Capability
        'my-custom-menu', // Menu slug
        'my_custom_menu_output' // Function

function my_custom_menu_output() {
    echo 'Hello, this is my custom menu page!';

Add a Submenu Item

To add a new submenu item under an existing top-level menu item:

add_action('admin_menu', 'add_my_custom_submenu');

function add_my_custom_submenu() {
        'my-custom-menu', // Parent menu slug
        'My Custom Submenu', // Page title
        'My Custom Submenu', // Menu title
        'manage_options', // Capability
        'my-custom-submenu', // Menu slug
        'my_custom_submenu_output' // Function

function my_custom_submenu_output() {
    echo 'Hello, this is my custom submenu page!';

Add a Separator in the Admin Menu

To add a separator between menu items:

add_action('admin_menu', 'add_my_custom_separator');

function add_my_custom_separator() {
    global $menu;
    $menu[99] = array( '', 'read', 'separator-custom', '', 'wp-menu-separator' );

Remove a Menu Item

To remove an existing menu item:

add_action('admin_menu', 'remove_my_custom_menu', 999);

function remove_my_custom_menu() {
    remove_menu_page('my-custom-menu'); // Menu slug

Change the Order of Menu Items

To change the order of menu items:

add_action('admin_menu', 'reorder_my_custom_menus', 999);

function reorder_my_custom_menus() {
    global $menu;
    $menu[25] = $menu[80]; // Move "Settings" menu
    unset($menu[80]); // Remove the original "Settings" menu position