WordPress.org

Make WordPress Core

Ticket #44326: 44326.2.diff

File 44326.2.diff, 5.8 KB (added by earnjam, 2 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 e53ff4b910..7d34469652 100644
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    271271
    272272                $taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
    273273
     274                if ( ! empty( $request['tax_relation'] ) ) {
     275                        $query_args['tax_query'] = array( 'relation' => $request['tax_relation'] );
     276                }
     277
    274278                foreach ( $taxonomies as $taxonomy ) {
    275279                        $base        = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    276280                        $tax_exclude = $base . '_exclude';
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    25062510
    25072511                $taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
    25082512
     2513                if ( ! empty( $taxonomies ) ) {
     2514                        $query_params['tax_relation'] = array(
     2515                                'description' => __( 'Limit result set based on relationship between multiple taxonomies.' ),
     2516                                'type'        => 'string',
     2517                                'enum'        => array( 'AND', 'OR' ),
     2518                        );
     2519                }
     2520
    25092521                foreach ( $taxonomies as $taxonomy ) {
    25102522                        $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    25112523
  • 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 ba174c448e..b3dac9e77b 100644
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    175175                                'sticky',
    176176                                'tags',
    177177                                'tags_exclude',
     178                                'tax_relation',
    178179                        ),
    179180                        $keys
    180181                );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    959960                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    960961        }
    961962
     963        public function test_get_items_tags_or_categories_query() {
     964                $id1      = self::$post_id;
     965                $id2      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     966                $id3      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     967                $id4      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     968                $tag      = wp_insert_term( 'My Tag', 'post_tag' );
     969                $category = wp_insert_term( 'My Category', 'category' );
     970
     971                wp_set_object_terms( $id1, array( $tag['term_id'] ), 'post_tag' );
     972                wp_set_object_terms( $id2, array( $category['term_id'] ), 'category' );
     973
     974                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     975                $request->set_param( 'tax_relation', 'OR' );
     976                $request->set_param( 'tags', array( $tag['term_id'] ) );
     977                $request->set_param( 'categories', array( $category['term_id'] ) );
     978
     979                $response = rest_get_server()->dispatch( $request );
     980                $data     = $response->get_data();
     981                $this->assertCount( 2, $data );
     982                $this->assertEquals( $id2, $data[0]['id'] );
     983                $this->assertEquals( $id1, $data[1]['id'] );
     984        }
     985
    962986        public function test_get_items_tags_and_categories_exclude_query() {
    963987                $id1      = self::$post_id;
    964988                $id2      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    9851009                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    9861010        }
    9871011
     1012        public function test_get_items_tags_or_categories_exclude_query() {
     1013                $id1      = self::$post_id;
     1014                $id2      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1015                $id3      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1016                $id4      = $this->factory->post->create( array( 'post_status' => 'publish' ) );
     1017                $tag      = wp_insert_term( 'My Tag', 'post_tag' );
     1018                $category = wp_insert_term( 'My Category', 'category' );
     1019
     1020                wp_set_object_terms( $id1, array( $tag['term_id'] ), 'post_tag' );
     1021                wp_set_object_terms( $id2, array( $tag['term_id'] ), 'post_tag' );
     1022                wp_set_object_terms( $id2, array( $category['term_id'] ), 'category' );
     1023                wp_set_object_terms( $id3, array( $category['term_id'] ), 'category' );
     1024
     1025                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1026                $request->set_param( 'tags', array( $tag['term_id'] ) );
     1027                $request->set_param( 'categories_exclude', array( $category['term_id'] ) );
     1028                $request->set_param( 'tax_relation', 'OR' );
     1029
     1030                $response = rest_get_server()->dispatch( $request );
     1031                $data     = $response->get_data();
     1032                $this->assertCount( 3, $data );
     1033                $this->assertEquals( $id2, $data[0]['id'] );
     1034                $this->assertEquals( $id4, $data[1]['id'] );
     1035                $this->assertEquals( $id1, $data[2]['id'] );
     1036        }
     1037
    9881038        public function test_get_items_sticky() {
    9891039                $id1 = self::$post_id;
    9901040                $id2 = $this->factory->post->create( array( 'post_status' => 'publish' ) );
  • tests/qunit/fixtures/wp-api-generated.js

    diff --git tests/qunit/fixtures/wp-api-generated.js tests/qunit/fixtures/wp-api-generated.js
    index 47f925fe44..4301f30182 100644
    mockedApiResponse.Schema = { 
    322322                                "type": "string"
    323323                            }
    324324                        },
     325                        "tax_relation": {
     326                            "required": false,
     327                            "enum": [
     328                                "AND",
     329                                "OR"
     330                            ],
     331                            "description": "Limit result set based on relationship between multiple taxonomies.",
     332                            "type": "string"
     333                        },
    325334                        "categories": {
    326335                            "required": false,
    327336                            "default": [],