Ticket #32687: 32687.4.diff
| File 32687.4.diff, 11.5 KB (added by , 11 years ago) |
|---|
-
src/wp-includes/class-wp-customize-nav-menus.php
diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php index b01cf73..247f985 100644
final class WP_Customize_Nav_Menus { 80 80 } 81 81 82 82 $obj_type = sanitize_key( $_POST['obj_type'] ); 83 if ( ! in_array( $obj_type, array( 'post_type', 'taxonomy' ) ) ) { 84 wp_send_json_error( 'nav_menus_invalid_obj_type' ); 83 $obj_name = sanitize_key( $_POST['type'] ); 84 $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ); 85 $items = $this->load_available_items_query( $obj_type, $obj_name, $page ); 86 87 if ( is_wp_error( $items ) ) { 88 wp_send_json_error( $items->get_error_code() ); 89 } else { 90 wp_send_json_success( array( 'items' => $items ) ); 85 91 } 92 } 86 93 87 $taxonomy_or_post_type = sanitize_key( $_POST['type'] ); 88 $page = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0; 94 /** 95 * Performs the post_type and taxonomy queries for loading available menu items. 96 * 97 * @since 4.3.0 98 * @access public 99 * 100 * @param string $obj_type Optional. Accepts 'post_type' or 'taxonomy'. Default is 'post_type'. 101 * @param string $obj_name Optional. Accepts any registered taxonomy or post type name. Default is 'page'. 102 * @param int $page Optional. The page number used to generate the query offset. Default is '0'. 103 * @return WP_Error|array Returns either a WP_Error object or an array of menu items. 104 */ 105 public function load_available_items_query( $obj_type = 'post_type', $obj_name = 'page', $page = 0 ) { 89 106 $items = array(); 90 107 108 if ( ! in_array( $obj_type, array( 'post_type', 'taxonomy' ) ) ) { 109 return new WP_Error( 'nav_menus_invalid_obj_type' ); 110 } 111 91 112 if ( 'post_type' === $obj_type ) { 92 if ( ! get_post_type_object( $ taxonomy_or_post_type ) ) {93 wp_send_json_error( 'nav_menus_invalid_post_type' );113 if ( ! get_post_type_object( $obj_name ) ) { 114 return new WP_Error( 'nav_menus_invalid_post_type' ); 94 115 } 95 116 96 if ( 0 === $page && 'page' === $ taxonomy_or_post_type ) {117 if ( 0 === $page && 'page' === $obj_name ) { 97 118 // Add "Home" link. Treat as a page, but switch to custom on add. 98 119 $items[] = array( 99 120 'id' => 'home', … … final class WP_Customize_Nav_Menus { 110 131 'offset' => 10 * $page, 111 132 'orderby' => 'date', 112 133 'order' => 'DESC', 113 'post_type' => $ taxonomy_or_post_type,134 'post_type' => $obj_name, 114 135 ) ); 115 136 foreach ( $posts as $post ) { 116 137 $post_title = $post->post_title; … … final class WP_Customize_Nav_Menus { 129 150 ); 130 151 } 131 152 } elseif ( 'taxonomy' === $obj_type ) { 132 $terms = get_terms( $ taxonomy_or_post_type, array(153 $terms = get_terms( $obj_name, array( 133 154 'child_of' => 0, 134 155 'exclude' => '', 135 156 'hide_empty' => false, … … final class WP_Customize_Nav_Menus { 142 163 'pad_counts' => false, 143 164 ) ); 144 165 if ( is_wp_error( $terms ) ) { 145 wp_send_json_error( $terms->get_error_code() );166 return $terms; 146 167 } 147 168 148 169 foreach ( $terms as $term ) { … … final class WP_Customize_Nav_Menus { 158 179 } 159 180 } 160 181 161 wp_send_json_success( array( 'items' => $items ) );182 return $items; 162 183 } 163 184 164 185 /** … … final class WP_Customize_Nav_Menus { 184 205 } 185 206 186 207 $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); 187 $ results = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) );208 $items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) ); 188 209 189 if ( empty( $ results ) ) {190 wp_send_json_error( array( 'message' => __( 'No results found.' ) ) );210 if ( empty( $items ) ) { 211 wp_send_json_error( array( 'message' => __( 'No menu items found.' ) ) ); 191 212 } else { 192 wp_send_json_success( array( 'items' => $ results ) );213 wp_send_json_success( array( 'items' => $items ) ); 193 214 } 194 215 } 195 216 … … final class WP_Customize_Nav_Menus { 202 223 * @access public 203 224 * 204 225 * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. 205 * @return array Results.226 * @return array Menu items. 206 227 */ 207 228 public function search_available_items_query( $args = array() ) { 208 $ results = array();229 $items = array(); 209 230 210 231 $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); 211 232 $query = array( … … final class WP_Customize_Nav_Menus { 235 256 /* translators: %d: ID of a post */ 236 257 $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); 237 258 } 238 $ results[] = array(259 $items[] = array( 239 260 'id' => 'post-' . $post->ID, 240 261 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), 241 262 'type' => 'post_type', … … final class WP_Customize_Nav_Menus { 258 279 // Check if any taxonomies were found. 259 280 if ( ! empty( $terms ) ) { 260 281 foreach ( $terms as $term ) { 261 $ results[] = array(282 $items[] = array( 262 283 'id' => 'term-' . $term->term_id, 263 284 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 264 285 'type' => 'taxonomy', … … final class WP_Customize_Nav_Menus { 270 291 } 271 292 } 272 293 273 return $ results;294 return $items; 274 295 } 275 296 276 297 /** -
tests/phpunit/tests/customize/nav-menus.php
diff --git tests/phpunit/tests/customize/nav-menus.php tests/phpunit/tests/customize/nav-menus.php index 7fa88e7..27c216e 100644
class Test_WP_Customize_Nav_Menus extends WP_UnitTestCase { 49 49 } 50 50 51 51 /** 52 * Test th e test_load_available_items_ajax method.52 * Test that the load_available_items_query method returns a WP_Error object. 53 53 * 54 * @see WP_Customize_Nav_Menus::load_available_items_ ajax()54 * @see WP_Customize_Nav_Menus::load_available_items_query() 55 55 */ 56 function test_load_available_items_ajax() { 56 function test_load_available_items_query_returns_wp_error() { 57 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 58 59 // Invalid $obj_type. 60 $items = $menus->load_available_items_query( 'invalid' ); 61 $this->assertInstanceOf( 'WP_Error', $items ); 62 63 // Invalid post type $obj_name. 64 $items = $menus->load_available_items_query( 'post_type', 'invalid' ); 65 $this->assertInstanceOf( 'WP_Error', $items ); 66 67 // Invalid taxonomy $obj_name. 68 $items = $menus->load_available_items_query( 'taxonomy', 'invalid' ); 69 $this->assertInstanceOf( 'WP_Error', $items ); 70 } 71 72 /** 73 * Test the load_available_items_query method maybe returns the home page item. 74 * 75 * @see WP_Customize_Nav_Menus::load_available_items_query() 76 */ 77 function test_load_available_items_query_maybe_returns_home() { 78 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 79 80 // Expected menu item array. 81 $expected = array( 82 'id' => 'home', 83 'title' => _x( 'Home', 'nav menu home label' ), 84 'type' => 'custom', 85 'type_label' => __( 'Custom Link' ), 86 'object' => '', 87 'url' => home_url(), 88 ); 89 90 // Create pages. 91 $this->factory->post->create_many( 15, array( 'post_type' => 'page' ) ); 92 93 // Home is included in menu items when page is zero. 94 $items = $menus->load_available_items_query( 'post_type', 'page', 0 ); 95 $this->assertContains( $expected, $items ); 96 97 // Home is not included in menu items when page is larger than zero. 98 $items = $menus->load_available_items_query( 'post_type', 'page', 1 ); 99 $this->assertNotEmpty( $items ); 100 $this->assertNotContains( $expected, $items ); 101 } 102 103 /** 104 * Test the load_available_items_query method returns post item. 105 * 106 * @see WP_Customize_Nav_Menus::load_available_items_query() 107 */ 108 function test_load_available_items_query_returns_post_item_with_page_number() { 109 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 110 111 // Create page. 112 $post_id = $this->factory->post->create( array( 'post_title' => 'Post Title' ) ); 113 114 // Create pages. 115 $this->factory->post->create_many( 10 ); 116 117 // Expected menu item array. 118 $expected = array( 119 'id' => "post-{$post_id}", 120 'title' => 'Post Title', 121 'type' => 'post_type', 122 'type_label' => 'Post', 123 'object' => 'post', 124 'object_id' => intval( $post_id ), 125 'url' => get_permalink( intval( $post_id ) ), 126 ); 127 128 // Offset the query and get the second page of menu items. 129 $items = $menus->load_available_items_query( 'post_type', 'post', 1 ); 130 $this->assertContains( $expected, $items ); 131 } 57 132 58 $this->markTestIncomplete( 'This test has not been implemented.' ); 133 /** 134 * Test the load_available_items_query method returns page item. 135 * 136 * @see WP_Customize_Nav_Menus::load_available_items_query() 137 */ 138 function test_load_available_items_query_returns_page_item() { 139 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 140 141 // Create page. 142 $page_id = $this->factory->post->create( array( 'post_title' => 'Page Title', 'post_type' => 'page' ) ); 143 144 // Expected menu item array. 145 $expected = array( 146 'id' => "post-{$page_id}", 147 'title' => 'Page Title', 148 'type' => 'post_type', 149 'type_label' => 'Page', 150 'object' => 'page', 151 'object_id' => intval( $page_id ), 152 'url' => get_permalink( intval( $page_id ) ), 153 ); 59 154 155 $items = $menus->load_available_items_query( 'post_type', 'page', 0 ); 156 $this->assertContains( $expected, $items ); 60 157 } 61 158 62 159 /** 63 * Test the search_available_items_ajax method.160 * Test the load_available_items_query method returns post item. 64 161 * 65 * @see WP_Customize_Nav_Menus:: search_available_items_ajax()162 * @see WP_Customize_Nav_Menus::load_available_items_query() 66 163 */ 67 function test_search_available_items_ajax() { 164 function test_load_available_items_query_returns_post_item() { 165 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 166 167 // Create post. 168 $post_id = $this->factory->post->create( array( 'post_title' => 'Post Title' ) ); 68 169 69 $this->markTestIncomplete( 'This test has not been implemented.' ); 170 // Expected menu item array. 171 $expected = array( 172 'id' => "post-{$post_id}", 173 'title' => 'Post Title', 174 'type' => 'post_type', 175 'type_label' => 'Post', 176 'object' => 'post', 177 'object_id' => intval( $post_id ), 178 'url' => get_permalink( intval( $post_id ) ), 179 ); 70 180 181 $items = $menus->load_available_items_query( 'post_type', 'post', 0 ); 182 $this->assertContains( $expected, $items ); 183 } 184 185 /** 186 * Test the load_available_items_query method returns term item. 187 * 188 * @see WP_Customize_Nav_Menus::load_available_items_query() 189 */ 190 function test_load_available_items_query_returns_term_item() { 191 $menus = new WP_Customize_Nav_Menus( $this->wp_customize ); 192 193 // Create term. 194 $term_id = $this->factory->category->create( array( 'name' => 'Term Title' ) ); 195 196 // Expected menu item array. 197 $expected = array( 198 'id' => "term-{$term_id}", 199 'title' => 'Term Title', 200 'type' => 'taxonomy', 201 'type_label' => 'Category', 202 'object' => 'category', 203 'object_id' => intval( $term_id ), 204 'url' => get_term_link( intval( $term_id ), 'category' ), 205 ); 206 207 $items = $menus->load_available_items_query( 'taxonomy', 'category', 0 ); 208 $this->assertContains( $expected, $items ); 71 209 } 72 210 73 211 /** … … class Test_WP_Customize_Nav_Menus extends WP_UnitTestCase { 454 592 455 593 } 456 594 457 /**458 * Test the render_menu method.459 *460 * @see WP_Customize_Nav_Menus::render_menu()461 */462 function test_render_menu() {463 464 $this->markTestIncomplete( 'This test has not been implemented.' );465 }466 467 595 }