The nav_menu_link_attributes is a WordPress PHP filter that allows developers to modify the HTML attributes applied to a menu item’s anchor element.
This filter is called whenever a menu item is rendered, allowing developers to customize the attributes of the menu item’s link.
Usage
Here is a basic example of how to use the nav_menu_link_attributes filter:
function custom_menu_link_attributes( $atts, $item, $args ) {
  // your custom code here
  return $atts;
}
add_filter( 'nav_menu_link_attributes', 'custom_menu_link_attributes', 10, 3 );
In this example, we define a function called custom_menu_link_attributes that takes three parameters: $atts, $item, and $args. This function is then added to the nav_menu_link_attributes filter using the add_filter function.
The custom_menu_link_attributes function should modify the $atts array as necessary and then return it. The modifications made to $atts will then be applied to the menu item’s anchor element.
Parameters
The nav_menu_link_attributes filter takes several parameters that developers can use to customize the menu item’s attributes:
$atts(array): The HTML attributes applied to the menu item’s anchor element, empty strings are ignored.$item(WP_Post): The current menu item object.$args(stdClass): An object ofwp_nav_menu()arguments.
Additional arguments from wp_nav_menu() include:
$title(string): Title attribute.$target(string): Target attribute.$rel(string): The rel attribute.$href(string): The href attribute.$aria_current(string): The aria-current attribute.$menu_item(WP_Post): The current menu item object.$depth(int): Depth of menu item. Used for padding.
Examples
Here are some practical examples of how to use the nav_menu_link_attributes filter:
Add a custom class to menu item links
function add_custom_class_to_menu_item_links( $atts, $item, $args ) {
  $atts['class'] = 'my-custom-class';
  return $atts;
}
add_filter( 'nav_menu_link_attributes', 'add_custom_class_to_menu_item_links', 10, 3 );
In this example, we define a function that adds the class my-custom-class to the menu item’s anchor element.
Remove the title attribute from menu item links
function remove_title_attribute_from_menu_item_links( $atts, $item, $args ) {
  $atts['title'] = '';
  return $atts;
}
add_filter( 'nav_menu_link_attributes', 'remove_title_attribute_from_menu_item_links', 10, 3 );
In this example, we define a function that removes the title attribute from the menu item’s anchor element.
Open menu item links in a new window
function open_menu_item_links_in_new_window( $atts, $item, $args ) {
  $atts['target'] = '_blank';
  return $atts;
}
add_filter( 'nav_menu_link_attributes', 'open_menu_item_links_in_new_window', 10, 3 );
In this example, we define a function that opens the menu item’s anchor element in a new window.
Add a data attribute to menu item links
function add_data_attribute_to_menu_item_links( $atts, $item, $args ) {
$atts['data-my-attribute'] = 'my-value'; return $atts; }
add_filter( 'nav_menu_link_attributes', 'add_data_attribute_to_menu_item_links', 10, 3 );
In this example, we define a function that adds a custom data attribute (`data-my-attribute`) to the menu item’s anchor element.
Customize menu item links based on the menu location
function customize_menu_item_links_based_on_location( $atts, $item, $args ) {
if ( $args->theme_location == 'primary-menu' ) {
// Add a class to menu items in the "primary-menu" location
$atts['class'] = 'primary-menu-item';
} else {
// Add a class to menu items in other menu locations
$atts['class'] = 'other-menu-item';
}
return $atts;
}
add_filter( ‘nav_menu_link_attributes’, ‘customize_menu_item_links_based_on_location’, 10, 3 );
Add a custom class to menu items
function add_custom_class_to_menu_items($atts, $item, $args, $depth) {
    $atts['class'] = 'custom-class';
    return $atts;
}
add_filter('nav_menu_link_attributes', 'add_custom_class_to_menu_items', 10, 4);
This code adds a custom class named ‘custom-class’ to all menu items.
Add a ‘nofollow’ attribute to external links
function add_nofollow_to_external_links($atts, $item, $args, $depth) {
    if (strpos($atts['href'], home_url()) === false) {
        $atts['rel'] = 'nofollow';
    }
    return $atts;
}
add_filter('nav_menu_link_attributes', 'add_nofollow_to_external_links', 10, 4);
This code adds a ‘nofollow’ attribute to all external links in the menu.
Add a ‘data-depth’ attribute to menu items
function add_data_depth_attribute($atts, $item, $args, $depth) {
    $atts['data-depth'] = $depth;
    return $atts;
}
add_filter('nav_menu_link_attributes', 'add_data_depth_attribute', 10, 4);
This code adds a ‘data-depth’ attribute to all menu items, showing the depth of the item in the menu hierarchy.
Set target attribute to ‘_blank’ for external links
function open_external_links_in_new_tab($atts, $item, $args, $depth) {
    if (strpos($atts['href'], home_url()) === false) {
        $atts['target'] = '_blank';
    }
    return $atts;
}
add_filter('nav_menu_link_attributes', 'open_external_links_in_new_tab', 10, 4);
This code sets the target attribute to ‘_blank’ for external links, so they open in a new tab.
Add ‘aria-label’ attribute to menu items for accessibility
function add_aria_label_to_menu_items($atts, $item, $args, $depth) {
    $atts['aria-label'] = esc_attr($item->title);
    return $atts;
}
add_filter('nav_menu_link_attributes', 'add_aria_label_to_menu_items', 10, 4);
This code adds an ‘aria-label’ attribute to all menu items for improved accessibility, using the item’s title as the label.