Changeset 42343 for trunk/src/wp-includes/class-wp-customize-nav-menus.php
- Timestamp:
- 11/30/2017 11:09:33 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-customize-nav-menus.php
r42148 r42343 43 43 */ 44 44 public function __construct( $manager ) { 45 $this->manager = $manager;45 $this->manager = $manager; 46 46 $this->original_nav_menu_locations = get_nav_menu_locations(); 47 47 … … 96 96 } 97 97 98 $all_items = array();98 $all_items = array(); 99 99 $item_types = array(); 100 100 if ( isset( $_POST['item_types'] ) && is_array( $_POST['item_types'] ) ) { … … 102 102 } elseif ( isset( $_POST['type'] ) && isset( $_POST['object'] ) ) { // Back compat. 103 103 $item_types[] = array( 104 'type' => wp_unslash( $_POST['type'] ),104 'type' => wp_unslash( $_POST['type'] ), 105 105 'object' => wp_unslash( $_POST['object'] ), 106 'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ),106 'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ), 107 107 ); 108 108 } else { … … 114 114 wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); 115 115 } 116 $type = sanitize_key( $item_type['type'] );116 $type = sanitize_key( $item_type['type'] ); 117 117 $object = sanitize_key( $item_type['object'] ); 118 $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] );119 $items = $this->load_available_items_query( $type, $object, $page );118 $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] ); 119 $items = $this->load_available_items_query( $type, $object, $page ); 120 120 if ( is_wp_error( $items ) ) { 121 121 wp_send_json_error( $items->get_error_code() ); … … 180 180 } 181 181 182 $posts = array_merge( $posts, get_posts( array( 183 'numberposts' => 10, 184 'offset' => 10 * $page, 185 'orderby' => 'date', 186 'order' => 'DESC', 187 'post_type' => $object, 188 ) ) ); 182 $posts = array_merge( 183 $posts, get_posts( 184 array( 185 'numberposts' => 10, 186 'offset' => 10 * $page, 187 'orderby' => 'date', 188 'order' => 'DESC', 189 'post_type' => $object, 190 ) 191 ) 192 ); 189 193 190 194 foreach ( $posts as $post ) { … … 205 209 } 206 210 } elseif ( 'taxonomy' === $type ) { 207 $terms = get_terms( $object, array( 208 'child_of' => 0, 209 'exclude' => '', 210 'hide_empty' => false, 211 'hierarchical' => 1, 212 'include' => '', 213 'number' => 10, 214 'offset' => 10 * $page, 215 'order' => 'DESC', 216 'orderby' => 'count', 217 'pad_counts' => false, 218 ) ); 211 $terms = get_terms( 212 $object, array( 213 'child_of' => 0, 214 'exclude' => '', 215 'hide_empty' => false, 216 'hierarchical' => 1, 217 'include' => '', 218 'number' => 10, 219 'offset' => 10 * $page, 220 'order' => 'DESC', 221 'orderby' => 'count', 222 'pad_counts' => false, 223 ) 224 ); 219 225 if ( is_wp_error( $terms ) ) { 220 226 return $terms; … … 270 276 } 271 277 272 $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); 273 $items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) ); 278 $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); 279 $items = $this->search_available_items_query( 280 array( 281 'pagenum' => $p, 282 's' => $s, 283 ) 284 ); 274 285 275 286 if ( empty( $items ) ) { … … 294 305 295 306 $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); 296 $query = array(307 $query = array( 297 308 'post_type' => array_keys( $post_type_objects ), 298 309 'suppress_filters' => true, … … 315 326 $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); 316 327 if ( 1 === $args['pagenum'] && $nav_menus_created_posts_setting && count( $nav_menus_created_posts_setting ) > 0 ) { 317 $stub_post_query = new WP_Query( array_merge( 318 $query, 319 array( 320 'post_status' => 'auto-draft', 321 'post__in' => $nav_menus_created_posts_setting->value(), 322 'posts_per_page' => -1, 328 $stub_post_query = new WP_Query( 329 array_merge( 330 $query, 331 array( 332 'post_status' => 'auto-draft', 333 'post__in' => $nav_menus_created_posts_setting->value(), 334 'posts_per_page' => -1, 335 ) 323 336 ) 324 ) );325 $posts = array_merge( $posts, $stub_post_query->posts );337 ); 338 $posts = array_merge( $posts, $stub_post_query->posts ); 326 339 } 327 340 328 341 // Query posts. 329 342 $get_posts = new WP_Query( $query ); 330 $posts = array_merge( $posts, $get_posts->posts );343 $posts = array_merge( $posts, $get_posts->posts ); 331 344 332 345 // Create items for posts. … … 350 363 // Query taxonomy terms. 351 364 $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'names' ); 352 $terms = get_terms( $taxonomies, array( 353 'name__like' => $args['s'], 354 'number' => 20, 355 'offset' => 20 * ($args['pagenum'] - 1), 356 ) ); 365 $terms = get_terms( 366 $taxonomies, array( 367 'name__like' => $args['s'], 368 'number' => 20, 369 'offset' => 20 * ( $args['pagenum'] - 1 ), 370 ) 371 ); 357 372 358 373 // Check if any taxonomies were found. … … 406 421 // Pass data to JS. 407 422 $settings = array( 408 'allMenus' => wp_get_nav_menus(),409 'itemTypes' => $this->available_item_types(),410 'l10n' => array(423 'allMenus' => wp_get_nav_menus(), 424 'itemTypes' => $this->available_item_types(), 425 'l10n' => array( 411 426 'untitled' => _x( '(no label)', 'missing menu item navigation label' ), 412 427 'unnamed' => _x( '(unnamed)', 'Missing menu name.' ), … … 441 456 'reorderLabelOff' => esc_attr__( 'Close reorder mode' ), 442 457 ), 443 'settingTransport' => 'postMessage',444 'phpIntMax' => PHP_INT_MAX,445 'defaultSettingValues' => array(458 'settingTransport' => 'postMessage', 459 'phpIntMax' => PHP_INT_MAX, 460 'defaultSettingValues' => array( 446 461 'nav_menu' => $temp_nav_menu_setting->default, 447 462 'nav_menu_item' => $temp_nav_menu_item_setting->default, … … 456 471 $nav_menus_l10n = array( 457 472 'oneThemeLocationNoMenus' => null, 458 'moveUp' => __( 'Move up one' ),459 'moveDown' => __( 'Move down one' ),460 'moveToTop' => __( 'Move to the top' ),473 'moveUp' => __( 'Move up one' ), 474 'moveDown' => __( 'Move down one' ), 475 'moveToTop' => __( 'Move to the top' ), 461 476 /* translators: %s: previous item name */ 462 'moveUnder' => __( 'Move under %s' ),477 'moveUnder' => __( 'Move under %s' ), 463 478 /* translators: %s: previous item name */ 464 'moveOutFrom' => __( 'Move out from under %s' ),479 'moveOutFrom' => __( 'Move out from under %s' ), 465 480 /* translators: %s: previous item name */ 466 'under' => __( 'Under %s' ),481 'under' => __( 'Under %s' ), 467 482 /* translators: %s: previous item name */ 468 'outFrom' => __( 'Out from under %s' ),483 'outFrom' => __( 'Out from under %s' ), 469 484 /* translators: 1: item name, 2: item position, 3: total number of items */ 470 'menuFocus' => __( '%1$s. Menu item %2$d of %3$d.' ),485 'menuFocus' => __( '%1$s. Menu item %2$d of %3$d.' ), 471 486 /* translators: 1: item name, 2: item position, 3: parent item name */ 472 'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ),487 'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ), 473 488 ); 474 489 wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n ); … … 562 577 $description .= '<p>' . __( 'Menus can be displayed in locations defined by your theme.' ) . '</p>'; 563 578 } 564 $this->manager->add_panel( new WP_Customize_Nav_Menus_Panel( $this->manager, 'nav_menus', array( 565 'title' => __( 'Menus' ), 566 'description' => $description, 567 'priority' => 100, 568 // 'theme_supports' => 'menus|widgets', @todo allow multiple theme supports 569 ) ) ); 579 $this->manager->add_panel( 580 new WP_Customize_Nav_Menus_Panel( 581 $this->manager, 'nav_menus', array( 582 'title' => __( 'Menus' ), 583 'description' => $description, 584 'priority' => 100, 585 // 'theme_supports' => 'menus|widgets', @todo allow multiple theme supports 586 ) 587 ) 588 ); 570 589 $menus = wp_get_nav_menus(); 571 590 … … 585 604 } 586 605 587 $this->manager->add_section( 'menu_locations', array( 588 'title' => 1 === $num_locations ? _x( 'View Location', 'menu locations' ) : _x( 'View All Locations', 'menu locations' ), 589 'panel' => 'nav_menus', 590 'priority' => 30, 591 'description' => $description, 592 ) ); 606 $this->manager->add_section( 607 'menu_locations', array( 608 'title' => 1 === $num_locations ? _x( 'View Location', 'menu locations' ) : _x( 'View All Locations', 'menu locations' ), 609 'panel' => 'nav_menus', 610 'priority' => 30, 611 'description' => $description, 612 ) 613 ); 593 614 594 615 $choices = array( '0' => __( '— Select —' ) ); … … 619 640 add_filter( "customize_sanitize_{$setting_id}", array( $this, 'intval_base10' ) ); 620 641 } else { 621 $this->manager->add_setting( $setting_id, array( 622 'sanitize_callback' => array( $this, 'intval_base10' ), 623 'theme_supports' => 'menus', 624 'type' => 'theme_mod', 625 'transport' => 'postMessage', 626 'default' => 0, 627 ) ); 642 $this->manager->add_setting( 643 $setting_id, array( 644 'sanitize_callback' => array( $this, 'intval_base10' ), 645 'theme_supports' => 'menus', 646 'type' => 'theme_mod', 647 'transport' => 'postMessage', 648 'default' => 0, 649 ) 650 ); 628 651 } 629 652 … … 633 656 } 634 657 635 $this->manager->add_control( new WP_Customize_Nav_Menu_Location_Control( $this->manager, $setting_id, array( 636 'label' => $description, 637 'location_id' => $location, 638 'section' => 'menu_locations', 639 'choices' => $choices, 640 ) ) ); 658 $this->manager->add_control( 659 new WP_Customize_Nav_Menu_Location_Control( 660 $this->manager, $setting_id, array( 661 'label' => $description, 662 'location_id' => $location, 663 'section' => 'menu_locations', 664 'choices' => $choices, 665 ) 666 ) 667 ); 641 668 } 642 669 … … 647 674 // Create a section for each menu. 648 675 $section_id = 'nav_menu[' . $menu_id . ']'; 649 $this->manager->add_section( new WP_Customize_Nav_Menu_Section( $this->manager, $section_id, array( 650 'title' => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 651 'priority' => 10, 652 'panel' => 'nav_menus', 653 ) ) ); 676 $this->manager->add_section( 677 new WP_Customize_Nav_Menu_Section( 678 $this->manager, $section_id, array( 679 'title' => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 680 'priority' => 10, 681 'panel' => 'nav_menus', 682 ) 683 ) 684 ); 654 685 655 686 $nav_menu_setting_id = 'nav_menu[' . $menu_id . ']'; 656 $this->manager->add_setting( new WP_Customize_Nav_Menu_Setting( $this->manager, $nav_menu_setting_id, array( 657 'transport' => 'postMessage', 658 ) ) ); 687 $this->manager->add_setting( 688 new WP_Customize_Nav_Menu_Setting( 689 $this->manager, $nav_menu_setting_id, array( 690 'transport' => 'postMessage', 691 ) 692 ) 693 ); 659 694 660 695 // Add the menu contents. … … 672 707 673 708 $value['nav_menu_term_id'] = $menu_id; 674 $this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array( 675 'value' => $value, 676 'transport' => 'postMessage', 677 ) ) ); 709 $this->manager->add_setting( 710 new WP_Customize_Nav_Menu_Item_Setting( 711 $this->manager, $menu_item_setting_id, array( 712 'value' => $value, 713 'transport' => 'postMessage', 714 ) 715 ) 716 ); 678 717 679 718 // Create a control for each menu item. 680 $this->manager->add_control( new WP_Customize_Nav_Menu_Item_Control( $this->manager, $menu_item_setting_id, array( 681 'label' => $item->title, 682 'section' => $section_id, 683 'priority' => 10 + $i, 684 ) ) ); 719 $this->manager->add_control( 720 new WP_Customize_Nav_Menu_Item_Control( 721 $this->manager, $menu_item_setting_id, array( 722 'label' => $item->title, 723 'section' => $section_id, 724 'priority' => 10 + $i, 725 ) 726 ) 727 ); 685 728 } 686 729 … … 689 732 690 733 // Add the add-new-menu section and controls. 691 $this->manager->add_section( 'add_menu', array( 692 'type' => 'new_menu', 693 'title' => __( 'New Menu' ), 694 'panel' => 'nav_menus', 695 'priority' => 20, 696 ) ); 697 698 $this->manager->add_setting( new WP_Customize_Filter_Setting( $this->manager, 'nav_menus_created_posts', array( 699 'transport' => 'postMessage', 700 'type' => 'option', // To prevent theme prefix in changeset. 701 'default' => array(), 702 'sanitize_callback' => array( $this, 'sanitize_nav_menus_created_posts' ), 703 ) ) ); 734 $this->manager->add_section( 735 'add_menu', array( 736 'type' => 'new_menu', 737 'title' => __( 'New Menu' ), 738 'panel' => 'nav_menus', 739 'priority' => 20, 740 ) 741 ); 742 743 $this->manager->add_setting( 744 new WP_Customize_Filter_Setting( 745 $this->manager, 'nav_menus_created_posts', array( 746 'transport' => 'postMessage', 747 'type' => 'option', // To prevent theme prefix in changeset. 748 'default' => array(), 749 'sanitize_callback' => array( $this, 'sanitize_nav_menus_created_posts' ), 750 ) 751 ) 752 ); 704 753 } 705 754 … … 734 783 foreach ( $post_types as $slug => $post_type ) { 735 784 $item_types[] = array( 736 'title' => $post_type->labels->name,785 'title' => $post_type->labels->name, 737 786 'type_label' => $post_type->labels->singular_name, 738 'type' => 'post_type',739 'object' => $post_type->name,787 'type' => 'post_type', 788 'object' => $post_type->name, 740 789 ); 741 790 } … … 749 798 } 750 799 $item_types[] = array( 751 'title' => $taxonomy->labels->name,800 'title' => $taxonomy->labels->name, 752 801 'type_label' => $taxonomy->labels->singular_name, 753 'type' => 'taxonomy',754 'object' => $taxonomy->name,802 'type' => 'taxonomy', 803 'object' => $taxonomy->name, 755 804 ); 756 805 } … … 778 827 * Post array. Note that post_status is overridden to be `auto-draft`. 779 828 * 780 * @var string $post_title Post title. Required.781 * @var string $post_type Post type. Required.782 * @var string $post_name Post name.783 * @var string $post_content Post content.829 * @var string $post_title Post title. Required. 830 * @var string $post_type Post type. Required. 831 * @var string $post_name Post name. 832 * @var string $post_content Post content. 784 833 * } 785 834 * @return WP_Post|WP_Error Inserted auto-draft post object or error. … … 810 859 } 811 860 $postarr['meta_input']['_customize_draft_post_name'] = $postarr['post_name']; 812 $postarr['meta_input']['_customize_changeset_uuid'] = $this->manager->changeset_uuid();861 $postarr['meta_input']['_customize_changeset_uuid'] = $this->manager->changeset_uuid(); 813 862 unset( $postarr['post_name'] ); 814 863 … … 842 891 } 843 892 844 $params = wp_unslash( $_POST['params'] );893 $params = wp_unslash( $_POST['params'] ); 845 894 $illegal_params = array_diff( array_keys( $params ), array( 'post_type', 'post_title' ) ); 846 895 if ( ! empty( $illegal_params ) ) { … … 850 899 $params = array_merge( 851 900 array( 852 'post_type' => '',901 'post_type' => '', 853 902 'post_title' => '', 854 903 ), … … 915 964 </span> 916 965 <button type="button" class="button-link item-add"> 917 <span class="screen-reader-text"><?php 966 <span class="screen-reader-text"> 967 <?php 918 968 /* translators: 1: Title of a menu item, 2: Type of a menu item */ 919 969 printf( __( 'Add to menu: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.type_label }}' ); 920 ?></span> 970 ?> 971 </span> 921 972 </button> 922 973 </div> … … 998 1049 <div class="accordion-section-title"> 999 1050 <label class="screen-reader-text" for="menu-items-search"><?php _e( 'Search Menu Items' ); ?></label> 1000 <input type="text" id="menu-items-search" placeholder="<?php esc_attr_e( 'Search menu items…' ) ?>" aria-describedby="menu-items-search-desc" />1051 <input type="text" id="menu-items-search" placeholder="<?php esc_attr_e( 'Search menu items…' ); ?>" aria-describedby="menu-items-search-desc" /> 1001 1052 <p class="screen-reader-text" id="menu-items-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> 1002 1053 <span class="spinner"></span> … … 1009 1060 1010 1061 // Ensure the page post type comes first in the list. 1011 $item_types = $this->available_item_types();1062 $item_types = $this->available_item_types(); 1012 1063 $page_item_type = null; 1013 1064 foreach ( $item_types as $i => $item_type ) { … … 1050 1101 <span class="no-items"><?php _e( 'No items' ); ?></span> 1051 1102 <button type="button" class="button-link" aria-expanded="false"> 1052 <span class="screen-reader-text"><?php 1103 <span class="screen-reader-text"> 1104 <?php 1053 1105 /* translators: %s: Title of a section with menu items */ 1054 printf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); ?></span> 1106 printf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); 1107 ?> 1108 </span> 1055 1109 <span class="toggle-indicator" aria-hidden="true"></span> 1056 1110 </button> … … 1232 1286 1233 1287 $target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish'; 1234 $args = array(1235 'ID' => $post_id,1288 $args = array( 1289 'ID' => $post_id, 1236 1290 'post_status' => $target_status, 1237 1291 ); 1238 $post_name = get_post_meta( $post_id, '_customize_draft_post_name', true );1292 $post_name = get_post_meta( $post_id, '_customize_draft_post_name', true ); 1239 1293 if ( $post_name ) { 1240 1294 $args['post_name'] = $post_name; … … 1295 1349 if ( ! $can_partial_refresh ) { 1296 1350 $exported_args['fallback_cb'] = ''; 1297 $exported_args['walker'] = '';1351 $exported_args['walker'] = ''; 1298 1352 } 1299 1353 … … 1309 1363 $exported_args['args_hmac'] = $this->hash_nav_menu_args( $exported_args ); 1310 1364 1311 $args['customize_preview_nav_menus_args'] = $exported_args;1365 $args['customize_preview_nav_menus_args'] = $exported_args; 1312 1366 $this->preview_nav_menu_instance_args[ $exported_args['args_hmac'] ] = $exported_args; 1313 1367 return $args; … … 1329 1383 public function filter_wp_nav_menu( $nav_menu_content, $args ) { 1330 1384 if ( isset( $args->customize_preview_nav_menus_args['can_partial_refresh'] ) && $args->customize_preview_nav_menus_args['can_partial_refresh'] ) { 1331 $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'nav_menu_instance[' . $args->customize_preview_nav_menus_args['args_hmac'] . ']' ) );1332 $attributes .= ' data-customize-partial-type="nav_menu_instance"';1333 $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $args->customize_preview_nav_menus_args ) ) );1385 $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'nav_menu_instance[' . $args->customize_preview_nav_menus_args['args_hmac'] . ']' ) ); 1386 $attributes .= ' data-customize-partial-type="nav_menu_instance"'; 1387 $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $args->customize_preview_nav_menus_args ) ) ); 1334 1388 $nav_menu_content = preg_replace( '#^(<\w+)#', '$1 ' . str_replace( '\\', '\\\\', $attributes ), $nav_menu_content, 1 ); 1335 1389 }
Note: See TracChangeset
for help on using the changeset viewer.