Using WordPress ‘wp_nav_menu_items’ PHP filter

The wp_nav_menu_items WordPress PHP filter allows you to modify the HTML list content of navigation menus.

Usage

add_filter('wp_nav_menu_items', 'your_function_name', 10, 2);
function your_function_name($items, $args) {
    // your custom code here
    return $items;
}

Parameters

  • $items (string) – The HTML list content for the menu items.
  • $args (stdClass) – An object containing wp_nav_menu() arguments.

Returns

The filter returns the modified $items string with your custom code applied.

More information

See WordPress Developer Resources: wp_nav_menu_items

Examples

To add a “Home” link at the beginning of the menu, use the following code:

add_filter('wp_nav_menu_items', 'add_home_link', 10, 2);
function add_home_link($items, $args) {
    $home_link = '<li><a href="' . home_url('/') . '">Home</a></li>';
    $items = $home_link . $items;
    return $items;
}

To add a “Login” or “Logout” link at the end of the menu depending on the user’s authentication status:

add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
    if (is_user_logged_in()) {
        $items .= '<li><a href="' . wp_logout_url() . '">Logout</a></li>';
    } else {
        $items .= '<li><a href="' . wp_login_url() . '">Login</a></li>';
    }
    return $items;
}

Remove specific menu item by ID

To remove a specific menu item by ID (replace 123 with the desired menu item ID):

add_filter('wp_nav_menu_items', 'remove_menu_item_by_id', 10, 2);
function remove_menu_item_by_id($items, $args) {
    $menu_item_id = 123;
    $items = preg_replace('/<li id="menu-item-' . $menu_item_id . '.*?<\/li>/', '', $items);
    return $items;
}

Add a CSS class to menu items

To add a custom CSS class to all menu items:

add_filter('nav_menu_css_class', 'add_custom_menu_class', 10, 2);
function add_custom_menu_class($classes, $item) {
    $classes[] = 'custom-menu-item-class';
    return $classes;
}

Add a “Search” form to the menu

To add a search form at the end of the menu:

add_filter('wp_nav_menu_items', 'add_search_form', 10, 2);
function add_search_form($items, $args) {
    $search_form = '<li class="menu-search">' . get_search_form(false) . '</li>';
    $items .= $search_form;
    return $items;
}