]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-admin/includes/nav-menu.php
WordPress 4.7
[autoinstalls/wordpress.git] / wp-admin / includes / nav-menu.php
index 18dcc97f6c4574b0da29dadc03c00863fded007a..a6aac33053225bec3921425befed2f083e09da0b 100644 (file)
@@ -70,24 +70,36 @@ function _wp_ajax_menu_quick_search( $request = array() ) {
 
        } elseif ( preg_match('/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\b)/', $type, $matches) ) {
                if ( 'posttype' == $matches[1] && get_post_type_object( $matches[2] ) ) {
-                       query_posts(array(
-                               'posts_per_page' => 10,
-                               'post_type' => $matches[2],
-                               's' => $query,
-                       ));
-                       if ( ! have_posts() )
+                       $post_type_obj = _wp_nav_menu_meta_box_object( get_post_type_object( $matches[2] ) );
+                       $args = array_merge(
+                               $args,
+                               array(
+                                       'no_found_rows'          => true,
+                                       'update_post_meta_cache' => false,
+                                       'update_post_term_cache' => false,
+                                       'posts_per_page'         => 10,
+                                       'post_type'              => $matches[2],
+                                       's'                      => $query,
+                               )
+                       );
+                       if ( isset( $post_type_obj->_default_query ) ) {
+                               $args = array_merge( $args, (array) $post_type_obj->_default_query );
+                       }
+                       $search_results_query = new WP_Query( $args );
+                       if ( ! $search_results_query->have_posts() ) {
                                return;
-                       while ( have_posts() ) {
-                               the_post();
+                       }
+                       while ( $search_results_query->have_posts() ) {
+                               $post = $search_results_query->next_post();
                                if ( 'markup' == $response_format ) {
-                                       $var_by_ref = get_the_ID();
+                                       $var_by_ref = $post->ID;
                                        echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $var_by_ref ) ) ), 0, (object) $args );
                                } elseif ( 'json' == $response_format ) {
                                        echo wp_json_encode(
                                                array(
-                                                       'ID' => get_the_ID(),
-                                                       'post_title' => get_the_title(),
-                                                       'post_type' => get_post_type(),
+                                                       'ID' => $post->ID,
+                                                       'post_title' => get_the_title( $post->ID ),
+                                                       'post_type' => $matches[2],
                                                )
                                        );
                                        echo "\n";
@@ -119,7 +131,7 @@ function _wp_ajax_menu_quick_search( $request = array() ) {
 }
 
 /**
- * Register nav menu metaboxes and advanced menu items
+ * Register nav menu meta boxes and advanced menu items.
  *
  * @since 3.0.0
  **/
@@ -174,7 +186,7 @@ function wp_initial_nav_menu_meta_boxes() {
 }
 
 /**
- * Creates metaboxes for any post type menu item.
+ * Creates meta boxes for any post type menu item..
  *
  * @since 3.0.0
  */
@@ -186,7 +198,7 @@ function wp_nav_menu_post_type_meta_boxes() {
 
        foreach ( $post_types as $post_type ) {
                /**
-                * Filter whether a menu items meta box will be added for the current
+                * Filters whether a menu items meta box will be added for the current
                 * object type.
                 *
                 * If a falsey value is returned instead of an object, the menu items
@@ -208,7 +220,7 @@ function wp_nav_menu_post_type_meta_boxes() {
 }
 
 /**
- * Creates metaboxes for any taxonomy menu item.
+ * Creates meta boxes for any taxonomy menu item.
  *
  * @since 3.0.0
  */
@@ -248,7 +260,7 @@ function wp_nav_menu_disabled_check( $nav_menu_selected_id ) {
 }
 
 /**
- * Displays a metabox for the custom links menu item.
+ * Displays a meta box for the custom links menu item.
  *
  * @since 3.0.0
  *
@@ -275,7 +287,7 @@ function wp_nav_menu_item_link_meta_box() {
 
                <p class="button-controls wp-clearfix">
                        <span class="add-to-menu">
-                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-customlinkdiv" />
+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-customlinkdiv" />
                                <span class="spinner"></span>
                        </span>
                </p>
@@ -285,7 +297,7 @@ function wp_nav_menu_item_link_meta_box() {
 }
 
 /**
- * Displays a metabox for a post type menu item.
+ * Displays a meta box for a post type menu item.
  *
  * @since 3.0.0
  *
@@ -293,12 +305,19 @@ function wp_nav_menu_item_link_meta_box() {
  * @global int|string $nav_menu_selected_id
  *
  * @param string $object Not used.
- * @param string $post_type The post type object.
+ * @param array  $box {
+ *     Post type menu item meta box arguments.
+ *
+ *     @type string       $id       Meta box 'id' attribute.
+ *     @type string       $title    Meta box title.
+ *     @type string       $callback Meta box display callback.
+ *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
+ * }
  */
-function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
+function wp_nav_menu_item_post_type_meta_box( $object, $box ) {
        global $_nav_menu_placeholder, $nav_menu_selected_id;
 
-       $post_type_name = $post_type['args']->name;
+       $post_type_name = $box['args']->name;
 
        // Paginate browsing for large numbers of post objects.
        $per_page = 50;
@@ -316,8 +335,8 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                'update_post_meta_cache' => false
        );
 
-       if ( isset( $post_type['args']->_default_query ) )
-               $args = array_merge($args, (array) $post_type['args']->_default_query );
+       if ( isset( $box['args']->_default_query ) )
+               $args = array_merge($args, (array) $box['args']->_default_query );
 
        // @todo transient caching of these results with proper invalidation on updating of a post of this type
        $get_posts = new WP_Query;
@@ -339,9 +358,10 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                        )
                ),
                'format' => '',
-               'prev_text' => __('&laquo;'),
-               'next_text' => __('&raquo;'),
-               'total' => $num_pages,
+               'prev_text'          => '<span aria-label="' . esc_attr__( 'Previous page' ) . '">' . __( '&laquo;' ) . '</span>',
+               'next_text'          => '<span aria-label="' . esc_attr__( 'Next page' ) . '">' . __( '&raquo;' ) . '</span>',
+               'before_page_number' => '<span class="screen-reader-text">' . __( 'Page' ) . '</span> ',
+               'total'   => $num_pages,
                'current' => $pagenum
        ));
 
