Admin Bar API Overview

The Admin Bar (also called Toolbar) API provides a way to add, modify, and remove items from the WordPress admin bar that appears at the top of both front-end and admin pages for logged-in users.

Architecture

Core Components

FilePurpose
wp-includes/admin-bar.phpTop-level functions for admin bar operations
wp-includes/class-wp-admin-bar.phpWP_Admin_Bar class implementing the Toolbar API

Global Instance

php
global $wp_admin_bar;

The admin bar is instantiated as a global $wp_admin_bar object during the wp_loaded action via _wp_admin_bar_init().

Node System

The admin bar is built as a tree of nodes. Each node can be:

  • Item – A clickable menu item (default)
  • Group – An organizational container for items
  • Container – Auto-generated wrapper for nested groups

Node Structure

php
$node = array(
    'id'     => 'my-item',           // Required: unique identifier
    'title'  => 'My Item',           // Display text/HTML
    'parent' => 'parent-id',         // Parent node ID (default: 'root')
    'href'   => 'https://example.com', // Link URL
    'group'  => false,               // true = group, false = item
    'meta'   => array(               // Additional attributes
        'class'      => 'my-class',
        'html'       => '<span>Extra HTML</span>',
        'onclick'    => 'javascript:void(0)',
        'target'     => '_blank',
        'title'      => 'Tooltip text',
        'rel'        => 'noopener',
        'lang'       => 'en',
        'dir'        => 'ltr',
        'tabindex'   => 0,
        'menu_title' => 'ARIA menu name',
    ),
);

Node Hierarchy

root
├── wp-logo (WordPress logo menu)
│   ├── about
│   ├── contribute
│   └── wp-logo-external (group)
│       ├── wporg
│       ├── documentation
│       └── support-forums
├── site-name (Site menu)
│   ├── dashboard / view-site
│   └── appearance (group)
├── my-sites (Multisite only)
├── customize / site-editor
├── updates
├── comments
├── new-content ("+ New" menu)
├── edit
└── top-secondary (group, right-aligned)
    ├── my-account
    ├── recovery-mode
    └── search

Rendering Flow

  1. Initialization (_wp_admin_bar_init())

    • Check is_admin_bar_showing()
    • Instantiate WP_Admin_Bar class
    • Call initialize() and add_menus()
  2. Menu Population (admin_bar_menu action)

    • Core menus added via add_menus()
    • Plugins/themes add custom nodes
  3. Binding (_bind())

    • Build node tree from flat array
    • Wrap orphan items in groups
    • Handle nested groups with containers
  4. Rendering (render())

    • Fire wp_before_admin_bar_render
    • Output HTML via _render(), _render_group(), _render_item()
    • Fire wp_after_admin_bar_render

Visibility Control

Show/Hide Functions

php
// Hide admin bar globally
show_admin_bar( false );

// Check if showing
if ( is_admin_bar_showing() ) {
    // Admin bar is visible
}

Automatic Hiding

Initialization (_wp_admin_bar_init())

  • Check is_admin_bar_showing()
  • Instantiate WP_Admin_Bar class
  • Call initialize() and add_menus()

Default Menu Priorities

PriorityFunctionMenu
0wp_admin_bar_my_account_menuMy Account submenu
0wp_admin_bar_sidebar_toggleMenu toggle (admin)
10wp_admin_bar_wp_menuWordPress logo
20wp_admin_bar_my_sites_menuMy Sites
30wp_admin_bar_site_menuSite Name
40wp_admin_bar_edit_site_menuEdit Site (block themes)
40wp_admin_bar_customize_menuCustomize
50wp_admin_bar_updates_menuUpdates
60wp_admin_bar_comments_menuComments
70wp_admin_bar_new_content_menuNew
80wp_admin_bar_edit_menuEdit
200wp_admin_bar_add_secondary_groupsSecondary groups
9991wp_admin_bar_my_account_itemMy Account (top)
9992wp_admin_bar_recovery_mode_menuRecovery Mode
9999wp_admin_bar_search_menuSearch

CSS Classes

Container Classes

ClassDescription
#wpadminbarMain admin bar container
.quicklinksNavigation wrapper
.ab-top-menuTop-level menu group
.ab-submenuSubmenu group
.ab-group-containerGroup container wrapper

Item Classes

ClassDescription
.ab-itemMenu item (link or div)
.ab-empty-itemItem without href
.menupopItem with children
.with-avatarMy Account with avatar
.ab-iconIcon span
.ab-labelLabel span

State Classes

ClassDescription
.hoverHover state
.nojqNo jQuery detected
.nojsNo JavaScript
.mobileMobile device

User Preferences

Menu Population (admin_bar_menu action)

php
// Get user preference (front-end)
$show = _get_admin_bar_pref( 'front', $user_id );

// Stored as user meta
// show_admin_bar_front = 'true' | 'false'

Theme Support

Binding (_bind())

php
// Use default bump callback
add_theme_support( 'admin-bar' );

// Use custom callback
add_theme_support( 'admin-bar', array(
    'callback' => 'my_admin_bar_bump',
) );

// Disable bump entirely
add_theme_support( 'admin-bar', array(
    'callback' => '__return_false',
) );

Rendering (render())

css
@media screen { html { margin-top: 32px !important; } }
@media screen and (max-width: 782px) { html { margin-top: 46px !important; } }

Multisite Considerations

Initialization (_wp_admin_bar_init())

  • Core menus added via add_menus()
  • Plugins/themes add custom nodes