Make WordPress Core


Ignore:
Timestamp:
02/28/2010 08:00:49 PM (16 years ago)
Author:
ryan
Message:

Menu enhancements. Props ptahdunbar. fixes #11817

File:
1 edited

Legend:

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

    r13473 r13512  
    11<?php
    2 
    32/**
    4  * Outputs a navigation menu.
     3 * Displays a navigation menu.
    54 *
    65 * Optional $args contents:
     
    1110 * format - Whether to format the ul. Defaults to 'div'.
    1211 * 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.
     16 * echo - Whether to echo the menu or return it. Defaults to echo.
    1317 *
    1418 * TODO:
    1519 * 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.
    16  * link_before - Text before show_home argument text.
    17  * link_after - Text after show_home argument text.
    18  * echo - Whether to echo the menu or return it. Defaults to echo.
    1920 *
    2021 * @since 3.0.0
     
    2324 */
    2425function wp_nav_menu( $args = array() ) {
    25     $defaults = array( 'id' => '', 'slug' => '', 'menu_class' => 'menu', 'format' => 'div', 'fallback_cb' => 'wp_page_menu', 'echo' => true, 'link_before' => '', 'link_after' => '' );
     26    $defaults = array( 'menu' => '', 'menu_class' => 'menu', 'format' => 'div', 'echo' => true,
     27    'fallback_cb' => 'wp_page_menu', 'link_before' => '', 'link_after' => '', 'before_link' => '', 'after_link' => '', );
     28   
    2629    $args = wp_parse_args( $args, $defaults );
     30    $args = apply_filters( 'wp_nav_menu_args', $args );
    2731    $args = (object) $args;
    2832   
    29     // Get the menu
    30     $menu = null;
    31     if ( !empty($args->id) ) {
    32         $menu = wp_get_nav_menu( $args->id );
    33     } elseif ( !empty($args->slug) ) {
    34         $menu = get_term_by( 'slug', $args->slug, 'nav_menu' );
    35     } else {
     33    // Get the nav menu
     34    $menu = wp_get_nav_menu_object( $args->menu );
     35       
     36    // If we couldn't find a menu based off the name, id or slug,
     37    // get the first menu that has items.
     38    if ( !$menu ) {
    3639        $menus = wp_get_nav_menus();
    3740        foreach ( $menus as $menu_maybe ) {
     
    4346    }
    4447   
    45     // If the menu doesn't exists, call the fallback_cb
    46     if ( !$menu || is_wp_error($menu) )
    47         return call_user_func($args->fallback_cb, $args );
    48 
     48    $args->menu = $menu->term_id;
     49    $nav_menu = '';
     50   
    4951    if ( 'div' == $args->format )
    50         echo '<div class="' . esc_attr($args->menu_class) . '"><ul>';
    51 
    52     $args->id = $menu->term_id;
    53 
    54     wp_print_nav_menu($args);
    55        
     52        $nav_menu .= '<div id="menu-'. $menu->slug .'" class="' . esc_attr($args->menu_class) . '">';
     53   
     54    $nav_menu .= wp_get_nav_menu( $args );
     55   
    5656    if ( 'div' == $args->format )
    57         echo '</ul></div>';
     57        $nav_menu .= '</div>';
     58   
     59    $nav_menu = apply_filters( 'wp_nav_menu', $nav_menu );
     60   
     61    return $args->echo ? print $nav_menu : $nav_menu;
    5862}
    5963
    60 function wp_print_nav_menu( $args = array() ) {
    61         // Defaults
    62         $defaults = array( 'type' => 'frontend', 'name' => 'Menu 1', 'id' => 0, 'desc' => 2, 'before_title' => '', 'after_title' => '');
    63 
    64         $args = wp_parse_args($args, $defaults);
    65         extract($args, EXTR_SKIP);
    66 
    67         $menu_items = wp_get_nav_menu_items( $id );
    68 
    69         $parent_stack = array();
    70         $current_parent = 0;
    71         $parent_menu_order = array();
    72         // Setup parentage
    73         foreach ( $menu_items as $menu_item ) {
    74             $parent_menu_order[ $menu_item->ID ] = $menu_item->menu_order;
     64/**
     65 * Returns a Navigation Menu.
     66 *
     67 * See wp_nav_menu() for args.
     68 *
     69 * @since 3.0.0
     70 *
     71 * @param array $args Arguments
     72 * @return mixed $output False if menu doesn't exists, else, returns the menu.
     73 **/
     74function wp_get_nav_menu( $args = array() ) {
     75    $defaults = array( 'menu' => '', 'menu_class' => 'menu', 'ul_class' => '', 'format' => 'div', 'type' => 'frontend',
     76    'fallback_cb' => '', 'link_before' => '', 'link_after' => '', 'before_link' => '', 'after_link' => '', );
     77   
     78    $args = wp_parse_args( $args, $defaults );
     79    $args = apply_filters( 'wp_get_nav_menu_args', $args );
     80    $args = (object) $args;
     81   
     82    $menu = wp_get_nav_menu_object( $args->menu );
     83   
     84    // If no menu was found, call the fallback_cb
     85    if ( !$menu || is_wp_error($menu) ) {
     86        if ( function_exists($args->fallback_cb) )
     87            return call_user_func( $args->fallback_cb, $args );
     88    }
     89   
     90    $menu_items = wp_get_nav_menu_items( $menu->term_id );
     91    $nav_menu = '';
     92    $parent_stack = array();
     93    $current_parent = 0;
     94    $parent_menu_order = array();
     95   
     96    // Setup parentage
     97    foreach ( $menu_items as $menu_item )
     98        $parent_menu_order[ $menu_item->ID ] = $menu_item->menu_order;
     99   
     100    $ul_class = isset($args->ul_class) ? ' class="'. $args->ul_class .'"' : '';
     101    $nav_menu .= '<ul'. $ul_class .'>';
     102   
     103    // Display Loop
     104    foreach ( $menu_items as $key => $menu_item ) :
     105        // Setup the $menu_item variables
     106        $menu_item = wp_setup_nav_menu_item( $menu_item );
     107       
     108        $maybe_value = 'frontend' == $args->type ? '' : ' value="'. $menu_item->ID .'"';
     109        $classes = 'frontend' == $args->type ? 'class="menu-item-'. $menu_item->type . $menu_item->li_class .'"' : '';
     110       
     111        $nav_menu .= '<li id="menu-item-'. $menu_item->ID .'"'. $maybe_value . $classes .'>';
     112        $nav_menu .= wp_get_nav_menu_item( $menu_item, $args->type, $args );
     113       
     114        // Indent children
     115        $last_item = ( count( $menu_items ) == $menu_item->menu_order );
     116        if ( $last_item || $current_parent != $menu_items[ $key + 1 ]->post_parent ) {
     117            if ( $last_item || in_array( $menu_items[ $key + 1 ]->post_parent, $parent_stack ) ) {
     118                $nav_menu .= '</li>';
     119                while ( !empty( $parent_stack ) && ($last_item || $menu_items[ $key + 1 ]->post_parent != $current_parent ) ) {
     120                    $nav_menu .= '</ul></li>';
     121                    $current_parent = array_pop( $parent_stack );
     122                }
     123            } else {
     124                array_push( $parent_stack, $current_parent );
     125                $current_parent = $menu_item->ID;
     126                $nav_menu .= '<ul>';
     127            }
     128        } else {
     129            $nav_menu .= '</li>';
    75130        }
    76 
    77         // Display Loop
    78         foreach ( $menu_items as $key => $menu_item ) {
    79             $menu_item = wp_setup_nav_menu_item($menu_item);
    80             // List Items
    81             ?><li id="menu-<?php echo $menu_item->ID; ?>" value="<?php echo $menu_item->ID; ?>" <?php echo $menu_item->li_class; ?>><?php
    82             wp_print_nav_menu_item($menu_item, $type, $args);
    83             // Indent children
    84             $last_item = ( count( $menu_items ) == $menu_item->menu_order );
    85             if ( $last_item || $current_parent != $menu_items[ $key + 1 ]->post_parent ) {
    86                 if ( $last_item || in_array( $menu_items[ $key + 1 ]->post_parent, $parent_stack ) ) { ?>
    87         </li>
    88 <?php                   while ( !empty( $parent_stack ) && ($last_item || $menu_items[ $key + 1 ]->post_parent != $current_parent ) ) { ?>
    89             </ul>
    90         </li>
    91 <?php                   $current_parent = array_pop( $parent_stack );
    92                     } ?>
    93 <?php               } else {
    94                     array_push( $parent_stack, $current_parent );
    95                     $current_parent = $menu_item->ID; ?>
    96             <ul>
    97 <?php               }
    98             } else { ?>
    99         </li>
    100 <?php       }
    101     }
     131       
     132    endforeach;
     133   
     134    $nav_menu .= '</ul>';
     135   
     136    return apply_filters( 'wp_get_nav_menu', $nav_menu );
    102137}
    103138
    104 function wp_print_nav_menu_item( $menu_item, $context, $args = array() ) {
     139/**
     140 * Returns a menu item.
     141 *
     142 * @since 3.0.0
     143 *
     144 * @param object $menu_item The menu item
     145 * @param string $context frontend|backend|default
     146 * @param array $args See wp_get_nav_menu().
     147 **/
     148function wp_get_nav_menu_item( $menu_item, $context, $args = array() ) {
     149    $item = '';
    105150    switch ( $context ) {
     151        case 'frontend':
     152            $attr_title = ( isset($menu_item->anchor_title) && '' != $menu_item->anchor_title ) ? ' title="'. esc_attr($menu_item->anchor_title) .'"' : '';
     153            $href = isset($menu_item->link) ? ' href="'. esc_url($menu_item->link) .'"' : '';
     154           
     155            $item .= '<a'. $attr_title . $href . $menu_item->target .'>';
     156            $item .= $args->before_link . esc_html( $menu_item->title ) . $args->after_link;
     157            $item .= '</a>';
     158           
     159            break;
     160       
    106161        case 'backend':
    107         case 'menu':
    108 ?>
    109                         <dl>
    110                             <dt>
    111                                 <span class="item-title"><?php echo esc_html($menu_item->title); ?></span>
    112                                 <span class="item-controls">
    113                                     <span class="item-type"><?php echo esc_html($menu_item->type); ?></span>
    114                                     <a class="item-edit thickbox" id="edit<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->menu_order ); ?>" title="<?php _e('Edit Menu Item'); ?>" href="#TB_inline?height=380&width=300&inlineId=menu-item-settings"><?php _e('Edit'); ?></a> |
    115                                     <a class="item-delete" id="delete<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->menu_order ); ?>"><?php _e('Delete'); ?></a>
    116                                 </span>
    117                             </dt>
    118                         </dl>
    119                         <?php if ( 'backend' == $context ) { ?>
    120                         <a><span class=""></span></a>
    121                         <?php } else { ?>
    122                         <a class="hide" href="<?php echo $menu_item->link; ?>"><?php echo esc_html( $menu_item->title ); ?></a>
    123                         <?php } ?>
    124                         <input type="hidden" name="dbid<?php echo esc_attr( $menu_item->menu_order ); ?>" id="dbid<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->ID ); ?>" />
    125                         <input type="hidden" name="postmenu<?php echo esc_attr( $menu_item->menu_order ); ?>" id="postmenu<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( get_post_meta( $menu_item->ID, 'object_id', true ) ); ?>" />
    126                         <input type="hidden" name="parent<?php echo esc_attr( $menu_item->menu_order ); ?>" id="parent<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->parent_item ); ?>" />
    127                         <input type="hidden" name="icon<?php echo esc_attr( $menu_item->menu_order ); ?>" id="icon<?php echo esc_attr( $menu_item->menu_order ); ?>" value="0" />
    128                         <input type="hidden" name="position<?php echo esc_attr( $menu_item->menu_order ); ?>" id="position<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->menu_order ); ?>" />
    129                         <input type="hidden" name="linktype<?php echo esc_attr( $menu_item->menu_order ); ?>" id="linktype<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( get_post_meta( $menu_item->ID, 'menu_type', true ) ); ?>" />
    130                         <input type="hidden" name="item-title<?php echo esc_attr( $menu_item->menu_order ); ?>" id="item-title<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->title ); ?>" />
    131                         <input type="hidden" name="item-url<?php echo esc_attr( $menu_item->menu_order ); ?>" id="item-url<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->link ); ?>" />
    132                         <input type="hidden" name="item-description<?php echo esc_attr( $menu_item->menu_order ); ?>" id="item-description<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->description ); ?>" />
    133                         <input type="hidden" name="item-attr-title<?php echo esc_attr( $menu_item->menu_order ); ?>" id="item-attr-title<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo esc_attr( $menu_item->post_excerpt ); ?>" />
    134                         <input type="hidden" name="item-target<?php echo esc_attr( $menu_item->menu_order ); ?>" id="item-target<?php echo esc_attr( $menu_item->menu_order ); ?>" value="<?php echo ( get_post_meta( $menu_item->ID, 'menu_new_window', true ) ? '1' : '0' ); ?>" />
    135 <?php
    136         break;
    137 
    138         case 'frontend':
    139             // Override for menu descriptions
    140             $advanced_option_descriptions = get_option('wp_settings_nav_menu_advanced_options');
    141             if ( $advanced_option_descriptions == 'no' )
    142                 $args['desc'] = 2;
    143 ?>
    144             <a title="<?php echo esc_attr( $menu_item->anchor_title ); ?>" href="<?php echo esc_url( $menu_item->link ); ?>" <?php echo $menu_item->target; ?>><?php echo $args['before_title'] . esc_html( $menu_item->title ) . $args['after_title']; ?><?php
    145 
    146                             if ( $advanced_option_descriptions == 'no' ) {
    147                                 // 2 widget override do NOT display descriptions
    148                                 // 1 widget override display descriptions
    149                                 // 0 widget override not set
    150                                 if ( ($args['desc'] == 1) || ($args['desc'] == 0) ) {
    151                                     ?><span class="nav-description"><?php echo $menu_item->description; ?></span><?php
    152                                 }
    153                             } else {
    154                                 // 2 widget override do NOT display descriptions
    155                                 // 1 widget override display descriptions
    156                                 // 0 widget override not set
    157                                 if ( $args['desc'] == 1 ) {
    158                                     ?><span class="nav-description"><?php echo $menu_item->description; ?></span><?php
    159                                 }
    160                             }
    161                         ?></a>
    162 <?php
    163         break;
    164 
     162            $item .= '<dl><dt>';
     163            $item .= '<span class="item-title">'. esc_html($menu_item->title) .'</span>';
     164            $item .= '<span class="item-controls">';
     165            $item .= '<span class="item-type">'. esc_html($menu_item->type) .'</span>';
     166           
     167            // Actions
     168            $item .= '<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=380&width=300&inlineId=menu-item-settings">'. __('Edit') .'</a> | ';
     169            $item .= '<a class="item-delete" id="delete'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->menu_order ) .'">'. __('Delete') .'</a>';
     170           
     171            $item .= '</dt></dl>';
     172           
     173            // Menu Item Settings
     174            $item .= '<input type="hidden" id="item-dbid'. esc_attr( $menu_item->menu_order ) .'" name="item-dbid'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->ID ) .'" />';
     175            $item .= '<input type="hidden" id="item-postmenu'. esc_attr( $menu_item->menu_order ) .'" name="item-postmenu'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( get_post_meta( $menu_item->ID, 'object_id', true ) ) .'" />';
     176            $item .= '<input type="hidden" id="item-parent'. esc_attr( $menu_item->menu_order ) .'" name="item-parent'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->parent_item ) .'" />';
     177            $item .= '<input type="hidden" id="item-position'. esc_attr( $menu_item->menu_order ) .'" name="item-position'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->menu_order ) .'" />';
     178            $item .= '<input type="hidden" id="item-type'. esc_attr( $menu_item->menu_order ) .'" name="item-type'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( get_post_meta( $menu_item->ID, 'menu_type', true ) ) .'" />';
     179            $item .= '<input type="hidden" id="item-title'. esc_attr( $menu_item->menu_order ) .'" name="item-title'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->title ) .'" />';
     180            $item .= '<input type="hidden" id="item-url'. esc_attr( $menu_item->menu_order ) .'" name="item-url'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->link ) .'" />';
     181            $item .= '<input type="hidden" id="item-description'. esc_attr( $menu_item->menu_order ) .'" name="item-description'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( $menu_item->description ) .'" />';
     182            $item .= '<input type="hidden" id="item-attr-title'. esc_attr( $menu_item->menu_order ) .'" name="item-attr-title'. esc_attr( $menu_item->menu_order ) .'" value="'.esc_attr( $menu_item->post_excerpt )  .'" />';
     183            $item .= '<input type="hidden" id="item-target'. esc_attr( $menu_item->menu_order ) .'" name="item-target'. esc_attr( $menu_item->menu_order ) .'" value="'. esc_attr( get_post_meta( $menu_item->ID, 'menu_new_window', true ) ? '1' : '0' ) .'" />';
     184            break;
     185           
    165186        case 'default':
    166187            $menu_id = 'menu-item-' . $menu_item->ID;
     188            $item .= '<label class="item-title"><input type="checkbox" id="'. esc_attr($menu_id) .'" name="'. esc_attr( $menu_item->title ) .'" value="'. esc_attr( $menu_item->link ) .'" />'. $menu_item->title .'</label>';
     189           
     190            // Menu Item Settings
     191            $item .= '<input type="hidden" class="item-type" value="'. esc_attr( $menu_item->append ) .'" />';
     192            $item .= '<input type="hidden" class="item-title" value="'. esc_attr( $menu_item->title ) .'" />';
     193            $item .= '<input type="hidden" class="item-url" value="'. esc_attr( $menu_item->link ) .'" />';
     194            $item .= '<input type="hidden" class="item-dbid" value="'. esc_attr( $menu_item->ID ) .'" />';
     195            $item .= '<input type="hidden" class="item-parent" value="'. esc_attr( $menu_item->parent_item ) .'" />';
     196            $item .= '<input type="hidden" class="item-description" value="'. esc_attr( $menu_item->description ) .'" />';
     197            break;
     198    }
     199    return apply_filters( 'wp_get_nav_menu_item', $item );
     200}
    167201?>
    168                     <dl>
    169                         <dt>
    170                             <label class="item-title"><input type="checkbox" id="<?php echo esc_attr($menu_id); ?>" onclick="wp_update_queue('<?php echo esc_js( $menu_item->append ); ?>','<?php echo esc_js( $menu_item->title ); ?>','<?php echo esc_js( $menu_item->link ); ?>','<?php echo esc_js( $menu_item->ID ); ?>','<?php echo esc_js( $menu_item->parent_item ); ?>','<?php echo esc_js( $menu_item->description ); ?>')" name="<?php echo esc_attr( $menu_item->title ); ?>" value="<?php echo esc_attr( $menu_item->link ); ?>" /><?php echo $menu_item->title; ?></label>
    171                         </dt>
    172                     </dl>
    173 <?php
    174         break;
    175     }
    176 }
    177 
    178 ?>
Note: See TracChangeset for help on using the changeset viewer.