WordPress.org

Make WordPress Core

Ticket #20564: 20564.22.diff

File 20564.22.diff, 8.7 KB (added by mattheu, 6 years ago)
  • src/wp-admin/includes/post.php

    diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php
    index d230667..2a27cf8 100644
    a b function wp_create_post_autosave( $post_data ) { 
    15441544                        return 0;
    15451545                }
    15461546
     1547                /**
     1548                 * Fires before an autosave is stored.
     1549                 *
     1550                 * @since 4.1.0
     1551                 *
     1552                 * @param Object $new_autosave Post object - the autosave that is about to be saved.
     1553                 */
     1554                do_action( '_wp_creating_autosave', $new_autosave );
     1555
    15471556                return wp_update_post( $new_autosave );
    15481557        }
    15491558
  • src/wp-admin/includes/revision.php

    diff --git a/src/wp-admin/includes/revision.php b/src/wp-admin/includes/revision.php
    index 151cd64..17be3d2 100644
    a b function wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) { 
    9292                        );
    9393                }
    9494        }
    95         return $return;
     95        return apply_filters( 'wp_get_revision_ui_diff', $return, $compare_from, $compare_to );
    9696}
    9797
    9898/**
  • src/wp-includes/revision.php

    diff --git a/src/wp-includes/revision.php b/src/wp-includes/revision.php
    index 45e436f..59aff6c 100644
    a b function wp_save_post_revision( $post_id ) { 
    133133                                        break;
    134134                                }
    135135                        }
     136
     137                        /**
     138                         * Filter whether a post has changed.
     139                         *
     140                         * By default a revision is saved only if one of the revisioned fields has changed.
     141                         * This filter allows for additional checks to determine if there were changes.
     142                         *
     143                         * @since 4.1.0
     144                         *
     145                         * @param bool $post_has_changed Whether the post has changed.
     146                         * @param int  $last_revision    ID of the last revision.
     147                         * @param int  $post             Post ID.
     148                         *
     149                         */
     150                        $post_has_changed = (bool) apply_filters( 'wp_save_post_revision_additional_check_for_changes', $post_has_changed, $last_revision, $post );
     151
    136152                        //don't save revision if post unchanged
    137                         if( ! $post_has_changed )
     153                        if( ! $post_has_changed ) {
    138154                                return;
     155                        }
    139156                }
    140157        }
    141158
  • tests/phpunit/tests/post/revisions.php

    diff --git a/tests/phpunit/tests/post/revisions.php b/tests/phpunit/tests/post/revisions.php
    index aa3819a..9b0013f 100644
    a b class Tests_Post_Revisions extends WP_UnitTestCase { 
    367367                $this->assertEquals( 100, $ok );
    368368                $this->assertEquals( 0, $reversed );
    369369        }
     370
     371        /**
     372         * Test the revisions system for storage of meta values
     373         * @ticket 20564
     374         */
     375        function test_revisions_stores_meta_values() {
     376                // Set up a new post
     377                $original_post_id = $post_id = $this->factory->post->create();
     378                // And update to store an initial revision
     379                wp_update_post( array( 'post_content'   => 'some initial content', 'ID' => $post_id ) );
     380
     381                // One revision so far
     382                $revisions = wp_get_post_revisions( $post_id );
     383                $this->assertCount( 1, $revisions );
     384                /**
     385                 * First set up a meta value
     386                 */
     387
     388                // Store a custom meta value, which is not revisioned by default
     389                update_post_meta( $post_id, 'meta_revision_test', 'original' );
     390
     391                // Update the post, storing a revision
     392                wp_update_post( array( 'post_content'   => 'some more content', 'ID' => $post_id ) );
     393
     394                $revisions = wp_get_post_revisions( $post_id );
     395                $this->assertCount( 2, $revisions );
     396
     397
     398                //  Next, store some updated meta values for the same key
     399                update_post_meta( $post_id, 'meta_revision_test', 'update1' );
     400
     401                // Save the post, changing content to force a revision
     402                wp_update_post( array( 'post_content'   => 'some updated content', 'ID' => $post_id ) );
     403
     404                $revisions = wp_get_post_revisions( $post_id );
     405                $this->assertCount( 3, $revisions );
     406
     407
     408                /**
     409                 * Now restore the original revision
     410                 */
     411
     412                // Restore the previous revision
     413                $revisions = (Array)wp_get_post_revisions( $post_id );
     414                // Go back two to load the previous revision
     415                array_shift( $revisions );
     416                $last_revision = array_shift( $revisions );
     417                // Restore!
     418                wp_restore_post_revision( $last_revision->ID );
     419
     420                wp_update_post( array( 'ID' => $post_id ) );
     421                $revisions = wp_get_post_revisions( $post_id );
     422                $this->assertCount( 4, $revisions );
     423
     424                /**
     425                 * Check the meta values to verify they are NOT revisioned - they are not revisioned by default
     426                 */
     427
     428                // Custom post meta should NOT be restored, orignal value should not be restored, value still 'update1'
     429                $this->assertEquals( 'update1', get_post_meta( $post_id, 'meta_revision_test', true ) );
     430
     431                update_post_meta( $post_id, 'meta_revision_test', 'update2' );
     432
     433
     434                /*
     435                 * Now test the revisioning of custom meta when enabled by the wp_post_revision_meta_keys filter
     436                 */
     437
     438                // Add the custom field to be revised via the wp_post_revision_meta_keys filter
     439                add_filter( 'wp_post_revision_meta_keys', function( $keys ) {
     440                        $keys[] = 'meta_revision_test';
     441                        return $keys;
     442                });
     443
     444                // Save the post, changing content to force a revision
     445                wp_update_post( array( 'post_content'   => 'more updated content', 'ID' => $post_id ) );
     446
     447                $revisions = wp_get_post_revisions( $post_id );
     448                $this->assertCount( 5, $revisions );
     449
     450                // Store custom meta values, which should now be revisioned
     451                update_post_meta( $post_id, 'meta_revision_test', 'update3' );
     452
     453                /**
     454                 * Save the post again, custom meta should now be revisioned
     455                 *
     456                 * Note that a revision is saved even though there is no change
     457                 * in post content, becaused the revisioned post_meta has changed
     458                 *
     459                 */
     460                wp_update_post( array( 'ID' => $post_id ) );
     461
     462                // This revision contains the existing post meta ('update3')
     463                $revisions = wp_get_post_revisions( $post_id );
     464                $this->assertCount( 6, $revisions );
     465
     466                // Verify that previous post meta is set
     467                $this->assertEquals( 'update3', get_post_meta( $post_id, 'meta_revision_test', true ) );
     468
     469                // Retore the previous revision
     470                $revisions = wp_get_post_revisions( $post_id );
     471
     472                // Go back two to load the previous revision
     473                array_shift( $revisions );
     474                $last_revision = array_shift( $revisions );
     475                wp_restore_post_revision( $last_revision->ID );
     476
     477                // Verify that previous post meta is restored
     478                $this->assertEquals( 'update2', get_post_meta( $post_id, 'meta_revision_test', true ) );
     479
     480                // Try storing a blank meta
     481                update_post_meta( $post_id, 'meta_revision_test', '' );
     482                wp_update_post( array( 'ID' => $post_id ) );
     483
     484                update_post_meta( $post_id, 'meta_revision_test', 'update 4' );
     485                wp_update_post( array( 'ID' => $post_id ) );
     486
     487                // Retore the previous revision
     488                $revisions = wp_get_post_revisions( $post_id );
     489                array_shift( $revisions );
     490                $last_revision = array_shift( $revisions );
     491                wp_restore_post_revision( $last_revision->ID );
     492
     493                // Verify that previous post meta is restored
     494                $this->assertEquals( '', get_post_meta( $post_id, 'meta_revision_test', true ) );
     495
     496                // Test not tracking a key
     497                remove_all_filters( 'wp_post_revision_meta_keys' );
     498
     499                // Should no longer be revisioned
     500                update_post_meta( $post_id, 'meta_revision_test', 'update 5' );
     501                wp_update_post( array( 'ID' => $post_id, 'post_content' => 'changed content' ) );
     502                update_post_meta( $post_id, 'meta_revision_test', 'update 6' );
     503                wp_update_post( array( 'ID' => $post_id, 'post_content' => 'go updated content' ) );
     504                // Retore the previous revision
     505                $revisions = wp_get_post_revisions( $post_id );
     506                array_shift( $revisions );
     507                $last_revision = array_shift( $revisions );
     508                wp_restore_post_revision( $last_revision->ID );
     509
     510                // Verify that previous post meta is NOT restored
     511                $this->assertEquals( 'update 6', get_post_meta( $post_id, 'meta_revision_test', true ) );
     512
     513                // Add the custom field to be revised via the wp_post_revision_meta_keys filter
     514                add_filter( 'wp_post_revision_meta_keys', function( $keys ) {
     515                        $keys[] = 'meta_revision_test';
     516                        return $keys;
     517                });
     518
     519                /**
     520                 * Test the revisioning of multiple meta keys
     521                 */
     522
     523                // Add three values for meta
     524                update_post_meta( $post_id, 'meta_revision_test', 'update 7' );
     525                add_post_meta( $post_id, 'meta_revision_test', 'update 7 number 2' );
     526                add_post_meta( $post_id, 'meta_revision_test', 'update 7 number 3' );
     527                wp_update_post( array( 'ID' => $post_id ) );
     528
     529                // Update all three values
     530                update_post_meta( $post_id, 'meta_revision_test', 'update 8', 'update 7' );
     531                update_post_meta( $post_id, 'meta_revision_test', 'update 8 number 2', 'update 7 number 2'  );
     532                update_post_meta( $post_id, 'meta_revision_test', 'update 8 number 3', 'update 7 number 3'  );
     533                wp_update_post( array( 'ID' => $post_id ) );
     534
     535                // Retore the previous revision
     536                $revisions = wp_get_post_revisions( $post_id );
     537                array_shift( $revisions );
     538                $last_revision = array_shift( $revisions );
     539                wp_restore_post_revision( $last_revision->ID );
     540
     541                $this->assertEquals( array( 'update 7', 'update 7 number 2', 'update 7 number 3' ), get_post_meta( $post_id, 'meta_revision_test' ) );
     542
     543                // Cleanup!
     544                wp_delete_post( $original_post_id );
     545
     546        }
    370547}