@@ -400,18 +420,18 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                                $args['walker'] = $walker;
 
                                /**
-                                * Filter the posts displayed in the 'Most Recent' tab of the current
+                                * Filters the posts displayed in the 'Most Recent' tab of the current
                                 * post type's menu items meta box.
                                 *
                                 * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
                                 *
                                 * @since 4.3.0
                                 *
-                                * @param array  $most_recent An array of post objects being listed.
-                                * @param array  $args        An array of WP_Query arguments.
-                                * @param object $post_type   The current post type object for this menu item meta box.
+                                * @param array $most_recent An array of post objects being listed.
+                                * @param array $args        An array of WP_Query arguments.
+                                * @param array $box         Arguments passed to wp_nav_menu_item_post_type_meta_box().
                                 */
-                               $most_recent = apply_filters( "nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $post_type );
+                               $most_recent = apply_filters( "nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box );
 
                                echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args );
                                ?>
@@ -434,7 +454,7 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                                <label for="quick-search-posttype-<?php echo $post_type_name; ?>" class="screen-reader-text"><?php _e( 'Search' ); ?></label>
                                <input type="search" class="quick-search" value="<?php echo $searched; ?>" name="quick-search-posttype-<?php echo $post_type_name; ?>" id="quick-search-posttype-<?php echo $post_type_name; ?>" />
                                <span class="spinner"></span>
-                               <?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-posttype-' . $post_type_name ) ); ?>
+                               <?php submit_button( __( 'Search' ), 'small quick-search-submit hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-posttype-' . $post_type_name ) ); ?>
                        </p>
 
                        <ul id="<?php echo $post_type_name; ?>-search-checklist" data-wp-lists="list:<?php echo $post_type_name?>" class="categorychecklist form-no-clear">
@@ -491,7 +511,7 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                                }
 
                                $post_type = get_post_type_object( $post_type_name );
