WordPress.org

Make WordPress Core

Ticket #13148: menu_item_api_and_fixes.13148.diff

File menu_item_api_and_fixes.13148.diff, 13.5 KB (added by filosofo, 8 years ago)
  • wp-includes/default-filters.php

     
    169169add_filter( 'comments_open',        '_close_comments_for_old_post', 10, 2 );
    170170add_filter( 'pings_open',           '_close_comments_for_old_post', 10, 2 );
    171171add_filter( 'editable_slug',        'urldecode'                           );
     172add_filter( 'nav_menu_meta_box_object','_wp_nav_menu_meta_box_object'     );
    172173
    173174// Atom SSL support
    174175add_filter( 'atom_service_url','atom_service_url_filter' );
  • wp-includes/nav-menu-template.php

     
    136136                $_placeholder = 0 > $_placeholder ? $_placeholder - 1 : -1;
    137137                $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_placeholder;
    138138                $possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;
     139                $possible_parent_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->post_parent : 0;
    139140
    140141                $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
    141142
     
    147148                // Menu item hidden fields
    148149                $output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
    149150                $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-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="'. $possible_parent_id .'" />';
    151152                $output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="'. esc_attr( $item->type ) .'" />';
    152153                $output .= '<input type="hidden" class="menu-item-append" name="menu-item[' . $possible_object_id . '][menu-item-append]" value="'. esc_attr( $item->append ) .'" />';
    153154                $output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="'. esc_attr( $item->title ) .'" />';
  • wp-includes/nav-menu.php

     
    5050       
    5151        $menu_obj = wp_get_nav_menu_object( $menu );
    5252
    53         if ( $menu_obj && ! is_wp_error( $menu_obj ) && ! empty( $menu_obj->term_id ) )
     53        if (
     54                $menu_obj &&
     55                ! is_wp_error( $menu_obj ) &&
     56                ! empty( $menu_obj->taxonomy ) &&
     57                'nav_menu' == $menu_obj->taxonomy
     58        )
    5459                return true;
    5560       
    5661        return false;
     
    143148 *
    144149 * @param int $menu_id The ID of the menu
    145150 * @param array $menu_data The array of menu data.
    146  * @return int The menu's ID.
     151 * @return int|error object The menu's ID or WP_Error object.
    147152 */
    148153function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {
    149154        $menu_id = (int) $menu_id;
     
    155160                $_menu = wp_create_nav_menu( $menu_data['menu-name'] );
    156161        }
    157162
    158         if ( $_menu && isset( $_menu->term_id ) && ! is_wp_error( $_menu ) ) {
     163        if ( is_wp_error( $_menu ) ) {
     164                return $_menu;
     165        }
     166
     167        if ( $_menu && isset( $_menu->term_id ) ) {
    159168                $args = array(
    160169                        'description' => ( isset( $menu_data['description'] ) ? $menu_data['description'] : '' ),
    161170                        'name' => ( isset( $menu_data['menu-name'] ) ? $menu_data['menu-name'] : '' ),
     
    169178
    170179                if ( ! is_wp_error( $update_response ) ) {
    171180                        return $menu_id;
     181                } else {
     182                        return $update_response;
    172183                }
    173184        } else {
    174185                return 0;
     
    237248                }
    238249        }
    239250       
     251        if ( 'custom' != $args['menu-item-type'] ) {
     252                /* if non-custom menu item, then:
     253                        * use original object's URL
     254                        * blank default title to sync with original object's
     255                */
     256
     257                $args['menu-item-url'] = '';
     258
     259                $original_title = '';
     260                if ( 'taxonomy' == $args['menu-item-type'] ) {
     261                        $original_title = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );
     262                } elseif ( 'post_type' == $args['menu-item-type'] ) {
     263                        $original_object = get_post( $args['menu-item-object-id'] );
     264                        $original_title = $original_object->post_title;
     265                }
     266
     267                if ( empty( $args['menu-item-title'] ) || $args['menu-item-title'] == $original_title ) {
     268                        $args['menu-item-title'] = '';
     269
     270                        // hack to get wp to create a post object when too many properties are empty
     271                        if ( empty( $args['menu-item-description'] ) ) {
     272                                $args['menu-item-description'] = ' ';
     273                        }
     274                }
     275        }
     276
    240277        // Populate the menu item object
    241278        $post = array(
    242279                'menu_order' => $args['menu-item-position'],
     
    363400
    364401                $items = get_posts( $args );
    365402
     403                if ( is_wp_error( $items ) || ! is_array( $items ) ) {
     404                        return false;
     405                }
     406
     407                $items = array_map( 'wp_setup_nav_menu_item', $items );
     408
    366409                if ( ARRAY_A == $args['output'] ) {
    367410                        $GLOBALS['_menu_item_sort_prop'] = $args['output_key'];
    368411                        usort($items, '_sort_nav_menu_items');
     
    410453                                $object = get_post_type_object( $menu_item->object );
    411454                                $menu_item->append = $object->singular_label;
    412455                                $menu_item->url = get_permalink( $menu_item->object_id );
     456                       
     457                                $original_object = get_post( $menu_item->object_id );
     458                                $original_title = $original_object->post_title;
     459                                $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
    413460
    414461                        } elseif ( 'taxonomy' == $menu_item->type ) {
    415462                                $object = get_taxonomy( $menu_item->object );
    416463                                $menu_item->append = $object->singular_label;
    417464                                $menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object );
    418465
     466                                $original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' );
     467                                $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
     468
    419469                        } else {
    420470                                $menu_item->append = __('Custom');
     471                                $menu_item->title = $menu_item->post_title;
    421472                                $menu_item->url = get_post_meta( $menu_item->ID, '_menu_item_url', true );
    422473                        }
    423474                       
    424                         $menu_item->title = $menu_item->post_title;
    425475                        $menu_item->target = get_post_meta( $menu_item->ID, '_menu_item_target', true );
    426476
    427477                        $menu_item->attr_title = strip_tags( $menu_item->post_excerpt );
  • wp-admin/includes/nav-menu.php

     
    305305function wp_nav_menu_post_type_meta_boxes() {
    306306        $post_types = get_post_types( array( 'public' => true ), 'object' );
    307307
    308         if ( !$post_types )
     308        if ( ! $post_types )
    309309                return;
    310310
    311311        foreach ( $post_types as $post_type ) {
    312                 $id = $post_type->name;
    313                 add_meta_box( "add-{$id}", $post_type->label, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
     312                $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
     313                if ( $post_type ) {
     314                        $id = $post_type->name;
     315                        add_meta_box( "add-{$id}", $post_type->label, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
     316                }
    314317        }
    315318}
    316319
     
    326329                return;
    327330
    328331        foreach ( $taxonomies as $tax ) {
    329                 $id = $tax->name;
    330                 add_meta_box( "add-{$id}", $tax->label, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
     332                $tax = apply_filters( 'nav_menu_meta_box_object', $tax );
     333                if ( $tax ) {
     334                        $id = $tax->name;
     335                        add_meta_box( "add-{$id}", $tax->label, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
     336                }
    331337        }
    332338}
    333339
     
    364370        <div class="customlinkdiv">
    365371                <ul id="customlink-tabs" class="customlink-tabs add-menu-item-tabs">
    366372                        <li <?php echo ( 'create' == $current_tab ? ' class="tabs"' : '' ); ?>><a class="menu-tab-link" href="<?php echo add_query_arg('customlink-tab', 'create', remove_query_arg($removed_args)); ?>#tabs-panel-create-custom"><?php _e('Create New'); ?></a></li>
    367                         <li <?php echo ( 'all' == $current_tab ? ' class="tabs"' : '' ); ?>><a class="menu-tab-link" href="<?php echo add_query_arg('customlink-tab', 'all', remove_query_arg($removed_args)); ?>#tabs-panel-all-custom"><?php _e('View All'); ?></a></li>
    368373                </ul>
    369374
    370375                <div class="tabs-panel <?php
     
    386391                        </p>
    387392                </div><!-- /.tabs-panel -->
    388393
    389                 <div class="tabs-panel <?php
    390                         echo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );
    391                 ?>" id="tabs-panel-all-custom">
    392                         <ul id="customlinkchecklist" class="list:customlink customlinkchecklist form-no-clear">
    393                                 <?php
    394                                 $args['walker'] = new Walker_Nav_Menu_Checklist;
    395                                 echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $links), 0, (object) $args );
    396                                 ?>
    397                         </ul>
    398                 </div><!-- /.tabs-panel -->
    399 
    400394                <p class="button-controls">
    401395                        <span class="add-to-menu">
    402396                                <input type="submit" class="button-secondary" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" />
     
    433427                'suppress_filters' => true,
    434428        );
    435429
     430        if ( isset( $post_type['args']->_default_query ) ) {
     431                $args = array_merge($args, (array) $post_type['args']->_default_query );
     432        }
     433
    436434        // @todo transient caching of these results with proper invalidation on updating of a post of this type
    437435        $get_posts = new WP_Query;
    438436        $posts = $get_posts->query( $args );
     
    810808}
    811809
    812810/**
     811 * Adds custom arguments to some of the meta box object types.
     812 *
     813 * @since 3.0.0
     814 *
     815 * @access private
     816 *
     817 * @param object $object The post type or taxonomy meta-object.
     818 * @return object The post type of taxonomy object.
     819 */
     820function _wp_nav_menu_meta_box_object( $object = null ) {
     821        if ( isset( $object->name ) ) {
     822                // don't show media meta box
     823                if ( 'attachment' == $object->name ) {
     824                        return false;
     825                }
     826       
     827                // pages should show most recent
     828                if ( 'page' == $object->name ) {
     829                        $object->_default_query = array(
     830                                'orderby' => 'post_date',
     831                                'order' => 'DESC',
     832                                'post_status' => 'publish',
     833                        );
     834
     835                // posts should show only published items
     836                } elseif ( 'post' == $object->name ) {
     837                        $object->_default_query = array(
     838                                'post_status' => 'publish',
     839                        );
     840
     841                // cats should be in reverse chronological order
     842                } elseif ( 'category' == $object->name ) {
     843                        $object->_default_query = array(
     844                                'orderby' => 'id',
     845                                'order' => 'DESC',
     846                        );
     847                }
     848        }
     849       
     850        return $object;
     851}
     852
     853/**
    813854 * Returns the menu item formatted to edit.
    814855 *
    815856 * @since 3.0.0
  • wp-admin/js/nav-menu.dev.js

     
    159159                if ( ! list )
    160160                        return;
    161161
    162                 var menuListItems = list.getElementsByTagName('li'),
     162                var dummyListItem = document.getElementById(list.id + '-dummy-list-item'),
     163                menuListItems = list.getElementsByTagName('li'),
    163164                i = menuListItems.length;
     165
     166                if ( ! dummyListItem ) {
     167                        dummyListItem = document.createElement('li');
     168                        dummyListItem.id = list.id + '-dummy-list-item';
     169                        list.appendChild(dummyListItem);
     170                        this.setupListItemDragAndDrop(dummyListItem);
     171                }
    164172               
    165173                while ( i-- )
    166174                        this.setupListItemDragAndDrop(menuListItems[i]);
     
    234242                attachTabsPanelListeners : function() {
    235243                        $('#menu-settings-column').bind('click', function(e) {
    236244                                if ( e.target && e.target.className && -1 != e.target.className.indexOf('menu-tab-link') ) {
    237                                         var i = e.target.parentNode,
    238                                         activePanel,
     245                                        var activePanel,
    239246                                        panelIdMatch = /#(.*)$/.exec(e.target.href),
    240                                         tabPanels;
    241                                         while ( ! i.className || -1 == i.className.indexOf('inside') ) {
    242                                                 i = i.parentNode;
    243                                         }
    244                                         $('.tabs-panel', i).each(function() {
     247                                        tabPanels,
     248                                        wrapper = getParentWrapper(e.target, 'inside'),
     249                                        inputs = wrapper ? wrapper.getElementsByTagName('input') : [],
     250                                        i = inputs.length;
     251
     252                                        // upon changing tabs, we want to uncheck all checkboxes
     253                                        while( i-- )
     254                                                inputs[i].checked = false;
     255
     256                                        $('.tabs-panel', wrapper).each(function() {
    245257                                                if ( this.className )
    246258                                                        this.className = this.className.replace('tabs-panel-active', 'tabs-panel-inactive');
    247259                                        });
    248260
    249                                         $('.tabs', i).each(function() {
     261                                        $('.tabs', wrapper).each(function() {
    250262                                                this.className = this.className.replace('tabs', '');
    251263                                        });
    252264
     
    396408                                        if ( that != currentDropzone || ( ! activeHovering && that.className && -1 != that.className.indexOf('sortable-placeholder') ) ) {
    397409                                                that.className = that.className.replace(/sortable-placeholder/g, '');
    398410                                        }
    399                                 }, 500);
     411                                }, 800);
    400412                        })(dropEl);
    401413                },
    402414
     
    563575                        if ( ! req )
    564576                                req = {};
    565577                        var dropZone,
     578                        dummyListItem = document.getElementById(menuList.id + '-dummy-list-item'),
    566579                        i,
    567580                        listElements,
    568581                        wrap = document.createElement('ul');
     
    572585                        i = listElements.length;
    573586                        while ( i-- ) {
    574587                                this.setupListItemDragAndDrop(listElements[i]);
    575                                 menuList.appendChild(listElements[i]);
     588                                if ( dummyListItem )
     589                                        menuList.insertBefore(listElements[i], dummyListItem);
     590                                else
     591                                        menuList.appendChild(listElements[i]);
    576592                        }
    577593
     594                        this.recalculateSortOrder(menuList);
     595
    578596                        /* set custom link form back to defaults */
    579597                        if ( customLinkNameInput && customLinkURLInput ) {
    580598                                customLinkNameInput.value = customLinkNameDefault;