Make WordPress Core


Ignore:
Timestamp:
04/27/2010 01:05:58 AM (15 years ago)
Author:
ryan
Message:

New menu UI. Props filosofo. see #12713

File:
1 edited

Legend:

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

    r14182 r14248  
    77 * @since 3.0.0
    88 */
     9
     10/**
     11 * Create HTML list of nav menu items.
     12 *
     13 * @package WordPress
     14 * @since 3.0.0
     15 * @uses Walker
     16 */
     17class Walker_Nav_Menu extends Walker {
     18    /**
     19     * @see Walker::$tree_type
     20     * @since 3.0.0
     21     * @var string
     22     */
     23    var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
     24
     25    /**
     26     * @see Walker::$db_fields
     27     * @since 3.0.0
     28     * @todo Decouple this.
     29     * @var array
     30     */
     31    var $db_fields = array( 'parent' => 'post_parent', 'id' => 'object_id' );
     32
     33    /**
     34     * @see Walker::start_lvl()
     35     * @since 3.0.0
     36     *
     37     * @param string $output Passed by reference. Used to append additional content.
     38     * @param int $depth Depth of page. Used for padding.
     39     */
     40    function start_lvl(&$output, $depth) {
     41        $indent = str_repeat("\t", $depth);
     42        $output .= "\n$indent<ul class=\"sub-menu\">\n";
     43    }
     44
     45    /**
     46     * @see Walker::end_lvl()
     47     * @since 3.0.0
     48     *
     49     * @param string $output Passed by reference. Used to append additional content.
     50     * @param int $depth Depth of page. Used for padding.
     51     */
     52    function end_lvl(&$output, $depth) {
     53        $indent = str_repeat("\t", $depth);
     54        $output .= "$indent</ul>\n";
     55    }
     56
     57    /**
     58     * @see Walker::start_el()
     59     * @since 3.0.0
     60     *
     61     * @param string $output Passed by reference. Used to append additional content.
     62     * @param object $item Menu item data object.
     63     * @param int $depth Depth of menu item. Used for padding.
     64     * @param int $current_page Menu item ID.
     65     * @param object $args
     66     */
     67    function start_el(&$output, $item, $depth, $args) {
     68        global $wp_query;
     69        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
     70
     71        $classes = $value = '';
     72
     73        $classes = array( 'menu-item', 'menu-item-type-'. $item->type, $item->classes );
     74
     75        if ( 'custom' != $item->object )
     76            $classes[] = 'menu-item-object-'. $item->object;
     77
     78        if ( $item->object_id == $wp_query->get_queried_object_id() )
     79            $classes[] = 'current-menu-item';
     80
     81        // @todo add classes for parent/child relationships
     82
     83        $classes = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
     84        $classes = ' class="' . esc_attr( $classes ) . '"';
     85
     86        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $classes .'>';
     87       
     88        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
     89        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
     90        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
     91        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';
     92
     93        $item_output = $args->before;
     94        $item_output .= '<a'. $attributes .'>';
     95        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title ) . $args->link_after;
     96        $item_output .= '</a>';
     97        $item_output .= $args->after;
     98   
     99        $output .= apply_filters( 'wp_get_nav_menu_item', $item_output, $args );
     100    }
     101
     102    /**
     103     * @see Walker::end_el()
     104     * @since 3.0.0
     105     *
     106     * @param string $output Passed by reference. Used to append additional content.
     107     * @param object $item Page data object. Not used.
     108     * @param int $depth Depth of page. Not Used.
     109     */
     110    function end_el(&$output, $item, $depth) {
     111        $output .= "</li>\n";
     112    }
     113}
     114
     115/**
     116 * Create HTML list of nav menu input items.
     117 *
     118 * @package WordPress
     119 * @since 3.0.0
     120 * @uses Walker_Nav_Menu
     121 */
     122class Walker_Nav_Menu_Checklist extends Walker_Nav_Menu  {
     123
     124    /**
     125     * @see Walker::start_el()
     126     * @since 3.0.0
     127     *
     128     * @param string $output Passed by reference. Used to append additional content.
     129     * @param object $item Menu item data object.
     130     * @param int $depth Depth of menu item. Used for padding.
     131     * @param int $current_page Menu item ID.
     132     * @param object $args
     133     */
     134    function start_el(&$output, $item, $depth, $args) {
     135        static $_placeholder;
     136        $_placeholder = 0 > $_placeholder ? $_placeholder - 1 : -1;
     137        $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_placeholder;
     138        $possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;
     139
     140        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
     141
     142        $output .= $indent . '<li>';
     143        $output .= '<label class="menu-item-title">';
     144        $output .= '<input type="checkbox" name="menu-item[' . $possible_object_id . '][menu-item-object-id]" value="'. esc_attr( $item->object_id ) .'" />';
     145        $output .= $item->title .'</label>';
     146
     147        // Menu item hidden fields
     148        $output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
     149        $output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="'. esc_attr( $item->object ) .'" />';
     150        $output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="'. esc_attr( $item->post_parent ) .'" />';
     151        $output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="'. esc_attr( $item->type ) .'" />';
     152        $output .= '<input type="hidden" class="menu-item-append" name="menu-item[' . $possible_object_id . '][menu-item-append]" value="'. esc_attr( $item->append ) .'" />';
     153        $output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="'. esc_attr( $item->title ) .'" />';
     154        $output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="'. esc_attr( $item->url ) .'" />';
     155        $output .= '<input type="hidden" class="menu-item-append" name="menu-item[' . $possible_object_id . '][menu-item-append]" value="'. esc_attr( $item->append ) .'" />';
     156        $output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="'. esc_attr( $item->target ) .'" />';
     157        $output .= '<input type="hidden" class="menu-item-attr_title" name="menu-item[' . $possible_object_id . '][menu-item-attr_title]" value="'. esc_attr( $item->attr_title ) .'" />';
     158        $output .= '<input type="hidden" class="menu-item-description" name="menu-item[' . $possible_object_id . '][menu-item-description]" value="'. esc_attr( $item->description ) .'" />';
     159        $output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="'. esc_attr( $item->classes ) .'" />';
     160        $output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="'. esc_attr( $item->xfn ) .'" />';
     161    }
     162}
    9163
    10164/**
     
    18172 * format - Whether to format the ul. Defaults to 'div'.
    19173 * fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'.
    20  * container - Type of container tag. Avalible options div, p, or nav. Defaults to 'div'.
    21  * container_class - Chooses a class for the container.
    22  * container_id - Chooses an id for the container.
    23174 * before - Text before the link text.
    24175 * after - Text after the link text.
     
    34185 */
    35186function wp_nav_menu( $args = array() ) {
    36     $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'echo' => true,
     187    $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'menu_class' => 'menu', 'echo' => true,
    37188    'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '',
    38189    'depth' => 0, 'walker' => '', 'context' => 'frontend' );
     
    47198    // If we couldn't find a menu based off the name, id or slug,
    48199    // get the first menu that has items.
    49     if ( !$menu ) {
     200    if ( ! $menu ) {
    50201        $menus = wp_get_nav_menus();
    51202        foreach ( $menus as $menu_maybe ) {
     
    57208    }
    58209   
    59     // If the menu exists, get it's items.
    60     if ( $menu && !is_wp_error($menu) )
    61         $menu_items = wp_get_nav_menu_items( $menu->term_id, $args->context );
     210    // If the menu exists, get its items.
     211    if ( $menu && ! is_wp_error($menu) )
     212        $menu_items = wp_get_nav_menu_items( $menu->term_id );
    62213
    63214    // If no menu was found or if the menu has no items, call the fallback_cb
     
    74225    if ( in_array( $args->container, $container_allowedtags ) ) {
    75226        $class = $args->container_class ? ' class="' . esc_attr($args->container_class) . '"' : ' class="menu-'. $menu->slug .'-container"';
    76         $container_id = $args->container_id ? ' id="' . esc_attr($args->container_id) . '"' : '' ;
    77         $nav_menu .= '<'. $args->container . $class . $container_id .'>';
     227        $nav_menu .= '<'. $args->container . $class .'>';
    78228    }
    79229
    80230    // Set up the $menu_item variables
     231    $sorted_menu_items = array();
    81232    foreach ( (array) $menu_items as $key => $menu_item )
    82         $menu_items[$menu_item->menu_order] = wp_setup_nav_menu_item( $menu_item, 'frontend' );
    83 
    84     $items .= walk_nav_menu_tree( $menu_items, $args->depth, $args );
     233        $sorted_menu_items[$menu_item->menu_order] = wp_setup_nav_menu_item( $menu_item );
     234
     235    $items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
    85236
    86237    // Attributes   
     
    113264
    114265/**
    115  * Returns the menu item formatted based on it's context.
    116  *
    117  * @since 3.0.0
    118  *
    119  * @param string $menu_item The menu item to format.
    120  * @param string $context The context to which the menu item will be formatted to.
    121  * @param string $args Optional. Args used for the 'template' context.
    122  * @return string $output The menu formatted menu item.
    123  */
    124 function wp_get_nav_menu_item( $menu_item, $context = 'frontend', $args = array() ) {
    125     $output = '';
    126     switch ( $context ) {
    127         case 'frontend':
    128             $attributes  = ! empty( $menu_item->attr_title ) ? ' title="'  . esc_attr( $menu_item->attr_title ) .'"' : '';
    129             $attributes .= ! empty( $menu_item->target )     ? ' target="' . esc_attr( $menu_item->target     ) .'"' : '';
    130             $attributes .= ! empty( $menu_item->xfn )        ? ' rel="'    . esc_attr( $menu_item->xfn        ) .'"' : '';
    131             $attributes .= ! empty( $menu_item->url )        ? ' href="'   . esc_attr( $menu_item->url        ) .'"' : '';
    132 
    133             $output .= $args->before;
    134             $output .= '<a'. $attributes .'>';
    135             $output .= $args->link_before . apply_filters( 'the_title', $menu_item->title ) . $args->link_after;
    136             $output .= '</a>';
    137             $output .= $args->after;
    138 
    139             break;
    140 
    141         case 'backend':
    142             $output .= '<dl><dt>';
    143             $output .= '<span class="item-title">'. esc_html( $menu_item->title ) .'</span>';
    144             $output .= '<span class="item-controls">';
    145             $output .= '<span class="item-type">'. esc_html( $menu_item->append ) .'</span>';
    146 
    147             // Actions
    148             $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> | ';
    149             $output .= '<a class="item-delete" id="delete-'. esc_attr( $menu_item->ID ) .'" value="'. esc_attr( $menu_item->ID ) .'">'. __('Delete') .'</a>';
    150 
    151             $output .= '</span></dt></dl>';
    152 
    153             // Menu Item Settings
    154             $output .= '<input type="hidden" name="menu-item-db-id[]" value="'. esc_attr( $menu_item->ID ) .'" />';
    155             $output .= '<input type="hidden" name="menu-item-object-id[]" value="'. esc_attr( $menu_item->object_id ) .'" />';
    156             $output .= '<input type="hidden" name="menu-item-object[]" value="'. esc_attr( $menu_item->object ) .'" />';
    157             $output .= '<input type="hidden" name="menu-item-parent-id[]" value="'. esc_attr( $menu_item->post_parent ) .'" />';
    158             $output .= '<input type="hidden" name="menu-item-position[]" value="'. esc_attr( $menu_item->menu_order ) .'" />';
    159             $output .= '<input type="hidden" name="menu-item-type[]" value="'. esc_attr( $menu_item->type ) .'" />';
    160             $output .= '<input type="hidden" name="menu-item-title[]" value="'. esc_attr( $menu_item->title ) .'" />';
    161             $output .= '<input type="hidden" name="menu-item-url[]" value="'. esc_attr( $menu_item->url ) .'" />';
    162             $output .= '<input type="hidden" name="menu-item-description[]" value="'. esc_attr( $menu_item->description ) .'" />';
    163             $output .= '<input type="hidden" name="menu-item-classes[]" value="'. esc_attr( $menu_item->classes ) .'" />';
    164             $output .= '<input type="hidden" name="menu-item-xfn[]" value="'. esc_attr( $menu_item->xfn ) .'" />';
    165             $output .= '<input type="hidden" name="menu-item-attr-title[]" value="'.esc_attr( $menu_item->post_excerpt )  .'" />';
    166             $output .= '<input type="hidden" name="menu-item-target[]" value="'. esc_attr( $menu_item->target ) .'" />';
    167             break;
    168 
    169         case 'custom':
    170         case 'taxonomy':
    171         case 'post_type':
    172             $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>';
    173 
    174             // Menu item hidden fields
    175             $output .= '<input type="hidden" class="menu-item-db-id" value="0" />';
    176             $output .= '<input type="hidden" class="menu-item-object-id" value="'. esc_attr( $menu_item->object_id ) .'" />';
    177             $output .= '<input type="hidden" class="menu-item-object" value="'. esc_attr( $menu_item->object ) .'" />';
    178             $output .= '<input type="hidden" class="menu-item-parent-id" value="'. esc_attr( $menu_item->post_parent ) .'" />';
    179             $output .= '<input type="hidden" class="menu-item-type" value="'. esc_attr( $menu_item->type ) .'" />';
    180             $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    181             $output .= '<input type="hidden" class="menu-item-title" value="'. esc_attr( $menu_item->title ) .'" />';
    182             $output .= '<input type="hidden" class="menu-item-url" value="'. esc_attr( $menu_item->url ) .'" />';
    183             $output .= '<input type="hidden" class="menu-item-append" value="'. esc_attr( $menu_item->append ) .'" />';
    184             $output .= '<input type="hidden" class="menu-item-target" value="'. esc_attr( $menu_item->target ) .'" />';
    185             $output .= '<input type="hidden" class="menu-item-attr_title" value="'. esc_attr( $menu_item->attr_title ) .'" />';
    186             $output .= '<input type="hidden" class="menu-item-description" value="'. esc_attr( $menu_item->description ) .'" />';
    187             $output .= '<input type="hidden" class="menu-item-classes" value="'. esc_attr( $menu_item->classes ) .'" />';
    188             $output .= '<input type="hidden" class="menu-item-xfn" value="'. esc_attr( $menu_item->xfn ) .'" />';
    189             break;
    190     }
    191 
    192     return apply_filters( 'wp_get_nav_menu_item', $output, $context, $args );
    193 }
     266 * Retrieve the HTML list content for nav menu items.
     267 *
     268 * @uses Walker_Nav_Menu to create HTML list content.
     269 * @since 2.1.0
     270 * @see Walker::walk() for parameters and return description.
     271 */
     272function walk_nav_menu_tree( $items, $depth, $r ) {
     273    $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
     274    $args = array( $items, $depth, $r );
     275
     276    return call_user_func_array( array(&$walker, 'walk'), $args );
     277}
     278
    194279?>
Note: See TracChangeset for help on using the changeset viewer.