Changeset 13512 for trunk/wp-includes/nav-menu-template.php
- Timestamp:
- 02/28/2010 08:00:49 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/wp-includes/nav-menu-template.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/nav-menu-template.php
r13473 r13512 1 1 <?php 2 3 2 /** 4 * Outputs a navigation menu.3 * Displays a navigation menu. 5 4 * 6 5 * Optional $args contents: … … 11 10 * format - Whether to format the ul. Defaults to 'div'. 12 11 * 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. 13 17 * 14 18 * TODO: 15 19 * 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.19 20 * 20 21 * @since 3.0.0 … … 23 24 */ 24 25 function 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 26 29 $args = wp_parse_args( $args, $defaults ); 30 $args = apply_filters( 'wp_nav_menu_args', $args ); 27 31 $args = (object) $args; 28 32 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 ) { 36 39 $menus = wp_get_nav_menus(); 37 40 foreach ( $menus as $menu_maybe ) { … … 43 46 } 44 47 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 49 51 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 56 56 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; 58 62 } 59 63 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 **/ 74 function 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>'; 75 130 } 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 ); 102 137 } 103 138 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 **/ 148 function wp_get_nav_menu_item( $menu_item, $context, $args = array() ) { 149 $item = ''; 105 150 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 106 161 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 165 186 case 'default': 166 187 $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 } 167 201 ?> 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 <?php174 break;175 }176 }177 178 ?>
Note: See TracChangeset
for help on using the changeset viewer.