Ticket #13148: menu_item_api_and_fixes.13148.diff
| File menu_item_api_and_fixes.13148.diff, 13.5 KB (added by , 16 years ago) |
|---|
-
wp-includes/default-filters.php
169 169 add_filter( 'comments_open', '_close_comments_for_old_post', 10, 2 ); 170 170 add_filter( 'pings_open', '_close_comments_for_old_post', 10, 2 ); 171 171 add_filter( 'editable_slug', 'urldecode' ); 172 add_filter( 'nav_menu_meta_box_object','_wp_nav_menu_meta_box_object' ); 172 173 173 174 // Atom SSL support 174 175 add_filter( 'atom_service_url','atom_service_url_filter' ); -
wp-includes/nav-menu-template.php
136 136 $_placeholder = 0 > $_placeholder ? $_placeholder - 1 : -1; 137 137 $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_placeholder; 138 138 $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; 139 140 140 141 $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; 141 142 … … 147 148 // Menu item hidden fields 148 149 $output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />'; 149 150 $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 .'" />'; 151 152 $output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="'. esc_attr( $item->type ) .'" />'; 152 153 $output .= '<input type="hidden" class="menu-item-append" name="menu-item[' . $possible_object_id . '][menu-item-append]" value="'. esc_attr( $item->append ) .'" />'; 153 154 $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
50 50 51 51 $menu_obj = wp_get_nav_menu_object( $menu ); 52 52 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 ) 54 59 return true; 55 60 56 61 return false; … … 143 148 * 144 149 * @param int $menu_id The ID of the menu 145 150 * @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. 147 152 */ 148 153 function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) { 149 154 $menu_id = (int) $menu_id; … … 155 160 $_menu = wp_create_nav_menu( $menu_data['menu-name'] ); 156 161 } 157 162 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 ) ) { 159 168 $args = array( 160 169 'description' => ( isset( $menu_data['description'] ) ? $menu_data['description'] : '' ), 161 170 'name' => ( isset( $menu_data['menu-name'] ) ? $menu_data['menu-name'] : '' ), … … 169 178 170 179 if ( ! is_wp_error( $update_response ) ) { 171 180 return $menu_id; 181 } else { 182 return $update_response; 172 183 } 173 184 } else { 174 185 return 0; … … 237 248 } 238 249 } 239 250 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 240 277 // Populate the menu item object 241 278 $post = array( 242 279 'menu_order' => $args['menu-item-position'], … … 363 400 364 401 $items = get_posts( $args ); 365 402 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 366 409 if ( ARRAY_A == $args['output'] ) { 367 410 $GLOBALS['_menu_item_sort_prop'] = $args['output_key']; 368 411 usort($items, '_sort_nav_menu_items'); … … 410 453 $object = get_post_type_object( $menu_item->object ); 411 454 $menu_item->append = $object->singular_label; 412 455 $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; 413 460 414 461 } elseif ( 'taxonomy' == $menu_item->type ) { 415 462 $object = get_taxonomy( $menu_item->object ); 416 463 $menu_item->append = $object->singular_label; 417 464 $menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object ); 418 465 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 419 469 } else { 420 470 $menu_item->append = __('Custom'); 471 $menu_item->title = $menu_item->post_title; 421 472 $menu_item->url = get_post_meta( $menu_item->ID, '_menu_item_url', true ); 422 473 } 423 474 424 $menu_item->title = $menu_item->post_title;425 475 $menu_item->target = get_post_meta( $menu_item->ID, '_menu_item_target', true ); 426 476 427 477 $menu_item->attr_title = strip_tags( $menu_item->post_excerpt ); -
wp-admin/includes/nav-menu.php
305 305 function wp_nav_menu_post_type_meta_boxes() { 306 306 $post_types = get_post_types( array( 'public' => true ), 'object' ); 307 307 308 if ( ! $post_types )308 if ( ! $post_types ) 309 309 return; 310 310 311 311 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 } 314 317 } 315 318 } 316 319 … … 326 329 return; 327 330 328 331 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 } 331 337 } 332 338 } 333 339 … … 364 370 <div class="customlinkdiv"> 365 371 <ul id="customlink-tabs" class="customlink-tabs add-menu-item-tabs"> 366 372 <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>368 373 </ul> 369 374 370 375 <div class="tabs-panel <?php … … 386 391 </p> 387 392 </div><!-- /.tabs-panel --> 388 393 389 <div class="tabs-panel <?php390 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 <?php394 $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 400 394 <p class="button-controls"> 401 395 <span class="add-to-menu"> 402 396 <input type="submit" class="button-secondary" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" /> … … 433 427 'suppress_filters' => true, 434 428 ); 435 429 430 if ( isset( $post_type['args']->_default_query ) ) { 431 $args = array_merge($args, (array) $post_type['args']->_default_query ); 432 } 433 436 434 // @todo transient caching of these results with proper invalidation on updating of a post of this type 437 435 $get_posts = new WP_Query; 438 436 $posts = $get_posts->query( $args ); … … 810 808 } 811 809 812 810 /** 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 */ 820 function _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 /** 813 854 * Returns the menu item formatted to edit. 814 855 * 815 856 * @since 3.0.0 -
wp-admin/js/nav-menu.dev.js
159 159 if ( ! list ) 160 160 return; 161 161 162 var menuListItems = list.getElementsByTagName('li'), 162 var dummyListItem = document.getElementById(list.id + '-dummy-list-item'), 163 menuListItems = list.getElementsByTagName('li'), 163 164 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 } 164 172 165 173 while ( i-- ) 166 174 this.setupListItemDragAndDrop(menuListItems[i]); … … 234 242 attachTabsPanelListeners : function() { 235 243 $('#menu-settings-column').bind('click', function(e) { 236 244 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, 239 246 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() { 245 257 if ( this.className ) 246 258 this.className = this.className.replace('tabs-panel-active', 'tabs-panel-inactive'); 247 259 }); 248 260 249 $('.tabs', i).each(function() {261 $('.tabs', wrapper).each(function() { 250 262 this.className = this.className.replace('tabs', ''); 251 263 }); 252 264 … … 396 408 if ( that != currentDropzone || ( ! activeHovering && that.className && -1 != that.className.indexOf('sortable-placeholder') ) ) { 397 409 that.className = that.className.replace(/sortable-placeholder/g, ''); 398 410 } 399 }, 500);411 }, 800); 400 412 })(dropEl); 401 413 }, 402 414 … … 563 575 if ( ! req ) 564 576 req = {}; 565 577 var dropZone, 578 dummyListItem = document.getElementById(menuList.id + '-dummy-list-item'), 566 579 i, 567 580 listElements, 568 581 wrap = document.createElement('ul'); … … 572 585 i = listElements.length; 573 586 while ( i-- ) { 574 587 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]); 576 592 } 577 593 594 this.recalculateSortOrder(menuList); 595 578 596 /* set custom link form back to defaults */ 579 597 if ( customLinkNameInput && customLinkURLInput ) { 580 598 customLinkNameInput.value = customLinkNameDefault;
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)