Make WordPress Core


Ignore:
Timestamp:
03/22/2010 07:56:16 PM (17 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.