2012-05-31 48 views

回答

4

wp_nav_menu()函數中定義WP-包括/ NAV-菜單的template.php:

function wp_nav_menu($args = array()) { 
    static $menu_id_slugs = array(); 

    $defaults = array('menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '', 
    'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>', 
    'depth' => 0, 'walker' => '', 'theme_location' => ''); 

    $args = wp_parse_args($args, $defaults); 
    $args = apply_filters('wp_nav_menu_args', $args); 
    $args = (object) $args; 

    // Get the nav menu based on the requested menu 
    $menu = wp_get_nav_menu_object($args->menu); 

    // Get the nav menu based on the theme_location 
    if (! $menu && $args->theme_location && ($locations = get_nav_menu_locations()) && isset($locations[ $args->theme_location ])) 
     $menu = wp_get_nav_menu_object($locations[ $args->theme_location ]); 

    // get the first menu that has items if we still can't find a menu 
    if (! $menu && !$args->theme_location) { 
     $menus = wp_get_nav_menus(); 
     foreach ($menus as $menu_maybe) { 
      if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id)) { 
       $menu = $menu_maybe; 
       break; 
      } 
     } 
    } 

    // If the menu exists, get its items. 
    if ($menu && ! is_wp_error($menu) && !isset($menu_items)) 
     $menu_items = wp_get_nav_menu_items($menu->term_id); 

    // If no menu was found or if the menu has no items and no location was requested, call the fallback_cb if it exists 
    if ((!$menu || is_wp_error($menu) || (isset($menu_items) && empty($menu_items) && !$args->theme_location)) 
     && $args->fallback_cb && is_callable($args->fallback_cb)) 
      return call_user_func($args->fallback_cb, (array) $args); 

    // If no fallback function was specified and the menu doesn't exists, bail. 
    if (!$menu || is_wp_error($menu)) 
     return false; 

    $nav_menu = $items = ''; 

    $show_container = false; 
    if ($args->container) { 
     $allowed_tags = apply_filters('wp_nav_menu_container_allowedtags', array('div', 'nav')); 
     if (in_array($args->container, $allowed_tags)) { 
      $show_container = true; 
      $class = $args->container_class ? ' class="' . esc_attr($args->container_class) . '"' : ' class="menu-'. $menu->slug .'-container"'; 
      $id = $args->container_id ? ' id="' . esc_attr($args->container_id) . '"' : ''; 
      $nav_menu .= '<'. $args->container . $id . $class . '>'; 
     } 
    } 

    // Set up the $menu_item variables 
    _wp_menu_item_classes_by_context($menu_items); 

    $sorted_menu_items = array(); 
    foreach ((array) $menu_items as $key => $menu_item) 
     $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); 

    // Attributes 
    if (! empty($args->menu_id)) { 
     $wrap_id = $args->menu_id; 
    } else { 
     $wrap_id = 'menu-' . $menu->slug; 
     while (in_array($wrap_id, $menu_id_slugs)) { 
      if (preg_match('#-(\d+)$#', $wrap_id, $matches)) 
       $wrap_id = preg_replace('#-(\d+)$#', '-' . ++$matches[1], $wrap_id); 
      else 
       $wrap_id = $wrap_id . '-1'; 
     } 
    } 
    $menu_id_slugs[] = $wrap_id; 

    $wrap_class = $args->menu_class ? $args->menu_class : ''; 

    // Allow plugins to hook into the menu to add their own <li>'s 
    $items = apply_filters('wp_nav_menu_items', $items, $args); 
    $items = apply_filters("wp_nav_menu_{$menu->slug}_items", $items, $args); 

    $nav_menu .= sprintf($args->items_wrap, esc_attr($wrap_id), esc_attr($wrap_class), $items); 
    unset($items); 

    if ($show_container) 
     $nav_menu .= '</' . $args->container . '>'; 

    $nav_menu = apply_filters('wp_nav_menu', $nav_menu, $args); 

    if ($args->echo) 
     echo $nav_menu; 
    else 
     return $nav_menu; 
} 

您可以更改基礎上的$ args你,當你調用該函數添加HTML。看Codex,Function Reference wp_nav_menu()

+0

儘管如此,你不應該修改wp-includes下的文件,除非你想要你的下一次更新來殺死你的修改 –

+0

完全同意!我發現瞭解代碼的最好方法就是查看源代碼。 –

+0

沒錯。雖然,所以沒有爲要顯示的菜單加載的模板文件。這個功能單獨顯示這一切?如果我想創建一個包含大量HTML的菜單,該怎麼辦?有沒有辦法可以做到這一點? –

0

wp_nav_menu()可以被看作是一個有自己方法的助手。如果它不能滿足你的需求,你可以創建你自己的。

+0

嗯...我還沒有完全理解它,雖然它似乎沒有我的菜單自定義的很多自由。看來,我只用CSS來控制它。我似乎無法寫我的不同的代碼。 –