【WordPress】カスタムフィールドでリビジョンを有効化する方法と注意点

【WordPress】カスタムフィールドでリビジョンを有効化する方法と注意点 WordPress

WordPress のリビジョン機能は記事本文やタイトルの変更履歴を保存できますが、カスタムフィールド(post meta)はデフォルトでは対象外です。そのため、ACF や独自のカスタムフィールドを利用している場合、誤ってデータを上書きしてしまうと復元が難しくなります。この記事では、カスタムフィールドにリビジョンを有効化する方法と、実運用上の注意点を解説します。

スポンサーリンク

カスタムフィールドにリビジョンを有効化する方法

WordPress では _wp_post_revision_fields フィルターフックを利用することで、リビジョン管理の対象にカスタムフィールドを追加できます。以下のコードを functions.php に記述します。

functions.php:カスタムフィールドのリビジョン対応
// カスタムフィールドをリビジョン対象に追加
add_filter('_wp_post_revision_fields', function ($fields) {
  $fields['my_custom_field'] = 'カスタムフィールドの値';
  return $fields;
});

// 比較画面での値の取得方法を明示する
add_filter('_wp_post_revision_field_my_custom_field', function ($value, $field, $revision) {
  return get_metadata('post', $revision->ID, 'my_custom_field', true);
}, 10, 3);

// リビジョン保存時にカスタムフィールドをコピー
add_action('save_post', function ($post_id) {
  $parent_id = wp_is_post_revision($post_id);
  if ($parent_id) {
    $parent_value = get_post_meta($parent_id, 'my_custom_field', true);
    if ($parent_value) {
      update_metadata('post', $post_id, 'my_custom_field', $parent_value);
    }
  }
});
フィルター名は先頭にアンダースコアが必要
リビジョン対象のフィールドを追加するフィルターは、wp_post_revision_fieldsではなく先頭にアンダースコアが付いた_wp_post_revision_fieldsです。アンダースコアなしのフィルター名はWordPressコアに存在せず、指定しても一度も発火しないため、カスタムフィールドがリビジョン比較対象に一切追加されません。また、比較画面での値取得方法を明示するため、_wp_post_revision_field_{フィールド名}という専用フィルターもあわせて実装しておくと、より確実で堅牢な実装になります。

上記では my_custom_field というメタキーをリビジョン対象にしています。これにより本文やタイトルと同様に、リビジョン履歴に値が保存されます。

リビジョンの復元に対応させる

保存だけでなく復元時にも値を戻すには、wp_restore_post_revision フックを使います。

functions.php:リビジョン復元時の反映
// リビジョン復元時にカスタムフィールドを反映
add_action('wp_restore_post_revision', function ($post_id, $revision_id) {
  $meta_value = get_post_meta($revision_id, 'my_custom_field', true);
  if ($meta_value !== '') {
    update_post_meta($post_id, 'my_custom_field', $meta_value);
  }
}, 10, 2);

これにより、管理画面の「リビジョンを復元」で本文と一緒にカスタムフィールドも戻すことができます。

注意点

カスタムフィールドをリビジョン対象にする際は、以下の点に注意してください。

  • 大量のフィールドを対象にするとデータベースの容量が増加し、パフォーマンスに影響する可能性がある
  • シリアライズされた配列や複雑なデータ構造はリビジョン比較画面で正しく表示できない場合がある
  • ACF を利用している場合、Pro 版では履歴管理の仕組みが提供されているため、そちらを活用した方が安定するケースもある

よくある質問(FAQ)

Qカスタムフィールド(post_meta)はリビジョンに保存されますか?
Aデフォルトではpost_metaはリビジョンに含まれません。ACFプラグインはリビジョン対応オプションがあります。標準のカスタムフィールドのリビジョン対応にはsave_postとwp_restore_post_revisionフックで独自実装が必要です。
Qカスタムフィールドのリビジョンを手動で保存・復元する実装は?
Asave_postフックでリビジョンが作成されたタイミング(wp_is_post_revision()で判定)にカスタムフィールドをリビジョンのpost_metaとしてupdate_metadata()で保存し、wp_restore_post_revisionフックで復元時にリビジョンのメタからupdate_post_meta()で復元します。
Qリビジョンのカスタムフィールドを比較表示するには?
A_wp_post_revision_fieldsフィルターでカスタムフィールドをリビジョン比較UIに追加します。あわせて_wp_post_revision_field_{フィールド名}フィルターで値の取得方法を指定すると確実です。これにより管理画面のリビジョン比較ページにカスタムフィールドの差分が表示されます。

まとめ

WordPress のリビジョン機能をカスタムフィールドにも適用するには、_wp_post_revision_fields と wp_restore_post_revision を活用します。これにより、記事本文と同様にフィールドの履歴を保存・復元できるようになります。ただし対象フィールドを増やしすぎるとデータベース負荷が高まるため、本当に必要な項目に絞って設定するのが安全です。