-                               $archive_link = get_post_type_archive_link( $post_type_name );
+
                                if ( $post_type->has_archive ) {
                                        $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
                                        array_unshift( $posts, (object) array(
@@ -508,21 +528,23 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                                }
 
                                /**
-                                * Filter the posts displayed in the 'View All' tab of the current
+                                * Filters the posts displayed in the 'View All' tab of the current
                                 * post type's menu items meta box.
                                 *
                                 * The dynamic portion of the hook name, `$post_type_name`, refers
                                 * to the slug of the current post type.
                                 *
                                 * @since 3.2.0
+                                * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
                                 *
                                 * @see WP_Query::query()
                                 *
-                                * @param array  $posts     The posts for the current post type.
-                                * @param array  $args      An array of WP_Query arguments.
-                                * @param object $post_type The current post type object for this menu item meta box.
+                                * @param array        $posts     The posts for the current post type.
+                                * @param array        $args      An array of WP_Query arguments.
+                                * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
                                 */
                                $posts = apply_filters( "nav_menu_items_{$post_type_name}", $posts, $args, $post_type );
+
                                $checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args );
 
                                if ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) {
@@ -550,11 +572,11 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
                                                ),
                                                remove_query_arg( $removed_args )
                                        ));
-                               ?>#posttype-<?php echo $post_type_name; ?>" class="select-all"><?php _e('Select All'); ?></a>
+                               ?>#posttype-<?php echo $post_type_name; ?>" class="select-all aria-button-if-js"><?php _e( 'Select All' ); ?></a>
                        </span>
 
                        <span class="add-to-menu">
-                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-post-type-menu-item" id="<?php echo esc_attr( 'submit-posttype-' . $post_type_name ); ?>" />
+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-post-type-menu-item" id="<?php echo esc_attr( 'submit-posttype-' . $post_type_name ); ?>" />
                                <span class="spinner"></span>
                        </span>
                </p>
@@ -564,18 +586,25 @@ function wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {
 }
 
 /**
- * Displays a metabox for a taxonomy menu item.
+ * Displays a meta box for a taxonomy menu item.
  *
  * @since 3.0.0
  *
  * @global int|string $nav_menu_selected_id
  *
  * @param string $object Not used.
- * @param string $taxonomy The taxonomy object.
+ * @param array  $box {
+ *     Taxonomy menu item meta box arguments.
+ *
+ *     @type string $id       Meta box 'id' attribute.
+ *     @type string $title    Meta box title.
+ *     @type string $callback Meta box display callback.
+ *     @type object $args     Extra meta box arguments (the taxonomy object for this meta box).
+ * }
  */
-function wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {
+function wp_nav_menu_item_taxonomy_meta_box( $object, $box ) {
        global $nav_menu_selected_id;
-       $taxonomy_name = $taxonomy['args']->name;
+       $taxonomy_name = $box['args']->name;
 
        // Paginate browsing for large numbers of objects.
        $per_page = 50;
@@ -614,9 +643,10 @@ function wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {
                        )
                ),
                'format' => '',
-               'prev_text' => __('&laquo;'),
-               'next_text' => __('&raquo;'),
-               'total' => $num_pages,
+               'prev_text'          => '<span aria-label="' . esc_attr__( 'Previous page' ) . '">' . __( '&laquo;' ) . '</span>',
+               'next_text'          => '<span aria-label="' . esc_attr__( 'Next page' ) . '">' . __( '&raquo;' ) . '</span>',
+               'before_page_number' => '<span class="screen-reader-text">' . __( 'Page' ) . '</span> ',
+               'total'   => $num_pages,
                'current' => $pagenum
        ));
 
@@ -714,7 +744,7 @@ function wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {
                                <label for="quick-search-taxonomy-<?php echo $taxonomy_name; ?>" class="screen-reader-text"><?php _e( 'Search' ); ?></label>
                                <input type="search" class="quick-search" value="<?php echo $searched; ?>" name="quick-search-taxonomy-<?php echo $taxonomy_name; ?>" id="quick-search-taxonomy-<?php echo $taxonomy_name; ?>" />
                                <span class="spinner"></span>
-                               <?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?>
+                               <?php submit_button( __( 'Search' ), 'small quick-search-submit hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?>
                        </p>
 
                        <ul id="<?php echo $taxonomy_name; ?>-search-checklist" data-wp-lists="list:<?php echo $taxonomy_name?>" class="categorychecklist form-no-clear">
@@ -741,11 +771,11 @@ function wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {
                                                ),
                                                remove_query_arg($removed_args)
                                        ));
