WordPress.org

Make WordPress Core

Ticket #45677: 45677.9.diff

File 45677.9.diff, 10.1 KB (added by TimothyBlynJacobs, 19 months ago)
  • src/wp-includes/rest-api.php

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 5ec557547c..80681d3845 100644
    a b function rest_api_default_filters() { 
    191191 * @since 4.7.0
    192192 */
    193193function create_initial_rest_routes() {
    194         foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
    195                 $class = ! empty( $post_type->rest_controller_class ) ? $post_type->rest_controller_class : 'WP_REST_Posts_Controller';
     194        foreach ( get_post_types( array( 'show_in_rest' => true ) ) as $post_type ) {
     195                $controller = WP_REST_Posts_Controller::get_for_post_type( $post_type );
    196196
    197                 if ( ! class_exists( $class ) ) {
    198                         continue;
    199                 }
    200                 $controller = new $class( $post_type->name );
    201                 if ( ! is_subclass_of( $controller, 'WP_REST_Controller' ) ) {
     197                if ( ! $controller ) {
    202198                        continue;
    203199                }
    204200
    205201                $controller->register_routes();
    206202
    207                 if ( post_type_supports( $post_type->name, 'revisions' ) ) {
    208                         $revisions_controller = new WP_REST_Revisions_Controller( $post_type->name );
     203                if ( post_type_supports( $post_type, 'revisions' ) ) {
     204                        $revisions_controller = new WP_REST_Revisions_Controller( $post_type );
    209205                        $revisions_controller->register_routes();
    210206                }
    211207
    212                 if ( 'attachment' !== $post_type->name ) {
    213                         $autosaves_controller = new WP_REST_Autosaves_Controller( $post_type->name );
     208                if ( 'attachment' !== $post_type ) {
     209                        $autosaves_controller = new WP_REST_Autosaves_Controller( $post_type );
    214210                        $autosaves_controller->register_routes();
    215211                }
    216212        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php
    index e55d3a3729..7f54d59f0a 100644
    a b class WP_REST_Autosaves_Controller extends WP_REST_Revisions_Controller { 
    5757         * @param string $parent_post_type Post type of the parent.
    5858         */
    5959        public function __construct( $parent_post_type ) {
    60                 $this->parent_post_type = $parent_post_type;
    61                 $post_type_object       = get_post_type_object( $parent_post_type );
     60                $parent_controller = WP_REST_Posts_Controller::get_for_post_type( $parent_post_type );
    6261
    63                 // Ensure that post type-specific controller logic is available.
    64                 $parent_controller_class = ! empty( $post_type_object->rest_controller_class ) ? $post_type_object->rest_controller_class : 'WP_REST_Posts_Controller';
     62                if ( ! $parent_controller ) {
     63                        $parent_controller = new WP_REST_Posts_Controller( $parent_post_type );
     64                }
    6565
    66                 $this->parent_controller    = new $parent_controller_class( $post_type_object->name );
     66                $this->parent_post_type     = $parent_post_type;
     67                $post_type_object           = get_post_type_object( $parent_post_type );
     68                $this->parent_controller    = $parent_controller;
    6769                $this->revisions_controller = new WP_REST_Revisions_Controller( $parent_post_type );
    6870                $this->rest_namespace       = 'wp/v2';
    6971                $this->rest_base            = 'autosaves';
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php
    index b730844fde..7e960e8758 100644
    a b class WP_REST_Comments_Controller extends WP_REST_Controller { 
    15821582         * @return bool Whether post can be read.
    15831583         */
    15841584        protected function check_read_post_permission( $post, $request ) {
    1585                 $posts_controller = new WP_REST_Posts_Controller( $post->post_type );
    1586                 $post_type        = get_post_type_object( $post->post_type );
     1585                $posts_controller = WP_REST_Posts_Controller::get_for_post_type( $post->post_type );
     1586
     1587                // We need to specifically assert that the posts controller is a WP_REST_Posts_Controller instance,
     1588                // and not just check that we have a valid controller as we use Posts Controller specific methods.
     1589                if ( ! $posts_controller instanceof WP_REST_Posts_Controller ) {
     1590                        $posts_controller = new WP_REST_Posts_Controller( $post->post_type );
     1591                }
     1592
     1593                $post_type = get_post_type_object( $post->post_type );
    15871594
    15881595                $has_password_filter = false;
    15891596
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 090ca2a5da..1e9b90db68 100644
    a b  
    1616 */
    1717class WP_REST_Posts_Controller extends WP_REST_Controller {
    1818
     19        /**
     20         * Instances of post type controllers keyed by post type.
     21         *
     22         * @since 5.3.0
     23         * @var WP_REST_Controller[]
     24         */
     25        private static $post_type_controllers = array();
     26
    1927        /**
    2028         * Post type.
    2129         *
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    4856                $this->meta = new WP_REST_Post_Meta_Fields( $this->post_type );
    4957        }
    5058
     59        /**
     60         * Gets the REST API controller for a post type.
     61         *
     62         * @since 5.3.0
     63         *
     64         * @param string $post_type
     65         * @return WP_REST_Controller|null The controller instance, or null if the specified is invalid or the post type
     66         *                                 is set not to show in rest.
     67         */
     68        public static function get_for_post_type( $post_type ) {
     69                if ( array_key_exists( $post_type, self::$post_type_controllers ) ) {
     70                        return self::$post_type_controllers[ $post_type ];
     71                }
     72
     73                $definition = get_post_type_object( $post_type );
     74
     75                if ( ! $definition || ! $definition->show_in_rest ) {
     76                        self::$post_type_controllers[ $post_type ] = null;
     77
     78                        return self::$post_type_controllers[ $post_type ];
     79                }
     80
     81                $class = $definition->rest_controller_class ? $definition->rest_controller_class : WP_REST_Posts_Controller::class;
     82
     83                if ( ! class_exists( $class ) ) {
     84                        self::$post_type_controllers[ $post_type ] = null;
     85
     86                        return self::$post_type_controllers[ $post_type ];
     87                }
     88
     89                if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) {
     90                        self::$post_type_controllers[ $post_type ] = null;
     91
     92                        return self::$post_type_controllers[ $post_type ];
     93                }
     94
     95                self::$post_type_controllers[ $post_type ] = new $class( $post_type );
     96
     97                return self::$post_type_controllers[ $post_type ];
     98        }
     99
    51100        /**
    52101         * Registers the routes for the objects of the controller.
    53102         *
  • src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php
    index 52df0f2206..ecced9f6df 100644
    a b class WP_REST_Revisions_Controller extends WP_REST_Controller { 
    4848         * @param string $parent_post_type Post type of the parent.
    4949         */
    5050        public function __construct( $parent_post_type ) {
     51                $parent_controller = WP_REST_Posts_Controller::get_for_post_type( $parent_post_type );
     52
     53                if ( ! $parent_controller ) {
     54                        $parent_controller = new WP_REST_Posts_Controller( $parent_post_type );
     55                }
     56
    5157                $this->parent_post_type  = $parent_post_type;
    52                 $this->parent_controller = new WP_REST_Posts_Controller( $parent_post_type );
     58                $this->parent_controller = $parent_controller;
    5359                $this->namespace         = 'wp/v2';
    5460                $this->rest_base         = 'revisions';
    5561                $post_type_object        = get_post_type_object( $parent_post_type );
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
    index f03eee8e83..1513b56abb 100644
    a b class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    42774277
    42784278        }
    42794279
     4280        /**
     4281         * @ticket 45677
     4282         */
     4283        public function test_get_for_post_type_reuses_same_instance() {
     4284                $this->assertSame(
     4285                        WP_REST_Posts_Controller::get_for_post_type( 'post' ),
     4286                        WP_REST_Posts_Controller::get_for_post_type( 'post' )
     4287                );
     4288        }
     4289
     4290        /**
     4291         * @ticket 45677
     4292         */
     4293        public function test_get_for_post_type_returns_null_for_non_existent_post_type() {
     4294                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'doesnotexist' ) );
     4295        }
     4296
     4297        /**
     4298         * @ticket 45677
     4299         */
     4300        public function test_get_for_post_type_returns_null_if_post_type_does_not_show_in_rest() {
     4301                register_post_type(
     4302                        'not_in_rest',
     4303                        array(
     4304                                'show_in_rest' => false,
     4305                        )
     4306                );
     4307
     4308                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'not_in_rest' ) );
     4309        }
     4310
     4311        /**
     4312         * @ticket 45677
     4313         */
     4314        public function test_get_for_post_type_returns_null_if_class_does_not_exist() {
     4315                register_post_type(
     4316                        'class_not_found',
     4317                        array(
     4318                                'show_in_rest'          => true,
     4319                                'rest_controller_class' => 'Class_That_Does_Not_Exist',
     4320                        )
     4321                );
     4322
     4323                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'class_not_found' ) );
     4324        }
     4325
     4326        /**
     4327         * @ticket 45677
     4328         */
     4329        public function test_get_for_post_type_returns_null_if_class_does_not_subclass_rest_controller() {
     4330                register_post_type(
     4331                        'invalid_class',
     4332                        array(
     4333                                'show_in_rest'          => true,
     4334                                'rest_controller_class' => 'WP_Post',
     4335                        ),
     4336                );
     4337
     4338                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'invalid_class' ) );
     4339        }
     4340
     4341        /**
     4342         * @ticket 45677
     4343         */
     4344        public function test_get_for_post_type_returns_posts_controller_if_custom_class_not_specified() {
     4345                register_post_type(
     4346                        'test',
     4347                        array(
     4348                                'show_in_rest' => true,
     4349                        )
     4350                );
     4351
     4352                $this->assertInstanceOf(
     4353                        WP_REST_Posts_Controller::class,
     4354                        WP_REST_Posts_Controller::get_for_post_type( 'test' )
     4355                );
     4356        }
     4357
     4358        /**
     4359         * @ticket 45677
     4360         */
     4361        public function test_get_for_post_type_returns_provided_controller_class() {
     4362                $this->assertInstanceOf(
     4363                        WP_REST_Blocks_Controller::class,
     4364                        WP_REST_Posts_Controller::get_for_post_type( 'wp_block' )
     4365                );
     4366        }
     4367
    42804368        public function tearDown() {
    42814369                _unregister_post_type( 'private-post' );
    42824370                _unregister_post_type( 'youseeme' );