/** * Recursive function to retrieve sub menu items. * * @since 3.0.0 * * @param string $childof The Parent ID. * @param string $object_type The object type. * @param string $object The object name. * @return string $output sub menu items. */ function wp_get_nav_menu_sub_items($childof, $object_type, $object = null, $context = 'frontend') { $args = array('child_of' => $childof, 'parent' => $childof, 'hide_empty' => false); switch ($object_type) { case 'post_type': $hierarchical_post_types = get_post_types(array('hierarchical' => true)); if (in_array($object, $hierarchical_post_types)) { $args['post_type'] = $object; $sub_menu_items = get_pages($args); } else { $sub_menu_items = array(); } break; case 'taxonomy': if (is_taxonomy_hierarchical($object)) { $sub_menu_items = get_terms($object, $args); } else { $sub_menu_items = array(); } break; default: $sub_menu_items = array(); break; } $output = ''; $i = 1; if (!empty($sub_menu_items) && !is_wp_error($sub_menu_items)) { $output .= '<ul class="sub-menu menu-item-type-' . $object_type . '">'; foreach ($sub_menu_items as $menu_item) { // Set up the menu item $menu_item = wp_setup_nav_menu_item($menu_item, $object_type, $object); $attributes = 'backend' == $context ? ' id="menu-item-' . $i . '" value="' . $i . '"' : ''; $output .= '<li' . $attributes . '>'; $output .= wp_get_nav_menu_item($menu_item, $object_type, $object); $output .= wp_get_nav_menu_sub_items($menu_item->ID, $object_type, $object); $output .= '</li>'; ++$i; } $output .= '</ul>'; } return $output; }
/** * @see Walker::start_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param int $current_page Menu item ID. * @param object $args */ function start_el(&$output, $item, $depth, $args) { $indent = $depth ? str_repeat("\t", $depth) : ''; $classes = $value = ''; if ('frontend' == $args->context) { global $wp_query; $classes = array('menu-item', 'menu-item-type-' . $item->type, $item->classes); if ('custom' != $item->object) { $classes[] = 'menu-item-object-' . $item->object; } if ($item->object_id == $wp_query->get_queried_object_id()) { $classes[] = 'current-menu-item'; } // @todo add classes for parent/child relationships $classes = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item)); $classes = ' class="' . esc_attr($classes) . '"'; } else { $value = ' value="' . $item->ID . '"'; } $output .= $indent . '<li id="menu-item-' . $item->ID . '"' . $value . $classes . '>' . wp_get_nav_menu_item($item, $args->context, $args); }