Make WordPress Core


Ignore:
Timestamp:
10/31/2021 11:15:10 PM (3 years ago)
Author:
TimothyBlynJacobs
Message:

REST API: Support custom namespaces for custom post types.

While a custom post type can define a custom route by using the rest_base argument, a namespace of wp/v2 was assumed. This commit introduces support for a rest_namespace argument.

A new rest_get_route_for_post_type_items function has been introduced and the rest_get_route_for_post function updated to facilitate getting the correct route for custom post types.

While the WordPress Core Block Editor bootstrap code has been updated to use these API functions, for maximum compatibility sticking with the default wp/v2 namespace is recommended until the API functions see wider use.

Props spacedmonkey, swissspidy.
Fixes #53656.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php

    r51961 r51962  
    181181        $taxonomies = wp_list_pluck( $taxonomies, 'name' );
    182182        $base       = ! empty( $post_type->rest_base ) ? $post_type->rest_base : $post_type->name;
     183        $namespace  = ! empty( $post_type->rest_namespace ) ? $post_type->rest_namespace : 'wp/v2';
    183184        $supports   = get_all_post_type_supports( $post_type->name );
    184185
     
    233234        }
    234235
     236        if ( in_array( 'rest_namespace', $fields, true ) ) {
     237            $data['rest_namespace'] = $namespace;
     238        }
     239
    235240        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    236241        $data    = $this->add_additional_fields_to_object( $data, $request );
     
    246251                ),
    247252                'https://api.w.org/items' => array(
    248                     'href' => rest_url( sprintf( 'wp/v2/%s', $base ) ),
     253                    'href' => rest_url( rest_get_route_for_post_type_items( $post_type->name ) ),
    249254                ),
    250255            )
     
    270275     * @since 4.7.0
    271276     * @since 4.8.0 The `supports` property was added.
    272      * @since 5.9.0 The `visibility` property was added.
     277     * @since 5.9.0 The `visibility` and `rest_namespace` properties were added.
    273278     *
    274279     * @return array Item schema data.
     
    284289            'type'       => 'object',
    285290            'properties' => array(
    286                 'capabilities' => array(
     291                'capabilities'   => array(
    287292                    'description' => __( 'All capabilities used by the post type.' ),
    288293                    'type'        => 'object',
     
    290295                    'readonly'    => true,
    291296                ),
    292                 'description'  => array(
     297                'description'    => array(
    293298                    'description' => __( 'A human-readable description of the post type.' ),
    294299                    'type'        => 'string',
     
    296301                    'readonly'    => true,
    297302                ),
    298                 'hierarchical' => array(
     303                'hierarchical'   => array(
    299304                    'description' => __( 'Whether or not the post type should have children.' ),
    300305                    'type'        => 'boolean',
     
    302307                    'readonly'    => true,
    303308                ),
    304                 'viewable'     => array(
     309                'viewable'       => array(
    305310                    'description' => __( 'Whether or not the post type can be viewed.' ),
    306311                    'type'        => 'boolean',
     
    308313                    'readonly'    => true,
    309314                ),
    310                 'labels'       => array(
     315                'labels'         => array(
    311316                    'description' => __( 'Human-readable labels for the post type for various contexts.' ),
    312317                    'type'        => 'object',
     
    314319                    'readonly'    => true,
    315320                ),
    316                 'name'         => array(
     321                'name'           => array(
    317322                    'description' => __( 'The title for the post type.' ),
    318323                    'type'        => 'string',
     
    320325                    'readonly'    => true,
    321326                ),
    322                 'slug'         => array(
     327                'slug'           => array(
    323328                    'description' => __( 'An alphanumeric identifier for the post type.' ),
    324329                    'type'        => 'string',
     
    326331                    'readonly'    => true,
    327332                ),
    328                 'supports'     => array(
     333                'supports'       => array(
    329334                    'description' => __( 'All features, supported by the post type.' ),
    330335                    'type'        => 'object',
     
    332337                    'readonly'    => true,
    333338                ),
    334                 'taxonomies'   => array(
     339                'taxonomies'     => array(
    335340                    'description' => __( 'Taxonomies associated with post type.' ),
    336341                    'type'        => 'array',
     
    341346                    'readonly'    => true,
    342347                ),
    343                 'rest_base'    => array(
     348                'rest_base'      => array(
    344349                    'description' => __( 'REST base route for the post type.' ),
    345350                    'type'        => 'string',
     
    347352                    'readonly'    => true,
    348353                ),
    349                 'visibility'   => array(
     354                'rest_namespace' => array(
     355                    'description' => __( 'REST route\'s namespace for the post type.' ),
     356                    'type'        => 'string',
     357                    'context'     => array( 'view', 'edit', 'embed' ),
     358                    'readonly'    => true,
     359                ),
     360                'visibility'     => array(
    350361                    'description' => __( 'The visibility settings for the post type.' ),
    351362                    'type'        => 'object',
Note: See TracChangeset for help on using the changeset viewer.