Add a Submenu to the WordPress Admin Bar

By  on  

A while back I wrote Add Menu Items to the WordPress Admin Menu, a post detailing how you can add items to the left side, existing "posts" menu bar.  Adding menu items has served me well but it's not as customized as I would like -- I'm still adapting to WordPress instead of WordPress adapting to me.  By creating a custom top bar menu, I can mix and match links all I want!

Like adding functionality to your theme and other admin area, the directives will go in your theme's functions.php file.  The code itself should be self explanatory:

function create_dwb_menu() {
	global $wp_admin_bar;

	$menu_id = 'dwb';
	$wp_admin_bar->add_menu(array('id' => $menu_id, 'title' => __('DWB'), 'href' => '/'));
	$wp_admin_bar->add_menu(array('parent' => $menu_id, 'title' => __('Homepage'), 'id' => 'dwb-home', 'href' => '/', 'meta' => array('target' => '_blank')));
	$wp_admin_bar->add_menu(array('parent' => $menu_id, 'title' => __('Drafts'), 'id' => 'dwb-drafts', 'href' => 'edit.php?post_status=draft&post_type=post'));
	$wp_admin_bar->add_menu(array('parent' => $menu_id, 'title' => __('Pending Comments'), 'id' => 'dwb-pending', 'href' => 'edit-comments.php?comment_status=moderated'));
}
add_action('admin_bar_menu', 'create_dwb_menu', 2000);

Setting an id on the parent menu item allows you to use the parent key for submenu items; the rest of the keys are easy to figure out.  With the menu created, you simply need to add the WordPress hook and specificity to add it!

Recent Features

  • By
    Create Namespaced Classes with MooTools

    MooTools has always gotten a bit of grief for not inherently using and standardizing namespaced-based JavaScript classes like the Dojo Toolkit does.  Many developers create their classes as globals which is generally frowned up.  I mostly disagree with that stance, but each to their own.  In any event...

  • By
    CSS Animations Between Media Queries

    CSS animations are right up there with sliced bread. CSS animations are efficient because they can be hardware accelerated, they require no JavaScript overhead, and they are composed of very little CSS code. Quite often we add CSS transforms to elements via CSS during...

Incredible Demos

  • By
    CSS Kwicks

    One of the effects that made me excited about client side and JavaScript was the Kwicks effect.  Take a list of items and react to them accordingly when hovered.  Simple, sweet.  The effect was originally created with JavaScript but come five years later, our...

  • By
    Using jQuery and MooTools Together

    There's yet another reason to master more than one JavaScript library: you can use some of them together! Since MooTools is prototype-based and jQuery is not, jQuery and MooTools may be used together on the same page. The XHTML and JavaScript jQuery is namespaced so the...

Discussion

  1. I you want to remove a menu item , here the code.

    add_action('admin_bar_menu','ank_remove_admin_bar_menu', 99);
    
    function ank_remove_admin_bar_menu($wp_admin_bar){
        $wp_admin_bar->remove_menu('wp-logo');
    }
    
  2. Isuru

    Thank you Mr. Walsh! I needed this. Awesome!

  3. This is super easy!though I wish they had some kind of visual interface to do this, as it is there is Joomla and Drupal.

  4. Gavin

    What would be great would be a WP plugin that uses the built-in WordPress “Links” (http://codex.wordpress.org/Template_Tags/wp_list_bookmarks) and creates WP Admin Bar menus for each link category, and then adds the links from each category to the menu.

    Seems like a nice way to leverage the built-in WP Links feature for something that would actually be useful.

    Shouldn’t be too hard to do …. I might have a go when I get time.

    Thanks for the article.

  5. Hasse Andre

    Hi.

    Thanks for this.

    Is there a way to open the URL in a new window?
    Here is my code:

    function create_dwb_menu() {
    	global $wp_admin_bar;
    
    	$menu_id = 'dwb';
    	$wp_admin_bar->add_menu(array('id' => $menu_id, 'title' => __('NEW MENU ITEM'), 'href' => 'http://website.com/'));
    }
    add_action('admin_bar_menu', 'create_dwb_menu', 2000);
    
  6. To have this open in a new window, add in the meta option, like this: 'meta' => array( 'target' => '_blank' )

  7. iLen

    Thank you. I much use this code for my next plugin :)

  8. Ovidiu

    Thank you, this works great, even after all those years.

    However, what I would need is a way to add this on the right, to the “top-secondary” adminbar menu, next to the user actions. I’ve managed to add it using this function:

    function get_support_link($wp_admin_bar) {
       $args = array(
          'id' => 'get-support',
          'title' => 'Need Help?', 
          'href' => '/wp-admin/get-support.php', 
          'parent' => 'top-secondary', 
          'meta' => array(
             'class' => 'get-suport', 
             'title' => 'Use the contact form to contact Support',
             'target' => '_blank',
          )
       );
       $wp_admin_bar->add_node($args);
    }
    add_action('admin_bar_menu', 'get_support_link', 99);
    

    the ‘parent’ => ‘top-secondary’ being the key here. Yes, I could use the same function to add submenu items to this one, but I need to add about 5 items (maybe more) and adding same function again and again looks awful. I feel that this can be done cleaner, like your function here, but I can’t figure out how to add this function to the ‘top-secondary’ adminbar location. Any ideas?

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!