Skip to content

Commit 2000f24

Browse files
committed
Restore terms during term revision
1 parent 8ef9827 commit 2000f24

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

lib/Hooks/Revision.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)