Make WordPress Core

Changeset 56802


Ignore:
Timestamp:
10/08/2023 08:08:08 PM (3 years ago)
Author:
joedolson
Message:

Quick/Bulk Edit: Fix inability to quick edit draft post date.

Follow up to [56022] to fix inability to set a date/time in quick editing. Allow a user to set a quick/edit date while preventing accidental date assignments per the original intent.

Props tristanleboss, ivanzhuck, tibbsa, sabernhardt, sergeybiryukov, oandregal, khokansardar, joedolson, shailu25.
Fixes #59125. See #19907.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/js/_enqueues/admin/inline-edit-post.js

    r56712 r56802  
    492492
    493493                fields = $('#edit-'+id).find(':input').serialize();
    494 
    495                 var status = $(':input[name="_status"]').val();
    496 
    497                 if ( [ 'draft', 'pending', 'auto-draft' ].includes( status ) ) {
    498                         params.edit_date = 'false';
    499                 }
    500 
    501494                params = fields + '&' + $.param(params);
    502495
  • trunk/src/wp-admin/includes/post.php

    r56752 r56802  
    170170                        break;
    171171                }
    172         }
    173 
    174         if ( isset( $post_data['edit_date'] ) && 'false' === $post_data['edit_date'] ) {
    175                 $post_data['edit_date'] = false;
    176172        }
    177173
     
    198194                }
    199195
    200                 $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
     196                /*
     197                 * Only assign a post date if the user has explicitly set a new value.
     198                 * See #59125 and #19907.
     199                 */
     200                $previous_date = $post_id ? get_post_field( 'post_date', $post_id ) : false;
     201                if ( $previous_date && $previous_date !== $post_data['post_date'] ) {
     202                        $post_data['edit_date']     = true;
     203                        $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
     204                } else {
     205                        $post_data['edit_date'] = false;
     206                        unset( $post_data['post_date'] );
     207                        unset( $post_data['post_date_gmt'] );
     208                }
    201209        }
    202210
  • trunk/tests/phpunit/tests/ajax/wpAjaxInlineSave.php

    r56022 r56802  
    9090
    9191        /**
    92          * When updating a draft in quick edit mode, it should not set the publish date of the post when this one will be published.
     92         * When updating a draft in quick edit mode, it should not set the publish date of the post if the date passed is unchanged.
    9393         *
    9494         * @ticket 19907
     
    125125                $_POST['post_view']    = 'list';
    126126                $_POST['edit_date']    = 'false';
     127                $_POST['mm']           = get_the_date( 'm', $post );
     128                $_POST['jj']           = get_the_date( 'd', $post );
     129                $_POST['aa']           = get_the_date( 'Y', $post );
     130                $_POST['hh']           = get_the_date( 'H', $post );
     131                $_POST['mn']           = get_the_date( 'i', $post );
     132                $_POST['ss']           = get_the_date( 's', $post );
     133
     134                // Make the request.
     135                try {
     136                        $this->_handleAjax( 'inline-save' );
     137                } catch ( WPAjaxDieContinueException $e ) {
     138                        unset( $e );
     139                }
     140
     141                $post = get_post( $post->ID );
     142
     143                $post_date = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $_POST['aa'], $_POST['mm'], $_POST['jj'], $_POST['hh'], $_POST['mn'], $_POST['ss'] );
     144
     145                $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     146        }
     147
     148        /**
     149         * When updating a draft in quick edit mode, it should set the publish date of the post if there is a new date set.
     150         *
     151         * @ticket 59125
     152         *
     153         * @covers ::edit_post
     154         */
     155        public function test_quick_edit_draft_should_set_publish_date() {
     156                // Become an administrator.
     157                $this->_setRole( 'administrator' );
     158
     159                $user = get_current_user_id();
     160
     161                $post = self::factory()->post->create_and_get(
     162                        array(
     163                                'post_status' => 'draft',
     164                                'post_author' => $user,
     165                        )
     166                );
     167
     168                $this->assertSame( 'draft', $post->post_status );
     169
     170                $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     171
     172                // Set up a request.
     173                $_POST['_inline_edit'] = wp_create_nonce( 'inlineeditnonce' );
     174                $_POST['post_ID']      = $post->ID;
     175                $_POST['post_type']    = 'post';
     176                $_POST['content']      = 'content test';
     177                $_POST['excerpt']      = 'excerpt test';
     178                $_POST['_status']      = $post->post_status;
     179                $_POST['post_status']  = $post->post_status;
     180                $_POST['post_author']  = $user;
     181                $_POST['screen']       = 'edit-post';
     182                $_POST['post_view']    = 'list';
     183                $_POST['edit_date']    = 'true';
    127184                $_POST['mm']           = '09';
    128185                $_POST['jj']           = 11;
     
    141198                $post = get_post( $post->ID );
    142199
    143                 $this->assertEquals( '0000-00-00 00:00:00', $post->post_date_gmt );
     200                $this->assertEquals( '2020-09-11 19:20:11', $post->post_date_gmt );
    144201        }
    145202}
Note: See TracChangeset for help on using the changeset viewer.