WordPress.org

Make WordPress Core

Changeset 52068


Ignore:
Timestamp:
11/09/2021 01:57:48 AM (4 weeks ago)
Author:
TimothyBlynJacobs
Message:

REST API: Add batch support for posts and terms controllers.

This also exposes the value of allow_batch in OPTIONS requests to a route.

A future commit will add batch support to more resources.

Props spacedmonkey, chrisvanpatten.
See #53063.

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/class-wp-rest-server.php

    r51962 r52068  
    14041404        );
    14051405
     1406        $allow_batch = false;
     1407
    14061408        if ( isset( $this->route_options[ $route ] ) ) {
    14071409            $options = $this->route_options[ $route ];
     
    14101412                $data['namespace'] = $options['namespace'];
    14111413            }
     1414
     1415            $allow_batch = isset( $options['allow_batch'] ) ? $options['allow_batch'] : false;
    14121416
    14131417            if ( isset( $options['schema'] ) && 'help' === $context ) {
     
    14301434                'methods' => array_keys( $callback['methods'] ),
    14311435            );
     1436
     1437            $callback_batch = isset( $callback['allow_batch'] ) ? $callback['allow_batch'] : $allow_batch;
     1438
     1439            if ( $callback_batch ) {
     1440                $endpoint_data['allow_batch'] = $callback_batch;
     1441            }
    14321442
    14331443            if ( isset( $callback['args'] ) ) {
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    r51786 r52068  
    1616 */
    1717class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller {
     18
     19    /**
     20     * Whether the controller supports batching.
     21     *
     22     * @since 5.9.0
     23     * @var false
     24     */
     25    protected $allow_batch = false;
    1826
    1927    /**
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r51964 r52068  
    3939     */
    4040    protected $password_check_passed = array();
     41
     42    /**
     43     * Whether the controller supports batching.
     44     *
     45     * @since 5.9.0
     46     * @var array
     47     */
     48    protected $allow_batch = array( 'v1' => true );
    4149
    4250    /**
     
    8189                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
    8290                ),
    83                 'schema' => array( $this, 'get_public_item_schema' ),
     91                'allow_batch' => $this->allow_batch,
     92                'schema'      => array( $this, 'get_public_item_schema' ),
    8493            )
    8594        );
     
    99108            '/' . $this->rest_base . '/(?P<id>[\d]+)',
    100109            array(
    101                 'args'   => array(
     110                'args'        => array(
    102111                    'id' => array(
    103112                        'description' => __( 'Unique identifier for the post.' ),
     
    129138                    ),
    130139                ),
    131                 'schema' => array( $this, 'get_public_item_schema' ),
     140                'allow_batch' => $this->allow_batch,
     141                'schema'      => array( $this, 'get_public_item_schema' ),
    132142            )
    133143        );
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    r51964 r52068  
    4848     */
    4949    protected $total_terms;
     50
     51    /**
     52     * Whether the controller supports batching.
     53     *
     54     * @since 5.9.0
     55     * @var array
     56     */
     57    protected $allow_batch = array( 'v1' => true );
    5058
    5159    /**
     
    9098                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
    9199                ),
    92                 'schema' => array( $this, 'get_public_item_schema' ),
     100                'allow_batch' => $this->allow_batch,
     101                'schema'      => array( $this, 'get_public_item_schema' ),
    93102            )
    94103        );
     
    98107            '/' . $this->rest_base . '/(?P<id>[\d]+)',
    99108            array(
    100                 'args'   => array(
     109                'args'        => array(
    101110                    'id' => array(
    102111                        'description' => __( 'Unique identifier for the term.' ),
     
    130139                    ),
    131140                ),
    132                 'schema' => array( $this, 'get_public_item_schema' ),
     141                'allow_batch' => $this->allow_batch,
     142                'schema'      => array( $this, 'get_public_item_schema' ),
    133143            )
    134144        );
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php

    r52016 r52068  
    2424     */
    2525    protected $widgets_retrieved = false;
     26
     27    /**
     28     * Whether the controller supports batching.
     29     *
     30     * @since 5.9.0
     31     * @var array
     32     */
     33    protected $allow_batch = array( 'v1' => true );
    2634
    2735    /**
     
    5765                    'args'                => $this->get_endpoint_args_for_item_schema(),
    5866                ),
    59                 'allow_batch' => array( 'v1' => true ),
     67                'allow_batch' => $this->allow_batch,
    6068                'schema'      => array( $this, 'get_public_item_schema' ),
    6169            )
     
    9199                    ),
    92100                ),
    93                 'allow_batch' => array( 'v1' => true ),
     101                'allow_batch' => $this->allow_batch,
    94102                'schema'      => array( $this, 'get_public_item_schema' ),
    95103            )
  • trunk/tests/phpunit/tests/rest-api/rest-attachments-controller.php

    r51568 r52068  
    161161        $response = rest_get_server()->dispatch( $request );
    162162        $data     = $response->get_data();
     163        $this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][0] );
    163164        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    164165        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     
    175176        $response      = rest_get_server()->dispatch( $request );
    176177        $data          = $response->get_data();
     178        $this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][0] );
    177179        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    178180        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
  • trunk/tests/phpunit/tests/rest-api/rest-categories-controller.php

    r51568 r52068  
    118118        $response = rest_get_server()->dispatch( $request );
    119119        $data     = $response->get_data();
     120        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    120121        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    121122        $this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     
    125126        $response  = rest_get_server()->dispatch( $request );
    126127        $data      = $response->get_data();
     128        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    127129        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    128130        $this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
  • trunk/tests/phpunit/tests/rest-api/rest-pages-controller.php

    r51568 r52068  
    6565        $response = rest_get_server()->dispatch( $request );
    6666        $data     = $response->get_data();
    67         $keys     = array_keys( $data['endpoints'][0]['args'] );
     67        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
     68        $keys = array_keys( $data['endpoints'][0]['args'] );
    6869        sort( $keys );
    6970        $this->assertSame(
  • trunk/tests/phpunit/tests/rest-api/rest-posts-controller.php

    r51657 r52068  
    155155        $response = rest_get_server()->dispatch( $request );
    156156        $data     = $response->get_data();
     157        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    157158        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    158159        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     
    161162        $response = rest_get_server()->dispatch( $request );
    162163        $data     = $response->get_data();
     164        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    163165        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    164166        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
  • trunk/tests/phpunit/tests/rest-api/rest-server.php

    r51960 r52068  
    369369        $sent_headers = $result->get_headers();
    370370        $this->assertSame( $sent_headers['Allow'], 'POST' );
     371    }
     372
     373    /**
     374     * @ticket 53063
     375     */
     376    public function test_batched_options() {
     377        register_rest_route(
     378            'test-ns',
     379            '/test',
     380            array(
     381                array(
     382                    'methods'             => array( 'GET' ),
     383                    'callback'            => '__return_null',
     384                    'permission_callback' => '__return_true',
     385                ),
     386                array(
     387                    'methods'             => array( 'POST' ),
     388                    'callback'            => '__return_null',
     389                    'permission_callback' => '__return_null',
     390                    'allow_batch'         => false,
     391                ),
     392                'allow_batch' => array( 'v1' => true ),
     393            )
     394        );
     395
     396        $request  = new WP_REST_Request( 'OPTIONS', '/test-ns/test' );
     397        $response = rest_get_server()->dispatch( $request );
     398
     399        $data = $response->get_data();
     400
     401        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
     402        $this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][1] );
    371403    }
    372404
  • trunk/tests/phpunit/tests/rest-api/rest-tags-controller.php

    r51568 r52068  
    136136        $response = rest_get_server()->dispatch( $request );
    137137        $data     = $response->get_data();
     138        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    138139        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    139140        $this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     
    143144        $response = rest_get_server()->dispatch( $request );
    144145        $data     = $response->get_data();
     146        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
    145147        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
    146148        $this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
  • trunk/tests/phpunit/tests/rest-api/rest-widgets-controller.php

    r52031 r52068  
    15241524        $properties = $data['schema']['properties'];
    15251525
     1526        $this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
     1527
    15261528        $this->assertCount( 7, $properties );
    15271529        $this->assertArrayHasKey( 'id', $properties );
  • trunk/tests/qunit/fixtures/wp-api-generated.js

    r52062 r52068  
    262262                        "GET"
    263263                    ],
     264                    "allow_batch": {
     265                        "v1": true
     266                    },
    264267                    "args": {
    265268                        "context": {
     
    603606                        "POST"
    604607                    ],
     608                    "allow_batch": {
     609                        "v1": true
     610                    },
    605611                    "args": {
    606612                        "date": {
     
    841847                        "GET"
    842848                    ],
     849                    "allow_batch": {
     850                        "v1": true
     851                    },
    843852                    "args": {
    844853                        "id": {
     
    871880                        "PATCH"
    872881                    ],
     882                    "allow_batch": {
     883                        "v1": true
     884                    },
    873885                    "args": {
    874886                        "id": {
     
    10991111                        "DELETE"
    11001112                    ],
     1113                    "allow_batch": {
     1114                        "v1": true
     1115                    },
    11011116                    "args": {
    11021117                        "id": {
     
    15801595                        "GET"
    15811596                    ],
     1597                    "allow_batch": {
     1598                        "v1": true
     1599                    },
    15821600                    "args": {
    15831601                        "context": {
     
    17671785                        "POST"
    17681786                    ],
     1787                    "allow_batch": {
     1788                        "v1": true
     1789                    },
    17691790                    "args": {
    17701791                        "date": {
     
    19771998                        "GET"
    19781999                    ],
     2000                    "allow_batch": {
     2001                        "v1": true
     2002                    },
    19792003                    "args": {
    19802004                        "id": {
     
    20072031                        "PATCH"
    20082032                    ],
     2033                    "allow_batch": {
     2034                        "v1": true
     2035                    },
    20092036                    "args": {
    20102037                        "id": {
     
    22072234                        "DELETE"
    22082235                    ],
     2236                    "allow_batch": {
     2237                        "v1": true
     2238                    },
    22092239                    "args": {
    22102240                        "id": {
     
    33973427                        "GET"
    33983428                    ],
     3429                    "allow_batch": {
     3430                        "v1": true
     3431                    },
    33993432                    "args": {
    34003433                        "context": {
     
    35423575                        "POST"
    35433576                    ],
     3577                    "allow_batch": {
     3578                        "v1": true
     3579                    },
    35443580                    "args": {
    35453581                        "date": {
     
    36573693                        "GET"
    36583694                    ],
     3695                    "allow_batch": {
     3696                        "v1": true
     3697                    },
    36593698                    "args": {
    36603699                        "id": {
     
    36873726                        "PATCH"
    36883727                    ],
     3728                    "allow_batch": {
     3729                        "v1": true
     3730                    },
    36893731                    "args": {
    36903732                        "id": {
     
    37923834                        "DELETE"
    37933835                    ],
     3836                    "allow_batch": {
     3837                        "v1": true
     3838                    },
    37943839                    "args": {
    37953840                        "id": {
     
    46074652                        "GET"
    46084653                    ],
     4654                    "allow_batch": {
     4655                        "v1": true
     4656                    },
    46094657                    "args": {
    46104658                        "context": {
     
    53715419                        "POST"
    53725420                    ],
     5421                    "allow_batch": {
     5422                        "v1": true
     5423                    },
    53735424                    "args": {
    53745425                        "description": {
     
    54195470                        "GET"
    54205471                    ],
     5472                    "allow_batch": {
     5473                        "v1": true
     5474                    },
    54215475                    "args": {
    54225476                        "id": {
     
    54445498                        "PATCH"
    54455499                    ],
     5500                    "allow_batch": {
     5501                        "v1": true
     5502                    },
    54465503                    "args": {
    54475504                        "id": {
     
    54825539                        "DELETE"
    54835540                    ],
     5541                    "allow_batch": {
     5542                        "v1": true
     5543                    },
    54845544                    "args": {
    54855545                        "id": {
     
    55095569                        "GET"
    55105570                    ],
     5571                    "allow_batch": {
     5572                        "v1": true
     5573                    },
    55115574                    "args": {
    55125575                        "context": {
     
    56165679                        "POST"
    56175680                    ],
     5681                    "allow_batch": {
     5682                        "v1": true
     5683                    },
    56185684                    "args": {
    56195685                        "description": {
     
    56595725                        "GET"
    56605726                    ],
     5727                    "allow_batch": {
     5728                        "v1": true
     5729                    },
    56615730                    "args": {
    56625731                        "id": {
     
    56845753                        "PATCH"
    56855754                    ],
     5755                    "allow_batch": {
     5756                        "v1": true
     5757                    },
    56865758                    "args": {
    56875759                        "id": {
     
    57175789                        "DELETE"
    57185790                    ],
     5791                    "allow_batch": {
     5792                        "v1": true
     5793                    },
    57195794                    "args": {
    57205795                        "id": {
     
    76657740                        "GET"
    76667741                    ],
     7742                    "allow_batch": {
     7743                        "v1": true
     7744                    },
    76677745                    "args": {
    76687746                        "context": {
     
    76887766                        "POST"
    76897767                    ],
     7768                    "allow_batch": {
     7769                        "v1": true
     7770                    },
    76907771                    "args": {
    76917772                        "id": {
     
    77637844                        "GET"
    77647845                    ],
     7846                    "allow_batch": {
     7847                        "v1": true
     7848                    },
    77657849                    "args": {
    77667850                        "context": {
     
    77837867                        "PATCH"
    77847868                    ],
     7869                    "allow_batch": {
     7870                        "v1": true
     7871                    },
    77857872                    "args": {
    77867873                        "id": {
     
    78387925                        "DELETE"
    78397926                    ],
     7927                    "allow_batch": {
     7928                        "v1": true
     7929                    },
    78407930                    "args": {
    78417931                        "force": {
Note: See TracChangeset for help on using the changeset viewer.