This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
add_filter( 'wp_nav_menu_objects', 'tgm_filter_menu_class', 10, 2 ); | |
/** | |
* Filters the first and last nav menu objects in your menus | |
* to add custom classes. | |
* | |
* This also supports nested menus. | |
* | |
* @since 1.0.0 | |
* | |
* @param array $objects An array of nav menu objects. | |
* @param object $args Nav menu object args. | |
* @return object $objects Amended array of nav menu objects with new class. | |
*/ | |
function tgm_filter_menu_class( $objects, $args ) { | |
// Add first/last classes to nested menu items. | |
$ids = array(); | |
$parent_ids = array(); | |
$top_ids = array(); | |
foreach ( $objects as $i => $object ) { | |
// If there is no menu item parent, store the ID and skip over the object. | |
if ( 0 == $object->menu_item_parent ) { | |
$top_ids[$i] = $object; | |
continue; | |
} | |
// Add first item class to nested menus. | |
if ( ! in_array( $object->menu_item_parent, $ids ) ) { | |
$objects[$i]->classes[] = 'first-menu-item'; | |
$ids[] = $object->menu_item_parent; | |
} | |
// If we have just added the first menu item class, skip over adding the ID. | |
if ( in_array( 'first-menu-item', $object->classes ) ) { | |
continue; | |
} | |
// Store the menu parent IDs in an array. | |
$parent_ids[$i] = $object->menu_item_parent; | |
} | |
// Remove any duplicate values and pull out the last menu item. | |
$sanitized_parent_ids = array_unique( array_reverse( $parent_ids, true ) ); | |
// Loop through the IDs and add the last menu item class to the appropriate objects. | |
foreach ( $sanitized_parent_ids as $i => $id ) { | |
$objects[$i]->classes[] = 'last-menu-item'; | |
} | |
// Finish it off by adding classes to the top level menu items. | |
$objects[1]->classes[] = 'first-menu-item'; // We can be assured 1 will be the first item in the menu. :-) | |
$objects[end( array_keys( $top_ids ) )]->classes[] = 'last-menu-item'; | |
// Return the menu objects. | |
return $objects; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the filter, I have been using it for sometime now.
I just started getting the following error:
"Strict Standards: Only variables should be passed by reference on line 53".
The issue was resolved by replacing line 53:
with the following two lines: