コンテンツにスキップ

WordPress で投稿のリビジョンを削除する方法

メインイメージ

WordPress で投稿のリビジョンを削除する方法について説明します。

WordPress のリビジョン機能はコンテンツの変更をよく行うサイトで非常に便利ですが、リビジョンが蓄積されるとサイトのパフォーマンスに悪い影響を与えることがあります。 増えすぎた不要なリビジョンを削除することで、サイトパフォーマンスの改善・ディスク使用量の削減ができます。

リビジョンを削除する方法について、 WordPress 本体の機能を使う方法、 WP-CLI を使う方法、プラグインを使う方法に分けて以下説明していきます。

Note

削除したリビジョンデータはデータベースから物理的に削除されるため復元できません。 誤操作による深刻なデータロスのリスクがあるので、リビジョンを削除したり削除の自動設定を変更したりする場合は事前にデータベースのバックアップを行うことをおすすめします。

確認時のバージョン

  • WordPress 6.6.2

A. WordPress 本体の機能を使う方法

WordPress 本体にリビジョンを自動削除できる機能が備わっています。 そのため基本的にはプラグインなしでリビジョン削除が可能です。

1. リビジョン数を制限する

設定ファイル wp-config.php にリビジョン数指定のための定数 WP_POST_REVISIONS を追加します。

define( 'WP_POST_REVISIONS', 5 );

こう設定した場合、保持されるリビジョン数は各投稿につき最大 5 件となります。 上限を越えると古いリビジョンから順に削除されます。

WP_POST_REVISIONS にセットされた値と挙動は次のとおりです。

デフォルト 挙動
-1 または true すべてのリビジョンを保存
0 または false リビジョン機能を無効化
1 以上の整数 最大 N 件のリビジョンを保存

フィルタを書けば、投稿タイプごとに件数を変えることも可能です。

関連ページ: WordPress の投稿のリビジョンに回数制限を設定する方法

2. 制限した数以上のリビジョンを削除する

制限した数以上のリビジョンの削除処理は通常投稿保存時に行われます。 上記の WP_POST_REVISIONS の設定を追加した後に、投稿の編集ページを開いて投稿の内容を変更して保存すると、指定された数までリビジョンが減少します。

WP_POST_REVISIONS を 5 にセットした後に投稿を保存する:

WordPress でリビジョンを削除するための投稿の保存: 保存前

WordPress でリビジョンを削除するための投稿の保存: 保存ボタン

保存後にリビジョン数が 5 になったことが確認できる:

WordPress でリビジョンを削除するための投稿の保存: 保存後

Note

スペースを追加してまた元に戻すなどすると、変更前とまったく同じ内容で「保存」ボタンをクリックすることができますが、その場合は WordPress 内部では保存処理は走りません。 結果としてリビジョンの整理も行われず、上限を越えた古いリビジョンの削除も行われません。 古いリビジョンを削除するには投稿の内容をどこか変更して保存するようにしてください。

管理画面の投稿一覧ページの「一括操作」で編集した場合はリビジョンの削除は行われないようなので注意してください。

ちなみに、上限を越えたリビジョンの削除処理を担っているのは wp_save_post_revision() という関数です。 実装の詳細に興味のある方はコードをご覧ください。

以下関係する部分の抜粋です。

function wp_save_post_revision( $post_id ) {
  // ...

  $return = _wp_put_post_revision( $post );

  /*
   * If a limit for the number of revisions to keep has been set,
   * delete the oldest ones.
   */
  $revisions_to_keep = wp_revisions_to_keep( $post );

  if ( $revisions_to_keep < 0 ) {
    return $return;
  } 

  $revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) );

  /**
   * Filters the revisions to be considered for deletion.
   *
   * @since 6.2.0
   *
   * @param WP_Post[] $revisions Array of revisions, or an empty array if none.
   * @param int       $post_id   The ID of the post to save as a revision.
   */
  $revisions = apply_filters(
    'wp_save_post_revision_revisions_before_deletion',
    $revisions,
    $post_id
  );

  $delete = count( $revisions ) - $revisions_to_keep;

  if ( $delete < 1 ) {
    return $return;
  }

  $revisions = array_slice( $revisions, 0, $delete );

  for ( $i = 0; isset( $revisions[ $i ] ); $i++ ) {
    if ( str_contains( $revisions[ $i ]->post_name, 'autosave' ) ) {
      continue;
    }

    wp_delete_post_revision( $revisions[ $i ]->ID );
  }

  return $return;
}

この方法のデメリットは各投稿を編集して保存し直す必要があることです。 件数が少ない場合は手作業で 1 件 1 件削除するのもよいですが、投稿の数が多い場合は手間がかかります。

すでにリビジョンの数が多くなりサイトが重くなってしまった場合は複数の投稿のリビジョンをまとめて削除したくなることがあるかと思います。 リビジョンをまとめて一括で削除したい場合は下の WP-CLI を使う方法かプラグインを使う方法を検討してください。

B. WP-CLI を使う方法

WordPress のコマンドラインツール WP-CLI を使う方法もあります。 すべてのリビジョンを削除するには次のコマンドを実行すれば OK です。

wp post delete --force $(wp post list --post_type='revision' --format=ids)

ここで wp post list は投稿の一覧を出力するコマンドです。 --post_type='revision'--format=ids を付けることでリビジョンのデータのみを取得しています。

wp post delete は投稿を削除するコマンドです。 引数で指定された ID の投稿を削除します。 通常このコマンドは投稿をゴミ箱に移動しますが、リビジョンにはゴミ箱機能が無いためリビジョンに対して使う場合は --force をつけて実行する必要があります。

C. プラグインを使う方法

リビジョン削除の用途で使うプラグインとしては Wp-Optimize というものが有名です。

WP-Optimize

データベース最適化の操作の一部として投稿リビジョンを削除する機能が備わっています。

WP-Optimize リビジョン削除

他には Advanced Database Cleaner 、 Wp-Seep というプラグインもあります。

Advanced Database Cleaner

WP-Sweep

2024 年 9 月時点でアクティブインストール数はそれぞれ次のようになっています。

プラグイン アクティブインストール数
WP-Optimize 100 万以上
Advanced Database Cleaner 10 万以上
WP-Sweep 10 万以上

補足

  • リビジョン機能は投稿を間違って更新してしまった場合に前の状態を復元できる便利な機能です。完全に無効にするとその機能が失われてしまうので完全に無効にするのはおすすめしません。
  • 削除したリビジョンデータはデータベースから物理的に削除されるため復元できません。リビジョンに関する操作や設定の変更を行う前にはデータベースのバックアップを必ず取るようにしてください。

関連ページ