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

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

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

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

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

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

// リビジョン保存時にカスタムフィールドをコピー
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);
    }
  }
});

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

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

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

// リビジョン復元時にカスタムフィールドを反映
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 版では履歴管理の仕組みが提供されているため、そちらを活用した方が安定するケースもある

まとめ

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