Make WordPress Core

Ticket #45677: 45677.5.diff

File 45677.5.diff, 9.3 KB (added by TimothyBlynJacobs, 5 years 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..5ca9ce35bb 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                if ( ! $posts_controller instanceof WP_REST_Posts_Controller ) {
     1588                        $posts_controller = new WP_REST_Posts_Controller( $post->post_type );
     1589                }
     1590
     1591                $post_type = get_post_type_object( $post->post_type );
    15871592
    15881593                $has_password_filter = false;
    15891594
  • 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..8fee7e7110 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 ) {
     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..d0300f2206 100644
    a b class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    42774277
    42784278        }
    42794279
     4280        public function test_get_for_post_type_reuses_same_instance() {
     4281                $this->assertSame(
     4282                        WP_REST_Posts_Controller::get_for_post_type( 'post' ),
     4283                        WP_REST_Posts_Controller::get_for_post_type( 'post' )
     4284                );
     4285        }
     4286
     4287        public function test_get_for_post_type_returns_null_for_non_existent_post_type() {
     4288                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'doesnotexist' ) );
     4289        }
     4290
     4291        public function test_get_for_post_type_returns_null_if_class_does_not_exist() {
     4292                register_post_type(
     4293                        'class_not_found',
     4294                        array(
     4295                                'show_in_rest'          => true,
     4296                                'rest_controller_class' => 'Class_That_Does_Not_Exist',
     4297                        )
     4298                );
     4299
     4300                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'class_not_found' ) );
     4301        }
     4302
     4303        public function test_get_for_post_type_returns_null_if_class_does_not_subclass_rest_controller() {
     4304                register_post_type(
     4305                        'invalid_class',
     4306                        array(
     4307                                'show_in_rest'          => true,
     4308                                'rest_controller_class' => 'WP_Post',
     4309                        ),
     4310                );
     4311
     4312                $this->assertNull( WP_REST_Posts_Controller::get_for_post_type( 'invalid_class' ) );
     4313        }
     4314
     4315        public function test_get_for_post_type_returns_posts_controller_if_custom_class_not_specified() {
     4316                register_post_type(
     4317                        'test',
     4318                        array(
     4319                                'show_in_rest' => true,
     4320                        )
     4321                );
     4322
     4323                $this->assertInstanceOf(
     4324                        WP_REST_Posts_Controller::class,
     4325                        WP_REST_Posts_Controller::get_for_post_type( 'test' )
     4326                );
     4327        }
     4328
     4329        public function test_get_for_post_type_returns_provided_controller_class() {
     4330                $this->assertInstanceOf(
     4331                        WP_REST_Blocks_Controller::class,
     4332                        WP_REST_Posts_Controller::get_for_post_type( 'wp_block' )
     4333                );
     4334        }
     4335
    42804336        public function tearDown() {
    42814337                _unregister_post_type( 'private-post' );
    42824338                _unregister_post_type( 'youseeme' );