@@ -544,6 +544,8 @@ public function get_edit_post_link( string $link, int $post_id, string $context
544544
545545 public function wp_restore_post_revision ( $ post_id , $ revision_id ) : void {
546546
547+ // Restore revision meta.
548+
547549 // Core keys to keep in the original post.
548550 $ core_meta_keys = [
549551 'full_meta_keys ' => [
@@ -561,9 +563,14 @@ public function wp_restore_post_revision( $post_id, $revision_id ) : void {
561563 ],
562564 ];
563565
566+ // TODO: Filter for meta_keys to ignore.
567+
564568 // Remove all of the non WordPress core meta entries.
565569 $ post_meta = get_post_meta ( $ post_id );
566570 foreach ( array_keys ( $ post_meta ) as $ meta_key ) {
571+ if ( preg_match ( '/post_version_([0-9]+)/ ' , $ meta_key ) ) {
572+ continue ;
573+ }
567574 if ( in_array ( $ meta_key , $ core_meta_keys ['full_meta_keys ' ], true ) ) {
568575 continue ;
569576 }
@@ -578,12 +585,56 @@ public function wp_restore_post_revision( $post_id, $revision_id ) : void {
578585 // Copy every meta entry from $revision_id over to $post_id.
579586 $ revision_meta = get_post_meta ( $ revision_id );
580587 foreach ( $ revision_meta as $ meta_key => $ meta_values ) {
588+ if ( preg_match ( '/post_version_([0-9]+)/ ' , $ meta_key ) ) {
589+ continue ;
590+ }
581591 foreach ( $ meta_values as $ meta_value ) {
582592 add_post_meta ( $ post_id , $ meta_key , $ meta_value );
583593 }
584594 }
585595
586596 // TODO: ACF will run after this so there might be issues.
597+
598+ // Restore revision terms.
599+
600+ $ post_terms = get_terms ( [ 'object_ids ' => $ post_id ] );
601+ $ revision_terms = get_terms ( [ 'object_ids ' => $ revision_id ] );
602+ if ( $ post_terms == $ revision_terms ) {
603+ return ;
604+ }
605+
606+ // TODO: filter for post terms
607+ // TODO: filter for revision terms
608+
609+ // Index the terms for easier array_diff.
610+
611+ $ indexed_post_terms = [];
612+ foreach ( $ post_terms as $ post_term ) {
613+ $ indexed_post_terms [
614+ sprintf ( "%s-%s-%s " , $ post_term ->term_id , $ post_term ->slug , $ post_term ->taxonomy )
615+ ] = $ post_term ;
616+ }
617+
618+ $ indexed_revision_terms = [];
619+ foreach ( $ revision_terms as $ revision_term ) {
620+ $ indexed_revision_terms [
621+ sprintf ( "%s-%s-%s " , $ revision_term ->term_id , $ revision_term ->slug , $ revision_term ->taxonomy )
622+ ] = $ revision_term ;
623+ }
624+
625+ // Remove old terms and add new ones.
626+
627+ $ diff_post_terms = array_diff_key ( $ indexed_post_terms , $ indexed_revision_terms );
628+ foreach ( $ diff_post_terms as $ post_term ) {
629+ // TODO: failure state
630+ wp_remove_object_terms ( $ post_id , $ post_term ->term_id , $ post_term ->taxonomy );
631+ }
632+
633+ $ diff_revision_terms = array_diff_key ( $ indexed_revision_terms , $ indexed_post_terms );
634+ foreach ( $ diff_revision_terms as $ revision_term ) {
635+ // TODO: failure state
636+ wp_add_object_terms ( $ post_id , $ revision_term ->term_id , $ revision_term ->taxonomy );
637+ }
587638 }
588639
589640 /**
0 commit comments