WordPress のリビジョン機能の変更について

WordPress で 2年以上メンテナンスされていないリビジョン削除プラグインを使用しているという記事を最近どこかで見た気がするので、それはマズいという話を書いておきます。 以前も WordPress のリビジョン機能についての説明記事を書いたことがありましたが、この後 WordPress のバージョンが 3.6 に上がった時にリビジョン機能に大きく変更が加えられました。 その WordPress 3.6 リリースのタイミングで公開しようとして下書き放置のままになっていた新たな説明記事を、警鐘目的でこのタイミングで完成することにしたのです。

WordPress 3.6 では GUI だけでなく内部的にも大きな変更が加わっているのですが、まずは先の記事からの差異をまとめます。

WordPress 3.6 になっても変わらないこと

以前の記事で書いている内容のうちの以下の点は WordPress 3.6 以降でも変わっていません。

  • 自動保存は 1世代のみ。
  • リビジョンが作成されるのはポストテーブル (wp_posts) 内容のみ。 wp_postmeta や wp_term_relationships などの関連テーブルは (プラグイン等を用いない限り) リビジョンが作成されない。
  • 通常の一記事表示ではインデックスを使用した検索になるので、ポスト数が増えても検索時間は比例して動作が遅くなることはない。

WordPress 3.6 から変わったこと

さて、肝心の何が変わったかですが、GUI の変更については言わずもがなで以下の点が変わっています。

  1. 現行の投稿と同一内容のリビジョン (ここではコピーリビジョンと呼ぶ) を持つようになった。
  2. 投稿を修正せずに「更新」を実行しても新しいリビジョンは作成されなくなった。デフォルトでは更新時に Title/Content/Excerpt が同じであればリビジョンは作成されない。

特に問題となるのは 1. です。 冒頭の話に戻りますが、WordPress 3.6 のリリースは今年なので、2年以上放置されているプラグインは当然この変更に対応できていません。 ですので、本来必要なコピーリビジョンまで削除してしまい、その結果何らかの不具合が起こる可能性があります。 一般的に言って、内容を見て判断できないのであれば 2年以上放置の警告が出ているプラグインには手を出さない方が良いでしょう。

更新処理の変化

ここからは先は拙作 Thin Out Revisions を WordPress 3.6 に対応させたときに調べた内容を整理したものです。 WordPress の実装に興味がある方はどうぞ。 そうでない方も Thin Out Revisions はきちんと WordPress の更新に対応しているということはご理解いただき、是非一度このプラグインを試してみてください (とりあえず宣伝)!

では、コピーリビジョンを持つようになったことで投稿の更新処理がどのように変わったかを見てみましょう。 下の図は WordPress 3.5 までの更新処理を DB のレコードレベルで表したものです。 同じ内容は同じ色で表しています。

Update flow 3.5

一度だけ更新を行った投稿は図中 1. のようにリビジョンを一つ持ちます。 これを更に更新したときはまず 2. のように投稿の内容をコピーして新しいリビジョンを作成してから 3. のように入力内容で投稿を更新処理します。

これが WordPress 3.6 になると下の図のようになります。

Update flow 3.6 一度だけ更新を行った状態では、図中 1. のように 2つのリビジョンが作成されています。 更新処理も 2.、3. で示すように先に投稿を更新し、後からそれをコピーして新しいリビジョンレコードを作成します。 コピーとレコード更新の順序が 3.5 までと比べて逆になっていることがわかると思います。

3.5 以前で作成した投稿+リビジョンのマイグレーション

3.5 以前のバージョンから 3.6 (恐らく 3.7 も) にアップグレードすると、特に明示的な操作を行わなくても既存の投稿について自動的にコピーリビジョンが作成されます。 これは WordPress をアップグレードするタイミングではなく、管理画面での投稿に対する操作のタイミングで行われます。 処理の実体は _wp_upgrade_revisions_of_post という関数で、wp_posts テーブル内各リビジョンの post_name が *-revision-v1 に変更され、コピーリビジョンが作成されます。

ただ、私の場合、自動マイグレーションがうまく行った投稿とうまく行かない投稿がありました。 バージョンアップは 1度きりのことなのできちんと調べませんでしたが、とりあえず Thin Out Revisions ではコピーリビジョンを持たない投稿があると警告するようにしておきました (再度、宣伝!)。 投稿編集画面でこの警告が出たときは、一度何も変更せずそのまま更新ボタンを押すことをお勧めします。

ついでに変更有無のチェックについて

更新時の変更有無のチェックは、デフォルトでは Title/Content/Excerpt が比較されると書きましたが、他の項目も加えるには _wp_post_revision_fields フィルターを作成して調整します。 そもそも変更有無にかかわらずリビジョンを作りたいという時は wp_save_post_revision_check_for_changes フィルター関数を作って false を返すようにします。 詳しくは wp_save_post_revisions のコードを読んでみましょう。

最後に

しつこいですが、最後に宣伝させてください! Thin Out Revisions はきちんと WordPress のバージョンアップに対応しています。 間もなくリリース予定の WordPress 3.8 では管理画面のビジュアルが変わるのですが、これへの対応も近々リリースする予定です。 また、リビジョンにメモをつける便利な機能もついています。 是非一度使ってみてください!