Make WordPress Core


Ignore:
Timestamp:
03/22/2010 07:56:16 PM (15 years ago)
Author:
nacin
Message:

Various bug fixes and improvements to menu management. props ptahdunbar, see #11817.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/nav-menu-template.php

    r13743 r13802  
    1010 * format - Whether to format the ul. Defaults to 'div'.
    1111 * fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'.
    12  * before_link - Output text before the link.
    13  * after_link - Output text after the link.
    14  * before_title - Output text before the link text.
    15  * before_title - Output text after the link text.
     12 * before - Text before the link text.
     13 * after - Text after the link text.
     14 * link_before - Text before the link.
     15 * link_after - Text after the link.
    1616 * echo - Whether to echo the menu or return it. Defaults to echo.
    17  *
    18  * TODO:
    1917 * show_home - If you set this argument, then it will display the link to the home page. The show_home argument really just needs to be set to the value of the text of the link.
    2018 *
     
    2523function wp_nav_menu( $args = array() ) {
    2624    $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'menu_class' => 'menu', 'echo' => true,
    27     'fallback_cb' => 'wp_page_menu', 'before_link' => '', 'after_link' => '', 'before_title' => '', 'after_title' => '', );
     25    'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '',
     26    'depth' => 0, 'walker' => '' );
    2827
    2928    $args = wp_parse_args( $args, $defaults );
     
    8483 **/
    8584function wp_get_nav_menu( $args = array() ) {
    86     $defaults = array( 'menu' => '', 'menu_class' => 'menu', 'context' => 'frontend',
    87     'fallback_cb' => '', 'before_link' => '', 'after_link' => '', 'before_title' => '', 'after_title' => '', );
     85    $defaults = array( 'menu' => '', 'menu_class' => 'menu', 'context' => 'frontend', 'depth' => 0,
     86    'fallback_cb' => '', 'walker' => '', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', );
    8887   
    8988    $args = wp_parse_args( $args, $defaults );
     
    9493    $nav_menu = '';
    9594    $items = '';
    96     $current_parent = 0;
    97     $parent_stack = array();
    98     $parent_menu_order = array();
    9995   
    10096    // Get the menu object
     
    10399    // If the menu exists, get it's items.
    104100    if ( $menu && !is_wp_error($menu) )
    105         $menu_items = wp_get_nav_menu_items( $menu->term_id, 'backend' );
     101        $menu_items = wp_get_nav_menu_items( $menu->term_id, $args->context );
    106102   
    107103    // If no menu was found or if the menu has no items, call the fallback_cb
    108104    if ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) ) ) {
    109         if ( function_exists($args->fallback_cb) ) {
    110             $_args = array_merge( (array)$args, array('echo' => false) );
     105        if ( function_exists($args->fallback_cb) || is_callable( $args->fallback_cb ) ) {
     106            $_args = array_merge( (array) $args, array('echo' => false) );
    111107            return call_user_func( $args->fallback_cb, $_args );
    112108        }
    113109    }
    114    
    115     foreach ( $menu_items as $key => $menu_item ) {
    116         // Set up the $menu_item variables
    117         $menu_item = wp_setup_nav_menu_item( $menu_item, 'frontend' );
    118 
    119         $type = $menu_item->append;
    120         $maybe_value = 'frontend' == $args->context ? '' : ' value="'. $menu_item->ID .'"';
    121         $classes = 'frontend' == $args->context ? ' class="menu-item-type-'. $type . $menu_item->li_class .'"' : '';
    122        
    123         $items .= '<li id="menu-item-'. $menu_item->ID .'"'. $maybe_value . $classes .'>';
    124         $items .= wp_get_nav_menu_item( $menu_item, $args->context, $args );
    125        
    126         // Indent children
    127         $last_item = ( count( $menu_items ) == $menu_item->menu_order );
    128         if ( $last_item || $current_parent != $menu_items[$key + 1]->post_parent ) {
    129             if ( $last_item || in_array( $menu_items[$key + 1]->post_parent, $parent_stack ) ) {
    130                 $items .= '</li>';
    131                 while ( !empty( $parent_stack ) && ($last_item || $menu_items[$key + 1]->post_parent != $current_parent ) ) {
    132                     $items .= '</ul></li>';
    133                     $current_parent = array_pop( $parent_stack );
    134                 }
    135             } else {
    136                 array_push( $parent_stack, $current_parent );
    137                 $current_parent = $menu_item->ID;
    138                 $items .= '<ul class="sub-menu">';
    139             }
    140         } else {
    141             $items .= '</li>';
    142         }
    143     }
     110       
     111    // Set up the $menu_item variables
     112    foreach ( (array) $menu_items as $key => $menu_item )
     113        $menu_items[$menu_item->menu_order] = wp_setup_nav_menu_item( $menu_item, 'frontend' );
     114   
     115    $items .= walk_nav_menu_tree( $menu_items, $args->depth, $args );
    144116   
    145117    // CSS class
     
    175147    switch ( $context ) {
    176148        case 'frontend':
    177             $attributes  = ( isset($menu_item->anchor_title) && '' != $menu_item->anchor_title ) ? ' title="'. esc_attr($menu_item->anchor_title) .'"' : '';
     149            $attributes  = ( isset($menu_item->attr_title) && '' != $menu_item->attr_title ) ? ' title="'. esc_attr($menu_item->attr_title) .'"' : '';
    178150            $attributes .= ( isset($menu_item->target) && '' != $menu_item->target ) ? ' target="'. esc_attr($menu_item->target) .'"' : '';
    179             $attributes .= ( isset($menu_item->classes) && '' != $menu_item->classes ) ? ' class="'. esc_attr($menu_item->classes) .'"' : '';
    180151            $attributes .= ( isset($menu_item->xfn) && '' != $menu_item->xfn ) ? ' rel="'. esc_attr($menu_item->xfn) .'"' : '';
    181152            $attributes .= ( isset($menu_item->url) && '' != $menu_item->url ) ? ' href="'. esc_attr($menu_item->url) .'"' : '';
    182153           
    183             $output .= esc_html( $args->before_link );
     154            $output .= esc_html( $args->before );
    184155            $output .= '<a'. $attributes .'>';
    185             $output .= esc_html( $args->before_title . $menu_item->title . $args->after_title );
     156            $output .= esc_html( $args->link_before . apply_filters('the_title', $menu_item->title) . $args->link_after );
    186157            $output .= '</a>';
    187             $output .= esc_html( $args->after_link );
     158            $output .= esc_html( $args->after );
    188159           
    189160            break;
     
    191162        case 'backend':
    192163            $output .= '<dl><dt>';
    193             $output .= '<span class="item-title">'. esc_html($menu_item->title) .'</span>';
     164            $output .= '<span class="item-title">'. esc_html( $menu_item->title ) .'</span>';
    194165            $output .= '<span class="item-controls">';
    195             if ( 'custom' == $menu_item->type ) {
    196                 $label = __('Custom');
    197             } elseif ( 'post_type' == $menu_item->type ) {
    198                 $type_obj = get_post_type_object($menu_item->append);
    199                 $label = $type_obj->singular_label;
    200             } elseif ( 'taxonomy' == $menu_item->type ) {
    201                 $taxonomy = get_taxonomy($menu_item->append);
    202                 $label = $taxonomy->singular_label;
    203             } else {
    204                 $label = $menu_item->append;
    205             }
    206             $output .= '<span class="item-type">'. esc_html($label) .'</span>';
     166            $output .= '<span class="item-type">'. esc_html( $menu_item->append ) .'</span>';
    207167           
    208168            // Actions
    209             $output .= '<a class="item-edit thickbox" id="edit'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->menu_order ) .'" title="'. __('Edit Menu Item') .'" href="#TB_inline?height=540&width=300&inlineId=menu-item-settings">'. __('Edit') .'</a> | ';
    210             $output .= '<a class="item-delete" id="delete'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->menu_order ) .'">'. __('Delete') .'</a>';
    211            
    212             $output .= '</dt></dl>';
     169            $output .= '<a class="item-edit thickbox" id="edit-'. esc_attr( $menu_item->ID ) .'" value="'. esc_attr( $menu_item->ID ) .'" title="'. __('Edit Menu Item') .'" href="#TB_inline?height=540&width=300&inlineId=menu-item-settings">'. __('Edit') .'</a> | ';
     170            $output .= '<a class="item-delete" id="delete-'. esc_attr( $menu_item->ID ) .'" value="'. esc_attr( $menu_item->ID ) .'">'. __('Delete') .'</a>';
     171           
     172            $output .= '</span></dt></dl>';
    213173           
    214174            // Menu Item Settings
    215             $output .= '<input type="hidden" name="menu-item-db-id[]" id="menu-item-db-id'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->ID ) .'" />';
    216             $output .= '<input type="hidden" name="menu-item-object-id[]" id="menu-item-object-id'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->object_id ) .'" />';
    217             $output .= '<input type="hidden" name="menu-item-parent-id[]" id="menu-item-parent-id'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->post_parent ) .'" />';
    218             $output .= '<input type="hidden" name="menu-item-position[]" id="menu-item-position'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->menu_order ) .'" />';
    219             $output .= '<input type="hidden" name="menu-item-type[]" id="menu-item-type'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->type ) .'" />';
    220             $output .= '<input type="hidden" name="menu-item-append[]" id="menu-item-append'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->append ) .'" />';
    221             $output .= '<input type="hidden" name="menu-item-title[]" id="menu-item-title'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->title ) .'" />';
    222             $output .= '<input type="hidden" name="menu-item-url[]" id="menu-item-url'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->url ) .'" />';
    223             $output .= '<input type="hidden" name="menu-item-description[]" id="menu-item-description'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->description ) .'" />';
    224             $output .= '<input type="hidden" name="menu-item-classes[]" id="menu-item-classes'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->classes ) .'" />';
    225             $output .= '<input type="hidden" name="menu-item-xfn[]" id="menu-item-xfn'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->xfn ) .'" />';
    226             $output .= '<input type="hidden" name="menu-item-attr-title[]" id="menu-item-attr-title'. esc_attr( $menu_item->menu_order ) .'" value="'.esc_attr( $menu_item->post_excerpt )  .'" />';
    227             $output .= '<input type="hidden" name="menu-item-target[]" id="menu-item-target'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->target ) .'" />';
     175            $output .= '<input type="hidden" name="menu-item-db-id[]" value="'. esc_attr( $menu_item->ID ) .'" />';
     176            $output .= '<input type="hidden" name="menu-item-object-id[]" value="'. esc_attr( $menu_item->object_id ) .'" />';
     177            $output .= '<input type="hidden" name="menu-item-object[]" value="'. esc_attr( $menu_item->object ) .'" />';
     178            $output .= '<input type="hidden" name="menu-item-parent-id[]" value="'. esc_attr( $menu_item->post_parent ) .'" />';
     179            $output .= '<input type="hidden" name="menu-item-position[]" value="'. esc_attr( $menu_item->menu_order ) .'" />';
     180            $output .= '<input type="hidden" name="menu-item-type[]" value="'. esc_attr( $menu_item->type ) .'" />';
     181            $output .= '<input type="hidden" name="menu-item-title[]" value="'. esc_attr( $menu_item->title ) .'" />';
     182            $output .= '<input type="hidden" name="menu-item-url[]" value="'. esc_attr( $menu_item->url ) .'" />';
     183            $output .= '<input type="hidden" name="menu-item-description[]" value="'. esc_attr( $menu_item->description ) .'" />';
     184            $output .= '<input type="hidden" name="menu-item-classes[]" value="'. esc_attr( $menu_item->classes ) .'" />';
     185            $output .= '<input type="hidden" name="menu-item-xfn[]" value="'. esc_attr( $menu_item->xfn ) .'" />';
     186            $output .= '<input type="hidden" name="menu-item-attr-title[]" value="'.esc_attr( $menu_item->post_excerpt )  .'" />';
     187            $output .= '<input type="hidden" name="menu-item-target[]" value="'. esc_attr( $menu_item->target ) .'" />';
    228188            break;
    229189       
    230190        case 'custom':
    231             $menu_id = 'menu-item-' . $menu_item->db_id;
    232             $output .= '<label class="menu-item-title"><input type="checkbox" id="'. esc_attr( $menu_id ) .'" name="'. esc_attr( $menu_item->title ) .'" value="'. esc_attr( $menu_item->url ) .'" />'. $menu_item->title .'</label>';
     191        case 'taxonomy':
     192        case 'post_type':
     193            $output .= '<label class="menu-item-title"><input type="checkbox" id="'. esc_attr( 'menu-item-' . $menu_item->object_id ) .'" value="'. esc_attr( $menu_item->url ) .'" />'. $menu_item->title .'</label>';
    233194           
    234195            // Menu item hidden fields
    235             $output .= '<input type="hidden" class="menu-item-db-id" value="'. esc_attr( $menu_item->db_id ) .'" />';
     196            $output .= '<input type="hidden" class="menu-item-db-id" value="0" />';
    236197            $output .= '<input type="hidden" class="menu-item-object-id" value="'. esc_attr( $menu_item->object_id ) .'" />';
    237             $output .= '<input type="hidden" class="menu-item-parent-id" value="'. esc_attr( $menu_item->parent_id ) .'" />';
     198            $output .= '<input type="hidden" class="menu-item-object" value="'. esc_attr( $menu_item->object ) .'" />';
     199            $output .= '<input type="hidden" class="menu-item-parent-id" value="'. esc_attr( $menu_item->post_parent ) .'" />';
    238200            $output .= '<input type="hidden" class="menu-item-type" value="'. esc_attr( $menu_item->type ) .'" />';
    239201            $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    240202            $output .= '<input type="hidden" class="menu-item-title" value="'. esc_attr( $menu_item->title ) .'" />';
    241203            $output .= '<input type="hidden" class="menu-item-url" value="'. esc_attr( $menu_item->url ) .'" />';
     204            $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    242205            $output .= '<input type="hidden" class="menu-item-target" value="'. esc_attr( $menu_item->target ) .'" />';
    243206            $output .= '<input type="hidden" class="menu-item-attr_title" value="'. esc_attr( $menu_item->attr_title ) .'" />';
     
    246209            $output .= '<input type="hidden" class="menu-item-xfn" value="'. esc_attr( $menu_item->xfn ) .'" />';
    247210            break;
    248        
    249         case 'taxonomy':
    250         case 'post_type':
    251             $menu_id = 'menu-item-' . $menu_item->db_id;
    252             $output .= '<label class="menu-item-title"><input type="checkbox" id="'. esc_attr( $menu_id ) .'" name="'. esc_attr( $menu_item->title ) .'" value="'. esc_attr( $menu_item->url ) .'" />'. $menu_item->title .'</label>';
    253            
    254             // Menu item hidden fields
    255             $output .= '<input type="hidden" class="menu-item-db-id" value="0" />';
    256             $output .= '<input type="hidden" class="menu-item-object-id" value="'. esc_attr( $menu_item->object_id ) .'" />';
    257             $output .= '<input type="hidden" class="menu-item-parent-id" value="'. esc_attr( $menu_item->parent_id ) .'" />';
    258             $output .= '<input type="hidden" class="menu-item-type" value="'. esc_attr( $menu_item->type ) .'" />';
    259             $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    260             $output .= '<input type="hidden" class="menu-item-title" value="'. esc_attr( $menu_item->title ) .'" />';
    261             $output .= '<input type="hidden" class="menu-item-url" value="'. esc_attr( $menu_item->url ) .'" />';
    262             $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    263             break;
    264211    }
    265212   
Note: See TracChangeset for help on using the changeset viewer.