-                               ?>#taxonomy-<?php echo $taxonomy_name; ?>" class="select-all"><?php _e('Select All'); ?></a>
+                               ?>#taxonomy-<?php echo $taxonomy_name; ?>" class="select-all aria-button-if-js"><?php _e( 'Select All' ); ?></a>
                        </span>
 
                        <span class="add-to-menu">
-                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-taxonomy-menu-item" id="<?php echo esc_attr( 'submit-taxonomy-' . $taxonomy_name ); ?>" />
+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-taxonomy-menu-item" id="<?php echo esc_attr( 'submit-taxonomy-' . $taxonomy_name ); ?>" />
                                <span class="spinner"></span>
                        </span>
                </p>
@@ -888,7 +918,7 @@ function wp_get_nav_menu_to_edit( $menu_id = 0 ) {
                        return $result . ' <ul class="menu" id="menu-to-edit"> </ul>';
 
                /**
-                * Filter the Walker class used when adding nav menu items.
+                * Filters the Walker class used when adding nav menu items.
                 *
                 * @since 3.0.0
                 *
@@ -916,11 +946,13 @@ function wp_get_nav_menu_to_edit( $menu_id = 0 ) {
                                $some_invalid_menu_items = true;
                }
 
-               if ( $some_pending_menu_items )
-                       $result .= '<div class="updated inline"><p>' . __('Click Save Menu to make pending menu items public.') . '</p></div>';
+               if ( $some_pending_menu_items ) {
+                       $result .= '<div class="notice notice-info notice-alt inline"><p>' . __( 'Click Save Menu to make pending menu items public.' ) . '</p></div>';
+               }
 
-               if ( $some_invalid_menu_items )
-                       $result .= '<div class="error inline"><p>' . __('There are some invalid menu items. Please check or delete them.') . '</p></div>';
+               if ( $some_invalid_menu_items ) {
+                       $result .= '<div class="notice notice-error notice-alt inline"><p>' . __( 'There are some invalid menu items. Please check or delete them.' ) . '</p></div>';
+               }
 
                $result .= '<ul class="menu" id="menu-to-edit"> ';
                $result .= walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $menu_items), 0, (object) array('walker' => $walker ) );
@@ -1057,3 +1089,46 @@ function wp_nav_menu_update_menu_items ( $nav_menu_selected_id, $nav_menu_select
 
        return $messages;
 }
+
+/**
+ * If a JSON blob of navigation menu data is in POST data, expand it and inject
+ * it into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
+ *
+ * @ignore
+ * @since 4.5.3
+ * @access private
+ */
+function _wp_expand_nav_menu_post_data() {
+       if ( ! isset( $_POST['nav-menu-data'] ) ) {
+               return;
+       }
+
+       $data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );
+
+       if ( ! is_null( $data ) && $data ) {
+               foreach ( $data as $post_input_data ) {
+                       // For input names that are arrays (e.g. `menu-item-db-id[3][4][5]`),
+                       // derive the array path keys via regex and set the value in $_POST.
+                       preg_match( '#([^\[]*)(\[(.+)\])?#', $post_input_data->name, $matches );
+
+                       $array_bits = array( $matches[1] );
+
+                       if ( isset( $matches[3] ) ) {
+                               $array_bits = array_merge( $array_bits, explode( '][', $matches[3] ) );
+                       }
+
+                       $new_post_data = array();
+
+                       // Build the new array value from leaf to trunk.
+                       for ( $i = count( $array_bits ) - 1; $i >= 0; $i -- ) {
+                               if ( $i == count( $array_bits ) - 1 ) {
+                                       $new_post_data[ $array_bits[ $i ] ] = wp_slash( $post_input_data->value );
+                               } else {
+                                       $new_post_data = array( $array_bits[ $i ] => $new_post_data );
+                               }
+                       }
+
+                       $_POST = array_replace_recursive( $_POST, $new_post_data );
+               }
+       }
+}