WordPress.org

Make WordPress Core

Ticket #39494: 39494.3.diff

File 39494.3.diff, 8.5 KB (added by birgire, 20 months ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 0661152..c51e169 100644
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    270270                foreach ( $taxonomies as $taxonomy ) {
    271271                        $base        = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    272272                        $tax_exclude = $base . '_exclude';
     273                        $tax_object  = $base . '_object';
    273274
    274275                        if ( ! empty( $request[ $base ] ) ) {
    275276                                $query_args['tax_query'][] = array(
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    280281                                );
    281282                        }
    282283
     284                        if ( ! empty( $request[ $tax_object ] ) ) {
     285                                $terms            = array();
     286                                $include_children = false;
     287                                $field            = 'term_id';
     288
     289                                if ( isset( $request[ $tax_object ]['term_ids'] ) ) {
     290                                        $terms = $request[ $tax_object ]['term_ids'];
     291                                }
     292
     293                                if ( isset( $request[ $tax_object ]['term_slugs'] ) ) {
     294                                        $field = 'slug';
     295                                        $terms = $request[ $tax_object ]['term_slugs'];
     296                                }
     297
     298                                if ( isset( $request[ $tax_object ]['include_children'] ) ) {
     299                                        $include_children = $request[ $tax_object ]['include_children'];
     300                                }
     301
     302                                $query_args['tax_query'][] = array(
     303                                        'taxonomy'         => $taxonomy->name,
     304                                        'field'            => $field,
     305                                        'terms'            => $terms,
     306                                        'include_children' => $include_children,
     307                                );
     308                        }
     309
    283310                        if ( ! empty( $request[ $tax_exclude ] ) ) {
    284311                                $query_args['tax_query'][] = array(
    285312                                        'taxonomy'         => $taxonomy->name,
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    22302257                                'default'     => array(),
    22312258                        );
    22322259
     2260                        $query_params[ $base . '_object' ] = array(
     2261                                /* translators: %s: taxonomy name */
     2262                                'description' => sprintf( __( 'Limit result set to all items that have the specified term assigned in the %s taxonomy.' ), $base ),
     2263                                'type'        => 'object',
     2264                                'properties'  => array(
     2265                                        'term_ids'              => array(
     2266                                                'description' => __( 'The term ids to limit the post to.' ),
     2267                                                'type'        => 'array',
     2268                                                'items'       => array(
     2269                                                        'type' => 'integer',
     2270                                                ),
     2271                                                'default'     => array(),
     2272                                        ),
     2273                                        'term_slugs'              => array(
     2274                                                'description' => __( 'The term slugs to limit the post to.' ),
     2275                                                'type'        => 'array',
     2276                                                'items'       => array(
     2277                                                        'type' => 'string',
     2278                                                ),
     2279                                                'default'     => array(),
     2280                                        ),
     2281                                        'include_children' => array(
     2282                                                'description' => __( 'Whether or not to include the term children.' ),
     2283                                                'type'        => 'boolean',
     2284                                                'default'     => false,
     2285                                        ),
     2286                                ),
     2287                        );
     2288
    22332289                        $query_params[ $base . '_exclude' ] = array(
    22342290                                /* translators: %s: taxonomy name */
    22352291                                'description' => sprintf( __( 'Limit result set to all items except those that have the specified term assigned in the %s taxonomy.' ), $base ),
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-posts-controller.php tests/phpunit/tests/rest-api/rest-posts-controller.php
    index bc820a8..f04405a 100644
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    147147                                'before',
    148148                                'categories',
    149149                                'categories_exclude',
     150                                'categories_object',
    150151                                'context',
    151152                                'exclude',
    152153                                'include',
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    161162                                'sticky',
    162163                                'tags',
    163164                                'tags_exclude',
     165                                'tags_object',
    164166                        ), $keys
    165167                );
    166168        }
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    934936                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    935937        }
    936938
     939        /**
     940         * Testing updated taxonomy schema and including category children.
     941         *
     942         * @ticket 39494
     943         */
     944        public function test_get_items_categories_by_term_ids_and_include_children_true() {
     945                $id1 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     946                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     947
     948                $cat1 = wp_insert_term( 'My Parent Category', 'category' );
     949                $cat2 = wp_insert_term( 'My Child Category', 'category', array( 'parent' => $cat1['term_id'] ) );
     950
     951                wp_set_object_terms( $id1, array( $cat1['term_id'] ), 'category' );
     952                wp_set_object_terms( $id2, array( $cat2['term_id'] ), 'category' );
     953
     954                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     955                $request->set_param( 'categories_object', (object) array(
     956                        'term_ids'         => array( $cat1['term_id'] ),
     957                        'include_children' => true,
     958                ) );
     959                $response = rest_get_server()->dispatch( $request );
     960                $data     = $response->get_data();
     961
     962                $this->assertCount( 2, $data );
     963                $this->assertEquals( $id1, $data[0]['id'] );
     964                $this->assertEquals( $id2, $data[1]['id'] );
     965        }
     966
     967        /**
     968         * Testing updated taxonomy schema without including category children.
     969         *
     970         * @ticket 39494
     971         */
     972        public function test_get_items_categories_by_term_ids_and_include_children_false() {
     973                $id1 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     974                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     975
     976                $cat1 = wp_insert_term( 'My Parent Category', 'category' );
     977                $cat2 = wp_insert_term( 'My Child Category', 'category', array( 'parent' => $cat1['term_id'] ) );
     978
     979                wp_set_object_terms( $id1, array( $cat1['term_id'] ), 'category' );
     980                wp_set_object_terms( $id2, array( $cat2['term_id'] ), 'category' );
     981
     982                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     983                $request->set_param( 'categories_object', (object) array(
     984                        'term_ids'         => array( $cat1['term_id'] ),
     985                        'include_children' => false,
     986                ) );
     987                $response = rest_get_server()->dispatch( $request );
     988                $data     = $response->get_data();
     989
     990                $this->assertCount( 1, $data );
     991                $this->assertEquals( $id1, $data[0]['id'] );
     992        }
     993
     994        /**
     995         * Testing updated taxonomy schema by searching for term slugs and including category children.
     996         *
     997         * @ticket 39494
     998         */
     999        public function test_get_items_categories_by_term_slugs_and_include_children_true() {
     1000                $id1 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1001                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1002
     1003                $cat1 = wp_insert_term( 'My Parent Category', 'category' );
     1004                $cat2 = wp_insert_term( 'My Child Category', 'category', array( 'parent' => $cat1['term_id'] ) );
     1005
     1006                wp_set_object_terms( $id1, array( $cat1['term_id'] ), 'category' );
     1007                wp_set_object_terms( $id2, array( $cat2['term_id'] ), 'category' );
     1008
     1009                $cat1_slug = get_term_by( 'term_id', $cat1['term_id'], 'category' )->slug;
     1010
     1011                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1012                $request->set_param( 'categories_object', (object) array(
     1013                        'term_slugs'       => array( $cat1_slug ),
     1014                        'include_children' => true,
     1015                ) );
     1016                $response = rest_get_server()->dispatch( $request );
     1017                $data     = $response->get_data();
     1018
     1019                $this->assertCount( 2, $data );
     1020                $this->assertEquals( $id1, $data[0]['id'] );
     1021                $this->assertEquals( $id2, $data[1]['id'] );
     1022        }
     1023
     1024        /**
     1025         * Testing updated taxonomy schema by searching for term slugs and not including category children.
     1026         *
     1027         * @ticket 39494
     1028         */
     1029        public function test_get_items_categories_by_term_slugs_and_include_children_false() {
     1030                $id1 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1031                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1032
     1033                $cat1 = wp_insert_term( 'My Parent Category', 'category' );
     1034                $cat2 = wp_insert_term( 'My Child Category', 'category', array( 'parent' => $cat1['term_id'] ) );
     1035
     1036                wp_set_object_terms( $id1, array( $cat1['term_id'] ), 'category' );
     1037                wp_set_object_terms( $id2, array( $cat2['term_id'] ), 'category' );
     1038
     1039                $cat1_slug = get_term_by( 'term_id', $cat1['term_id'], 'category' )->slug;
     1040
     1041                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1042                $request->set_param( 'categories_object', (object) array(
     1043                        'term_slugs'       => array( $cat1_slug ),
     1044                        'include_children' => false,
     1045                ) );
     1046                $response = rest_get_server()->dispatch( $request );
     1047                $data     = $response->get_data();
     1048
     1049                $this->assertCount( 1, $data );
     1050                $this->assertEquals( $id1, $data[0]['id'] );
     1051        }
     1052
    9371053        public function test_get_items_sticky() {
    9381054                $id1 = self::$post_id;
    9391055                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );