admin
3 months ago
handlers
3 months ago
ui
3 months ago
watchers
3 months ago
duplicate-post.php
4 years ago
permissions-helper.php
4 years ago
post-duplicator.php
3 months ago
post-republisher.php
3 months ago
revisions-migrator.php
4 years ago
utils.php
3 months ago
revisions-migrator.php
68 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Yoast\WP\Duplicate_Post; |
| 4 | |
| 5 | /** |
| 6 | * Duplicate Post class to migrate revisions from the Rewrite & Republish copy to the original post. |
| 7 | * |
| 8 | * @since 4.0 |
| 9 | */ |
| 10 | class Revisions_Migrator { |
| 11 | |
| 12 | /** |
| 13 | * Adds hooks to integrate with the Post Republisher class. |
| 14 | * |
| 15 | * @return void |
| 16 | */ |
| 17 | public function register_hooks() { |
| 18 | \add_action( 'duplicate_post_after_rewriting', [ $this, 'migrate_revisions' ], 10, 2 ); |
| 19 | } |
| 20 | |
| 21 | /** |
| 22 | * Updates the revisions of the Rewrite & Republish copy to make them revisions of the original. |
| 23 | * |
| 24 | * It mimics the behaviour of wp_save_post_revision() in wp-includes/revision.php |
| 25 | * by deleting the revisions (except autosaves) exceeding the maximum allowed number. |
| 26 | * |
| 27 | * @param int $copy_id The copy's ID. |
| 28 | * @param int $original_id The post's ID. |
| 29 | * |
| 30 | * @return void |
| 31 | */ |
| 32 | public function migrate_revisions( $copy_id, $original_id ) { |
| 33 | $copy = \get_post( $copy_id ); |
| 34 | $original_post = \get_post( $original_id ); |
| 35 | |
| 36 | if ( \is_null( $copy ) || \is_null( $original_post ) || ! \wp_revisions_enabled( $original_post ) ) { |
| 37 | return; |
| 38 | } |
| 39 | |
| 40 | $copy_revisions = \wp_get_post_revisions( $copy ); |
| 41 | foreach ( $copy_revisions as $revision ) { |
| 42 | $revision->post_parent = $original_post->ID; |
| 43 | $revision->post_name = "$original_post->ID-revision-v1"; |
| 44 | \wp_update_post( $revision ); |
| 45 | } |
| 46 | |
| 47 | $revisions_to_keep = \wp_revisions_to_keep( $original_post ); |
| 48 | if ( $revisions_to_keep < 0 ) { |
| 49 | return; |
| 50 | } |
| 51 | |
| 52 | $revisions = \wp_get_post_revisions( $original_post, [ 'order' => 'ASC' ] ); |
| 53 | $delete = ( \count( $revisions ) - $revisions_to_keep ); |
| 54 | if ( $delete < 1 ) { |
| 55 | return; |
| 56 | } |
| 57 | |
| 58 | $revisions = \array_slice( $revisions, 0, $delete ); |
| 59 | |
| 60 | for ( $i = 0; isset( $revisions[ $i ] ); $i++ ) { |
| 61 | if ( \strpos( $revisions[ $i ]->post_name, 'autosave' ) !== false ) { |
| 62 | continue; |
| 63 | } |
| 64 | \wp_delete_post_revision( $revisions[ $i ]->ID ); |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 |