WordPress.org

Make WordPress Core

Ticket #39953: 39953.2.diff

File 39953.2.diff, 12.1 KB (added by kadamwhite, 10 months ago)

Ran phpcbf on 39953.1.diff

  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index 491fc666a4..65b656cbab 100644
    function create_initial_post_types() { 
    337337        register_post_status(
    338338                'draft',
    339339                array(
    340                         'label'       => _x( 'Draft', 'post status' ),
    341                         'protected'   => true,
    342                         '_builtin'    => true, /* internal use only. */
     340                        'label'         => _x( 'Draft', 'post status' ),
     341                        'protected'     => true,
     342                        '_builtin'      => true, /* internal use only. */
    343343                        /* translators: %s: Number of draft posts. */
    344                         'label_count' => _n_noop(
     344                        'label_count'   => _n_noop(
    345345                                'Draft <span class="count">(%s)</span>',
    346346                                'Drafts <span class="count">(%s)</span>'
    347347                        ),
     348                        'date_floating' => true,
    348349                )
    349350        );
    350351
    function create_initial_post_types() { 
    394395        register_post_status(
    395396                'auto-draft',
    396397                array(
    397                         'label'    => 'auto-draft',
    398                         'internal' => true,
    399                         '_builtin' => true, /* internal use only. */
     398                        'label'         => 'auto-draft',
     399                        'internal'      => true,
     400                        '_builtin'      => true, /* internal use only. */
     401                        'date_floating' => true,
    400402                )
    401403        );
    402404
    function _wp_privacy_statuses() { 
    10181020 *                                                  the top of the edit listings,
    10191021 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
    10201022 *                                                  Default is value of $internal.
     1023 *     @type bool        $date_floating             Whether the post has a floating creation date.
     1024 *                                                  Default to false.
    10211025 * }
    10221026 * @return object
    10231027 */
    function register_post_status( $post_status, $args = array() ) { 
    10411045                'publicly_queryable'        => null,
    10421046                'show_in_admin_status_list' => null,
    10431047                'show_in_admin_all_list'    => null,
     1048                'date_floating'             => null,
    10441049        );
    10451050        $args     = wp_parse_args( $args, $defaults );
    10461051        $args     = (object) $args;
    function register_post_status( $post_status, $args = array() ) { 
    10851090                $args->show_in_admin_status_list = ! $args->internal;
    10861091        }
    10871092
     1093        if ( null === $args->date_floating ) {
     1094                $args->date_floating = false;
     1095        }
     1096
    10881097        if ( false === $args->label ) {
    10891098                $args->label = $post_status;
    10901099        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php
    index 155c8aaa96..c0cce245ba 100644
    class WP_REST_Post_Statuses_Controller extends WP_REST_Controller { 
    234234                        $data['slug'] = $status->name;
    235235                }
    236236
     237                if ( in_array( 'date_floating', $fields, true ) ) {
     238                        $data['date_floating'] = $status->date_floating;
     239                }
     240
    237241                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    238242                $data    = $this->add_additional_fields_to_object( $data, $request );
    239243                $data    = $this->filter_response_by_context( $data, $context );
    class WP_REST_Post_Statuses_Controller extends WP_REST_Controller { 
    277281                        'title'      => 'status',
    278282                        'type'       => 'object',
    279283                        'properties' => array(
    280                                 'name'         => array(
     284                                'name'          => array(
    281285                                        'description' => __( 'The title for the status.' ),
    282286                                        'type'        => 'string',
    283287                                        'context'     => array( 'embed', 'view', 'edit' ),
    284288                                        'readonly'    => true,
    285289                                ),
    286                                 'private'      => array(
     290                                'private'       => array(
    287291                                        'description' => __( 'Whether posts with this status should be private.' ),
    288292                                        'type'        => 'boolean',
    289293                                        'context'     => array( 'edit' ),
    290294                                        'readonly'    => true,
    291295                                ),
    292                                 'protected'    => array(
     296                                'protected'     => array(
    293297                                        'description' => __( 'Whether posts with this status should be protected.' ),
    294298                                        'type'        => 'boolean',
    295299                                        'context'     => array( 'edit' ),
    296300                                        'readonly'    => true,
    297301                                ),
    298                                 'public'       => array(
     302                                'public'        => array(
    299303                                        'description' => __( 'Whether posts of this status should be shown in the front end of the site.' ),
    300304                                        'type'        => 'boolean',
    301305                                        'context'     => array( 'view', 'edit' ),
    302306                                        'readonly'    => true,
    303307                                ),
    304                                 'queryable'    => array(
     308                                'queryable'     => array(
    305309                                        'description' => __( 'Whether posts with this status should be publicly-queryable.' ),
    306310                                        'type'        => 'boolean',
    307311                                        'context'     => array( 'view', 'edit' ),
    308312                                        'readonly'    => true,
    309313                                ),
    310                                 'show_in_list' => array(
     314                                'show_in_list'  => array(
    311315                                        'description' => __( 'Whether to include posts in the edit listing for their post type.' ),
    312316                                        'type'        => 'boolean',
    313317                                        'context'     => array( 'edit' ),
    314318                                        'readonly'    => true,
    315319                                ),
    316                                 'slug'         => array(
     320                                'slug'          => array(
    317321                                        'description' => __( 'An alphanumeric identifier for the status.' ),
    318322                                        'type'        => 'string',
    319323                                        'context'     => array( 'embed', 'view', 'edit' ),
    320324                                        'readonly'    => true,
    321325                                ),
     326                                'date_floating' => array(
     327                                        'description' => __( 'Whether posts of this status may have floating published dates.' ),
     328                                        'type'        => 'boolean',
     329                                        'context'     => array( 'view', 'edit' ),
     330                                        'readonly'    => true,
     331                                ),
    322332                        ),
    323333                );
    324334
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 883e9b31fe..c9f21de00d 100644
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    10211021
    10221022                // Post date.
    10231023                if ( ! empty( $schema['properties']['date'] ) && ! empty( $request['date'] ) ) {
    1024                         $date_data = rest_get_date_with_gmt( $request['date'] );
     1024                        $current_date = isset( $prepared_post->ID ) ? get_post( $prepared_post->ID )->post_date : false;
     1025                        $date_data    = rest_get_date_with_gmt( $request['date'] );
    10251026
    1026                         if ( ! empty( $date_data ) ) {
     1027                        if ( ! empty( $date_data ) && $current_date !== $date_data[0] ) {
    10271028                                list( $prepared_post->post_date, $prepared_post->post_date_gmt ) = $date_data;
    10281029                                $prepared_post->edit_date                                        = true;
    10291030                        }
    10301031                } elseif ( ! empty( $schema['properties']['date_gmt'] ) && ! empty( $request['date_gmt'] ) ) {
    1031                         $date_data = rest_get_date_with_gmt( $request['date_gmt'], true );
     1032                        $current_date = isset( $prepared_post->ID ) ? get_post( $prepared_post->ID )->post_date_gmt : false;
     1033                        $date_data    = rest_get_date_with_gmt( $request['date_gmt'], true );
    10321034
    1033                         if ( ! empty( $date_data ) ) {
     1035                        if ( ! empty( $date_data ) && $current_date !== $date_data[1] ) {
    10341036                                list( $prepared_post->post_date, $prepared_post->post_date_gmt ) = $date_data;
    10351037                                $prepared_post->edit_date                                        = true;
    10361038                        }
  • tests/phpunit/tests/rest-api/rest-post-statuses-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-post-statuses-controller.php tests/phpunit/tests/rest-api/rest-post-statuses-controller.php
    index 1fe933b008..bcf9475240 100644
    class WP_Test_REST_Post_Statuses_Controller extends WP_Test_REST_Controller_Test 
    153153                $response   = rest_get_server()->dispatch( $request );
    154154                $data       = $response->get_data();
    155155                $properties = $data['schema']['properties'];
    156                 $this->assertEquals( 7, count( $properties ) );
     156                $this->assertEquals( 8, count( $properties ) );
    157157                $this->assertArrayHasKey( 'name', $properties );
    158158                $this->assertArrayHasKey( 'private', $properties );
    159159                $this->assertArrayHasKey( 'protected', $properties );
    class WP_Test_REST_Post_Statuses_Controller extends WP_Test_REST_Controller_Test 
    161161                $this->assertArrayHasKey( 'queryable', $properties );
    162162                $this->assertArrayHasKey( 'show_in_list', $properties );
    163163                $this->assertArrayHasKey( 'slug', $properties );
     164                $this->assertArrayhasKey( 'date_floating', $properties );
    164165        }
    165166
    166167        public function test_get_additional_field_registration() {
    class WP_Test_REST_Post_Statuses_Controller extends WP_Test_REST_Controller_Test 
    217218                        ),
    218219                        array_keys( $links )
    219220                );
     221                $this->assertEquals( $status_obj->date_floating, $data['date_floating'] );
    220222        }
    221223
    222224        protected function check_post_status_object_response( $response ) {
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-posts-controller.php tests/phpunit/tests/rest-api/rest-posts-controller.php
    index 95e8ee11c2..0222105108 100644
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    43534353
    43544354        }
    43554355
     4356        public function test_putting_same_publish_date_does_not_remove_floating_date() {
     4357
     4358                wp_set_current_user( self::$superadmin_id );
     4359
     4360                $time = date( 'Y-m-d H:i:s' );
     4361
     4362                $post = self::factory()->post->create_and_get(
     4363                        array(
     4364                                'post_status' => 'draft',
     4365                                'post_date'   => $time,
     4366                        )
     4367                );
     4368
     4369                $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     4370
     4371                $get = new WP_REST_Request( 'GET', "/wp/v2/posts/{$post->ID}" );
     4372                $get->set_query_params( array( 'context' => 'edit' ) );
     4373
     4374                $get      = rest_get_server()->dispatch( $get );
     4375                $get_body = $get->get_data();
     4376
     4377                $put = new WP_REST_Request( 'PUT', "/wp/v2/posts/{$post->ID}" );
     4378                $put->set_body_params( $get_body );
     4379
     4380                $response = rest_get_server()->dispatch( $put );
     4381                $body     = $response->get_data();
     4382
     4383                $this->assertEquals( $get_body['date'], $body['date'] );
     4384                $this->assertEquals( $get_body['date_gmt'], $body['date_gmt'] );
     4385
     4386                $this->assertEquals( '0000-00-00 00:00:00', get_post( $post->ID )->post_date_gmt );
     4387        }
     4388
     4389        public function test_putting_different_publish_date_removes_floating_date() {
     4390
     4391                wp_set_current_user( self::$superadmin_id );
     4392
     4393                $time     = date( 'Y-m-d H:i:s' );
     4394                $new_time = date( 'Y-m-d H:i:s', strtotime( '+1 week' ) );
     4395
     4396                $post = self::factory()->post->create_and_get(
     4397                        array(
     4398                                'post_status' => 'draft',
     4399                                'post_date'   => $time,
     4400                        )
     4401                );
     4402
     4403                $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     4404
     4405                $get = new WP_REST_Request( 'GET', "/wp/v2/posts/{$post->ID}" );
     4406                $get->set_query_params( array( 'context' => 'edit' ) );
     4407
     4408                $get      = rest_get_server()->dispatch( $get );
     4409                $get_body = $get->get_data();
     4410
     4411                $put = new WP_REST_Request( 'PUT', "/wp/v2/posts/{$post->ID}" );
     4412                $put->set_body_params(
     4413                        array_merge(
     4414                                $get_body,
     4415                                array(
     4416                                        'date' => mysql_to_rfc3339( $new_time ),
     4417                                )
     4418                        )
     4419                );
     4420
     4421                $response = rest_get_server()->dispatch( $put );
     4422                $body     = $response->get_data();
     4423
     4424                $this->assertEquals( mysql_to_rfc3339( $new_time ), $body['date'] );
     4425
     4426                $this->assertNotEquals( '0000-00-00 00:00:00', get_post( $post->ID )->post_date_gmt );
     4427        }
     4428
     4429        public function test_publishing_post_with_same_date_removes_floating_date() {
     4430
     4431                wp_set_current_user( self::$superadmin_id );
     4432
     4433                $time = date( 'Y-m-d H:i:s' );
     4434
     4435                $post = self::factory()->post->create_and_get(
     4436                        array(
     4437                                'post_status' => 'draft',
     4438                                'post_date'   => $time,
     4439                        )
     4440                );
     4441
     4442                $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     4443
     4444                $get = new WP_REST_Request( 'GET', "/wp/v2/posts/{$post->ID}" );
     4445                $get->set_query_params( array( 'context' => 'edit' ) );
     4446
     4447                $get      = rest_get_server()->dispatch( $get );
     4448                $get_body = $get->get_data();
     4449
     4450                $put = new WP_REST_Request( 'PUT', "/wp/v2/posts/{$post->ID}" );
     4451                $put->set_body_params(
     4452                        array_merge(
     4453                                $get_body,
     4454                                array(
     4455                                        'status' => 'publish',
     4456                                )
     4457                        )
     4458                );
     4459
     4460                $response = rest_get_server()->dispatch( $put );
     4461                $body     = $response->get_data();
     4462
     4463                $this->assertEquals( $get_body['date'], $body['date'] );
     4464                $this->assertEquals( $get_body['date_gmt'], $body['date_gmt'] );
     4465
     4466                $this->assertNotEquals( '0000-00-00 00:00:00', get_post( $post->ID )->post_date_gmt );
     4467        }
     4468
    43564469        public function tearDown() {
    43574470                _unregister_post_type( 'private-post' );
    43584471                _unregister_post_type( 'youseeme' );