Make menus manipulation easier for plugin developers

* Add a wp_nav_menu_objects filter, which gets a sorted list of all menu node objects in the currently rendered menu
 * Add current, current_item_ancestor and current_item_parent boolean member variables to each menu node object, which are true when the item has the current-menu-item, current-menu-ancestor or current-menu-parent CSS class respectively


git-svn-id: http://svn.automattic.com/wordpress/trunk@15544 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
nbachiyski 2010-08-27 16:13:39 +00:00
parent e675b1e837
commit d7fcadc5b8
1 changed files with 15 additions and 5 deletions

View File

@ -196,6 +196,8 @@ function wp_nav_menu( $args = array() ) {
$sorted_menu_items[$menu_item->menu_order] = $menu_item;
unset($menu_items);
$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );
$items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
unset($sorted_menu_items);
@ -312,6 +314,9 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
$possible_object_parents = array_filter( $possible_object_parents );
foreach ( (array) $menu_items as $key => $menu_item ) {
$menu_items[$key]->current = false;
$classes = (array) $menu_item->classes;
$classes[] = 'menu-item';
$classes[] = 'menu-item-type-' . $menu_item->type;
@ -332,6 +337,7 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
)
) {
$classes[] = 'current-menu-item';
$menu_items[$key]->current = true;
$_anc_id = (int) $menu_item->db_id;
while(
@ -359,6 +365,7 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
if ( in_array( $item_url, array( $current_url, $_indexless_current ) ) ) {
$classes[] = 'current-menu-item';
$menu_items[$key]->current = true;
$_anc_id = (int) $menu_item->db_id;
while(
@ -394,7 +401,9 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
// set parent's class
foreach ( (array) $menu_items as $key => $parent_item ) {
$classes = (array) $parent_item->classes;
$menu_items[$key]->current_item_ancestor = false;
$menu_items[$key]->current_item_parrent = false;
if (
isset( $parent_item->type ) &&
(
@ -419,9 +428,12 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
if ( in_array( intval( $parent_item->db_id ), $active_ancestor_item_ids ) ) {
$classes[] = 'current-menu-ancestor';
$menu_items[$key]->current_item_ancestor = true;
}
if ( in_array( $parent_item->db_id, $active_parent_item_ids ) )
if ( in_array( $parent_item->db_id, $active_parent_item_ids ) ) {
$classes[] = 'current-menu-parent';
$menu_items[$key]->current_item_parent = true;
}
if ( in_array( $parent_item->object_id, $active_parent_object_ids ) )
$classes[] = 'current-' . $active_object . '-parent';
@ -464,6 +476,4 @@ function _nav_menu_item_id_use_once( $id, $item ) {
$_used_ids[] = $item->ID;
return $id;
}
add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );
?>
add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );