Make WordPress Core


Ignore:
Timestamp:
02/28/2010 08:00:49 PM (17 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.