WordPress.org

Make WordPress Core

Ticket #45017: 45017.4.diff

File 45017.4.diff, 11.1 KB (added by danielbachhuber, 2 years ago)
  • 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 42ceec93d8..3465271a11 100644
    a b class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15751575                        }
    15761576                }
    15771577
     1578                $post_type_obj = get_post_type_object( $post->post_type );
     1579                if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public  ) {
     1580
     1581                        if ( ! function_exists( 'get_sample_permalink' ) ) {
     1582                                require_once ABSPATH . '/wp-admin/includes/post.php';
     1583                        }
     1584
     1585                        $sample_permalink = get_sample_permalink( $post->ID, $post->post_title, '' );
     1586
     1587                        if ( in_array( 'permalink_template', $fields, true ) ) {
     1588                                $data['permalink_template'] = $sample_permalink[0];
     1589                        }
     1590                        if ( in_array( 'generated_slug', $fields, true ) ) {
     1591                                $data['generated_slug'] = $sample_permalink[1];
     1592                        }
     1593                }
     1594
    15781595                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    15791596                $data    = $this->add_additional_fields_to_object( $data, $request );
    15801597                $data    = $this->filter_response_by_context( $data, $context );
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    19071924                );
    19081925
    19091926                $post_type_obj = get_post_type_object( $this->post_type );
     1927                if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public ) {
     1928                        $schema['properties']['permalink_template'] = array(
     1929                                'description' => __( 'Permalink template for the object.' ),
     1930                                'type'        => 'string',
     1931                                'context'     => array( 'edit' ),
     1932                                'readonly'    => true,
     1933                        );
     1934
     1935                        $schema['properties']['generated_slug'] = array(
     1936                                'description' => __( 'Slug automatically generated from the object title.' ),
     1937                                'type'        => 'string',
     1938                                'context'     => array( 'edit' ),
     1939                                'readonly'    => true,
     1940                        );
     1941                }
    19101942
    19111943                if ( $post_type_obj->hierarchical ) {
    19121944                        $schema['properties']['parent'] = array(
  • tests/phpunit/includes/testcase-rest-controller.php

    diff --git a/tests/phpunit/includes/testcase-rest-controller.php b/tests/phpunit/includes/testcase-rest-controller.php
    index 04e1cf2f96..3087bcd7b7 100644
    a b abstract class WP_Test_REST_Controller_Testcase extends WP_Test_REST_TestCase { 
    4040        abstract public function test_get_item_schema();
    4141
    4242        public function filter_rest_url_for_leading_slash( $url, $path ) {
    43                 if ( is_multisite() ) {
     43                if ( is_multisite() || get_option( 'permalink_structure' ) ) {
    4444                        return $url;
    4545                }
    4646
  • tests/phpunit/tests/rest-api/rest-attachments-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-attachments-controller.php b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
    index d17dfdf20b..a5ca6b8c74 100644
    a b class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    11141114                $response = $this->server->dispatch( $request );
    11151115                $data = $response->get_data();
    11161116                $properties = $data['schema']['properties'];
    1117                 $this->assertEquals( 24, count( $properties ) );
     1117                $this->assertEquals( 26, count( $properties ) );
    11181118                $this->assertArrayHasKey( 'author', $properties );
    11191119                $this->assertArrayHasKey( 'alt_text', $properties );
    11201120                $this->assertArrayHasKey( 'caption', $properties );
    class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    11261126                $this->assertArrayHasKey( 'comment_status', $properties );
    11271127                $this->assertArrayHasKey( 'date', $properties );
    11281128                $this->assertArrayHasKey( 'date_gmt', $properties );
     1129                $this->assertArrayHasKey( 'generated_slug', $properties );
    11291130                $this->assertArrayHasKey( 'guid', $properties );
    11301131                $this->assertArrayHasKey( 'id', $properties );
    11311132                $this->assertArrayHasKey( 'link', $properties );
    class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    11371138                $this->assertArrayHasKey( 'modified_gmt', $properties );
    11381139                $this->assertArrayHasKey( 'post', $properties );
    11391140                $this->assertArrayHasKey( 'ping_status', $properties );
     1141                $this->assertArrayHasKey( 'permalink_template', $properties );
    11401142                $this->assertArrayHasKey( 'status', $properties );
    11411143                $this->assertArrayHasKey( 'slug', $properties );
    11421144                $this->assertArrayHasKey( 'source_url', $properties );
  • tests/phpunit/tests/rest-api/rest-pages-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-pages-controller.php b/tests/phpunit/tests/rest-api/rest-pages-controller.php
    index 6df9d968dc..0b02ad138b 100644
    a b class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    525525                $response = $this->server->dispatch( $request );
    526526                $data = $response->get_data();
    527527                $properties = $data['schema']['properties'];
    528                 $this->assertEquals( 22, count( $properties ) );
     528                $this->assertEquals( 24, count( $properties ) );
    529529                $this->assertArrayHasKey( 'author', $properties );
    530530                $this->assertArrayHasKey( 'comment_status', $properties );
    531531                $this->assertArrayHasKey( 'content', $properties );
    532532                $this->assertArrayHasKey( 'date', $properties );
    533533                $this->assertArrayHasKey( 'date_gmt', $properties );
     534                $this->assertArrayHasKey( 'generated_slug', $properties );
    534535                $this->assertArrayHasKey( 'guid', $properties );
    535536                $this->assertArrayHasKey( 'excerpt', $properties );
    536537                $this->assertArrayHasKey( 'featured_media', $properties );
    class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    542543                $this->assertArrayHasKey( 'modified_gmt', $properties );
    543544                $this->assertArrayHasKey( 'parent', $properties );
    544545                $this->assertArrayHasKey( 'password', $properties );
     546                $this->assertArrayHasKey( 'permalink_template', $properties );
    545547                $this->assertArrayHasKey( 'ping_status', $properties );
    546548                $this->assertArrayHasKey( 'slug', $properties );
    547549                $this->assertArrayHasKey( 'status', $properties );
  • 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 ec38bd7a85..a51fa59d13 100644
    a b class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    30943094                $response = $this->server->dispatch( $request );
    30953095                $data = $response->get_data();
    30963096                $properties = $data['schema']['properties'];
    3097                 $this->assertEquals( 24, count( $properties ) );
     3097                $this->assertEquals( 26, count( $properties ) );
    30983098                $this->assertArrayHasKey( 'author', $properties );
    30993099                $this->assertArrayHasKey( 'comment_status', $properties );
    31003100                $this->assertArrayHasKey( 'content', $properties );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    31023102                $this->assertArrayHasKey( 'date_gmt', $properties );
    31033103                $this->assertArrayHasKey( 'excerpt', $properties );
    31043104                $this->assertArrayHasKey( 'featured_media', $properties );
     3105                $this->assertArrayHasKey( 'generated_slug', $properties );
    31053106                $this->assertArrayHasKey( 'guid', $properties );
    31063107                $this->assertArrayHasKey( 'format', $properties );
    31073108                $this->assertArrayHasKey( 'id', $properties );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    31103111                $this->assertArrayHasKey( 'modified', $properties );
    31113112                $this->assertArrayHasKey( 'modified_gmt', $properties );
    31123113                $this->assertArrayHasKey( 'password', $properties );
     3114                $this->assertArrayHasKey( 'permalink_template', $properties );
    31133115                $this->assertArrayHasKey( 'ping_status', $properties );
    31143116                $this->assertArrayHasKey( 'slug', $properties );
    31153117                $this->assertArrayHasKey( 'status', $properties );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    31793181                        'excerpt',
    31803182                        'featured_media',
    31813183                        'format',
     3184                        'generated_slug',
    31823185                        'guid',
    31833186                        'id',
    31843187                        'link',
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    31863189                        'modified',
    31873190                        'modified_gmt',
    31883191                        'password',
     3192                        'permalink_template',
    31893193                        'ping_status',
    31903194                        'slug',
    31913195                        'status',
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    36843688                $this->assertArrayNotHasKey( 'https://api.w.org/action-unfiltered-html', $links );
    36853689        }
    36863690
     3691        public function test_generated_permalink_template_generated_slug_for_non_viewable_posts() {
     3692                register_post_type(
     3693                        'private-post',
     3694                        array(
     3695                                'label'              => 'Private Posts',
     3696                                'supports'           => array( 'title', 'editor', 'author' ),
     3697                                'show_in_rest'       => true,
     3698                                'publicly_queryable' => false,
     3699                                'public'             => true,
     3700                                'rest_base'          => 'private-post',
     3701                        )
     3702                );
     3703                create_initial_rest_routes();
     3704
     3705                wp_set_current_user( self::$editor_id );
     3706
     3707                $post_id = $this->factory->post->create(
     3708                        array(
     3709                                'post_title'  => 'Permalink Template',
     3710                                'post_type'   => 'private-post',
     3711                                'post_status' => 'draft',
     3712                        )
     3713                );
     3714
     3715                // Neither 'permalink_template' and 'generated_slug' are expected for this post type.
     3716                $request = new WP_REST_Request( 'GET', '/wp/v2/private-post/' . $post_id );
     3717                $request->set_param( 'context', 'edit' );
     3718                $response = rest_get_server()->dispatch( $request );
     3719                $data     = $response->get_data();
     3720                $this->assertEquals( 200, $response->get_status() );
     3721                $this->assertArrayNotHasKey( 'permalink_template', $data );
     3722                $this->assertArrayNotHasKey( 'generated_slug', $data );
     3723        }
     3724
     3725        public function test_generated_permalink_template_generated_slug_for_posts() {
     3726                $this->set_permalink_structure( '/%postname%/' );
     3727                $expected_permalink_template = trailingslashit( home_url( '/%postname%/' ) );
     3728
     3729                wp_set_current_user( self::$editor_id );
     3730
     3731                $post_id = $this->factory->post->create(
     3732                        array(
     3733                                'post_title'  => 'Permalink Template',
     3734                                'post_type'   => 'post',
     3735                                'post_status' => 'draft',
     3736                        )
     3737                );
     3738
     3739                // Both 'permalink_template' and 'generated_slug' are expected for context=edit.
     3740                $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . $post_id );
     3741                $request->set_param( 'context', 'edit' );
     3742                $response = rest_get_server()->dispatch( $request );
     3743                $data     = $response->get_data();
     3744                $this->assertEquals( 200, $response->get_status() );
     3745                $this->assertEquals( $expected_permalink_template, $data['permalink_template'] );
     3746                $this->assertEquals( 'permalink-template', $data['generated_slug'] );
     3747
     3748                // Neither 'permalink_template' and 'generated_slug' are expected for context=view.
     3749                $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . $post_id );
     3750                $request->set_param( 'context', 'view' );
     3751                $response = rest_get_server()->dispatch( $request );
     3752                $data     = $response->get_data();
     3753                $this->assertEquals( 200, $response->get_status() );
     3754                $this->assertArrayNotHasKey( 'permalink_template', $data );
     3755                $this->assertArrayNotHasKey( 'generated_slug', $data );
     3756
     3757        }
     3758
    36873759        public function tearDown() {
     3760                _unregister_post_type( 'private-post' );
    36883761                _unregister_post_type( 'youseeeme' );
    36893762                if ( isset( $this->attachment_id ) ) {
    36903763                        $this->remove_added_uploads();