Make WordPress Core

Ticket #12896: nav_menu_bug_fixes.diff

File nav_menu_bug_fixes.diff, 11.0 KB (added by ptahdunbar, 15 years ago)
  • wp-includes/nav-menu-template.php

     
    2222 * link_before - Text before the link.
    2323 * link_after - Text after the link.
    2424 * echo - Whether to echo the menu or return it. Defaults to echo.
    25  * 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.
    2625 *
     26 * @todo 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.
     27 *
    2728 * @since 3.0.0
    2829 *
    2930 * @param array $args Arguments
     
    3132function wp_nav_menu( $args = array() ) {
    3233        $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'menu_class' => 'menu', 'echo' => true,
    3334        'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '',
    34         'depth' => 0, 'walker' => '' );
     35        'depth' => 0, 'walker' => '', 'context' => 'frontend' );
    3536
    3637        $args = wp_parse_args( $args, $defaults );
    3738        $args = apply_filters( 'wp_nav_menu_args', $args );
     
    5152                        }
    5253                }
    5354        }
    54 
    55         if ( $menu && ! is_wp_error( $menu ) )
    56                 $args->menu = $menu->term_id;
    57         $nav_menu = '';
    58 
    59         if ( 'div' == $args->container ) {
    60                 $class = $args->container_class ? ' class="' . esc_attr($args->container_class) . '"' : '';
    61 
    62                 if ( is_nav_menu($menu) ) {
    63                         $nav_menu .= '<div id="menu-' . $menu->slug . '"'. $class .'>';
    64                 } else {
    65                         $nav_menu .= '<div'. $class .'>';
    66                 }
    67         }
    68 
    69         $nav_menu .= wp_get_nav_menu( $args );
    70 
    71         if ( 'div' == $args->container )
    72                 $nav_menu .= '</div>';
    73 
    74         $nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );
    75 
    76         if ( $args->echo )
    77                 echo $nav_menu;
    78         else
    79                 return $nav_menu;
    80 }
    81 
    82 /**
    83  * Returns a Navigation Menu.
    84  *
    85  * See wp_nav_menu() for args.
    86  *
    87  * @since 3.0.0
    88  *
    89  * @param array $args Arguments
    90  * @return mixed $output False if menu doesn't exists, else, returns the menu.
    91  **/
    92 function wp_get_nav_menu( $args = array() ) {
    93         $defaults = array( 'menu' => '', 'menu_class' => 'menu', 'context' => 'frontend', 'depth' => 0,
    94         'fallback_cb' => '', 'walker' => '', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', );
    95 
    96         $args = wp_parse_args( $args, $defaults );
    97         $args = apply_filters( 'wp_get_nav_menu_args', $args );
    98         $args = (object) $args;
    99 
    100         // Variable setup
    101         $nav_menu = '';
    102         $items = '';
    103 
    104         // Get the menu object
    105         $menu = wp_get_nav_menu_object( $args->menu );
    106 
     55       
    10756        // If the menu exists, get it's items.
    10857        if ( $menu && !is_wp_error($menu) )
    10958                $menu_items = wp_get_nav_menu_items( $menu->term_id, $args->context );
    11059
    11160        // If no menu was found or if the menu has no items, call the fallback_cb
    11261        if ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) ) ) {
    113                 if ( function_exists($args->fallback_cb) || is_callable( $args->fallback_cb ) ) {
    114                         $_args = array_merge( (array) $args, array('echo' => false) );
    115                         return call_user_func( $args->fallback_cb, $_args );
     62                if ( 'frontend' == $args->context && ( function_exists($args->fallback_cb) || is_callable( $args->fallback_cb ) ) ) {
     63                        return call_user_func( $args->fallback_cb, (array) $args );
    11664                }
    11765        }
     66       
     67        $nav_menu = '';
     68        $items = '';
     69        $container_allowedtags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'p', 'nav' ) );
    11870
     71        if ( in_array( $args->container, $container_allowedtags ) ) {
     72                $class = $args->container_class ? ' class="' . esc_attr($args->container_class) . '"' : ' class="menu-'. $menu->slug .'-container"';
     73                $nav_menu .= '<'. $args->container . $class .'>';
     74        }
     75
    11976        // Set up the $menu_item variables
    12077        foreach ( (array) $menu_items as $key => $menu_item )
    12178                $menu_items[$menu_item->menu_order] = wp_setup_nav_menu_item( $menu_item, 'frontend' );
    12279
    12380        $items .= walk_nav_menu_tree( $menu_items, $args->depth, $args );
    12481
    125         // CSS class
    126         $ul_class = $args->menu_class ? ' class="'. $args->menu_class .'"' : '';
    127         $nav_menu .= '<ul'. $ul_class .'>';
     82        // Attributes   
     83        $attributes  = ' id="menu-' . $menu->slug . '"';
     84        $attributes .= $args->menu_class ? ' class="'. $args->menu_class .'"' : '';
     85       
     86        $nav_menu .= '<ul'. $attributes .'>';
    12887
    12988        // Allow plugins to hook into the menu to add their own <li>'s
    13089        if ( 'frontend' == $args->context ) {
     
    13796
    13897        $nav_menu .= '</ul>';
    13998
    140         return apply_filters( 'wp_get_nav_menu', $nav_menu );
     99        if ( in_array( $args->container, $container_allowedtags ) )
     100                $nav_menu .= '</'. $args->container .'>';
     101
     102        $nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );
     103
     104        if ( $args->echo )
     105                echo $nav_menu;
     106        else
     107                return $nav_menu;
    141108}
    142109
    143110/**
     
    161128
    162129                        $output .= $args->before;
    163130                        $output .= '<a'. $attributes .'>';
    164                         $output .= $args->link_before . apply_filters('the_title', $menu_item->title) . $args->link_after;
     131                        $output .= $args->link_before . apply_filters( 'the_title', $menu_item->title ) . $args->link_after;
    165132                        $output .= '</a>';
    166133                        $output .= $args->after;
    167134
     
    218185                        break;
    219186        }
    220187
    221         return $output;
     188        return apply_filters( 'wp_get_nav_menu_item', $output, $context, $args );
    222189}
    223190?>
     191 No newline at end of file
  • wp-includes/classes.php

     
    11781178         * @param object $item Menu item data object.
    11791179         * @param int $depth Depth of menu item. Used for padding.
    11801180         * @param int $current_page Menu item ID.
    1181          * @param array $args
     1181         * @param object $args
    11821182         */
    11831183        function start_el(&$output, $item, $depth, $args) {
    11841184                $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
     
    12171217        function end_el(&$output, $item, $depth) {
    12181218                $output .= "</li>\n";
    12191219        }
    1220 
    12211220}
    12221221
    12231222/**
  • wp-includes/nav-menu.php

     
    178178        $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
    179179        $args = array( $items, $depth, $r );
    180180
    181         return call_user_func_array(array(&$walker, 'walk'), $args);
     181        return call_user_func_array( array(&$walker, 'walk'), $args );
    182182}
    183183
    184184/**
     
    202202                        if ( 'post_type' == $menu_item->type ) {
    203203                                $object = get_post_type_object( $menu_item->object );
    204204                                $menu_item->append = $object->singular_label;
     205                                $menu_item->url = get_permalink( $menu_item->object_id );
    205206
    206207                        } elseif ( 'taxonomy' == $menu_item->type ) {
    207208                                $object = get_taxonomy( $menu_item->object );
    208209                                $menu_item->append = $object->singular_label;
     210                                $menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object );
    209211
    210212                        } else {
    211213                                $menu_item->append = __('Custom');
     214                                $menu_item->url = get_post_meta( $menu_item->ID, '_menu_item_url', true );
    212215                        }
    213216
    214217                        $menu_item->title = $menu_item->post_title;
    215                         $menu_item->url = get_post_meta( $menu_item->ID, '_menu_item_url', true );
    216218                        $menu_item->target = get_post_meta( $menu_item->ID, '_menu_item_target', true );
    217219
    218220                        $menu_item->attr_title = strip_tags( $menu_item->post_excerpt );
     
    221223                        $menu_item->classes = get_post_meta( $menu_item->ID, '_menu_item_classes', true );
    222224                        $menu_item->xfn = get_post_meta( $menu_item->ID, '_menu_item_xfn', true );
    223225                        break;
    224 
     226               
    225227                case 'custom':
    226228                        $menu_item->db_id = 0;
    227229                        $menu_item->object_id = (int) $menu_item->ID;
     
    235237                        $menu_item->title = $menu_item->post_title;
    236238                        $menu_item->url = get_post_meta( $menu_item->ID, '_menu_item_url', true );
    237239                        $menu_item->target = get_post_meta( $menu_item->ID, '_menu_item_target', true );
    238                         $menu_item->classes = '';
    239                         $menu_item->xfn = '';
     240                        $menu_item->classes = get_post_meta( $menu_item->ID, '_menu_item_target', true );
     241                        $menu_item->xfn = get_post_meta( $menu_item->ID, '_menu_item_xfn', true );
    240242                        break;
    241243
    242244                case 'post_type':
     
    273275                        $menu_item->url = get_term_link( $menu_item, $menu_item_object );
    274276                        $menu_item->target = '';
    275277                        $menu_item->attr_title = '';
    276                         $menu_item->description = strip_tags( $menu_item->description );
     278                        $menu_item->description = '';
    277279                        $menu_item->classes = '';
    278280                        $menu_item->xfn = '';
    279281                        break;
    280282        }
    281         return $menu_item;
     283       
     284        return apply_filters( 'wp_setup_nav_menu_item', $menu_item, $menu_item_type, $menu_item_object );
    282285}
    283 ?>
     286?>
     287 No newline at end of file
  • wp-content/themes/twentyten/style.css

     
    113113h3#comments-title,
    114114h3#reply-title,
    115115#access .menu,
     116#access div.menu ul,
    116117#cancel-comment-reply-link,
    117118.form-allowed-tags,
    118119#site-info,
     
    153154
    154155/* The main theme structure */
    155156#access .menu-header,
     157div.menu,
    156158#colophon,
    157159#branding,
    158160#main,
     
    360362        display:block;
    361363        float:left;
    362364}
    363 #access .menu-header {
     365#access .menu-header, div.menu {
    364366        font-size: 13px;
    365367        margin-left: 12px;
    366368}
    367 #access .menu-header ul {
     369#access .menu-header ul, div.menu ul {
    368370        list-style: none;
    369371        margin: 0;
    370372}
    371 #access .menu-header li {
     373#access .menu-header li, div.menu li {
    372374        float:left;
    373375        position: relative;
    374376}
  • wp-admin/includes/nav-menu.php

     
    5555
    5656        foreach ( $post_types as $post_type ) {
    5757                $id = $post_type->name;
    58                 add_meta_box( "add-{$id}", sprintf( __('Add an Existing %s'), $post_type->singular_label ), 'wp_nav_menu_item_post_type_metabox', 'nav-menus', 'side', 'default', $post_type );
     58                add_meta_box( "add-{$id}", sprintf( __('Add %s'), $post_type->label ), 'wp_nav_menu_item_post_type_metabox', 'nav-menus', 'side', 'default', $post_type );
    5959        }
    6060}
    6161
     
    7272
    7373        foreach ( $taxonomies as $tax ) {
    7474                $id = $tax->name;
    75 
    76                 add_meta_box( "add-{$id}", sprintf( __('Add an Existing %s'), $tax->singular_label ), 'wp_nav_menu_item_taxonomy_metabox', 'nav-menus', 'side', 'default', $tax );
     75                add_meta_box( "add-{$id}", sprintf( __('Add %s'), $tax->label ), 'wp_nav_menu_item_taxonomy_metabox', 'nav-menus', 'side', 'default', $tax );
    7776        }
    7877}
    7978
  • wp-admin/nav-menus.php

     
    274274                                                <div id="menu-container" class="postbox">
    275275                                                        <h3 class="hndle"><?php echo esc_html( $nav_menu_selected_title ); ?></h3>
    276276                                                        <div class="inside">
    277                                                                 <?php echo wp_get_nav_menu( array( 'context' => 'backend', 'menu' => $nav_menu_selected_id ) ); ?>
     277                                                                <?php wp_nav_menu( array( 'menu' => $nav_menu_selected_id, 'context' => 'backend' ) ); ?>
    278278                                                        </div><!-- /.inside -->
    279279                                                <!-- /#nav-menu-canvas .postbox-->
    280280                                                </div>