WordPressでは投稿記事を保存/更新する度に保存/更新時の状態でデータベースに保存し、過去に保存/更新した投稿記事にアクセスできる仕組みを持っています。記事作成中に10回保存/更新すれば10回分の記事をまるごとデータベースに保存しています。

これをWordPressではリビジョン管理といいます。

リビジョン管理は、更新/削除した箇所を元に戻したい場合には非常に役に立つ機能です。しかし、更新/削除した箇所を元に戻すという要望がない場合、履歴を保存することはデータベースの容量を使い続けることになり、データベースに対するアクセス速度への影響等を考えると必ずしも必要なものではありません。

すべての保存/更新した投稿記事をデータベースに保存する必要がないという要望に応えるため、リビジョン管理を制限する仕組みをWordPressは備えています。

どういう状態でデータベースに保存されているのかを確認して、リビジョン管理の制限方法の確認を行っていきます。

リビジョンの仕組みを確認

リビジョンの制限設定を行う前に実際に投稿記事を作成して、どのように投稿が保存が行われているか確認してみましょう。WordPressの理解を深めるために直接WordPressのデータベースにアクセスして、確認を行います。

phpmyadminを使用して投稿記事の保存されているwp_postsテーブルを確認するとpost_contentに記事の内容、post_titleに記事のタイトルが保存されていることが確認しています。また、同じタイトルの行がいくつも確認できます。これが保存/更新されるたびに保存される履歴のデータです。

投稿記事の内容を確認

投稿記事の内容を確認

公開した記事の件数と保存された記事の総数

現在本ブログで公開している投稿記事数を確認してみます。wp_postsに保存されているデータの中でpost_status列がpublishになっているものが公開されている記事となり、投稿記事を保存するwp_postsの中にどれくらいの数があるか下記のSQL文で確認をおこなっています。結果、現在38記事を公開しています。

SQLやデータベースの仕組みがわからない人は、公開記事が38記事あるんだと思っていただければ問題ありません。今後もSQL文が出てきますが、わからない人はSQL文を無視してください。リビジョンの仕組みの理解には影響ありません。
fukidashi

MariaDB [wp]> select count(*) from wp_posts where post_status="publish";
+----------+
| count(*) |
+----------+
|       38 |
+----------+
1 row in set (0.00 sec)

次にこれまで38記事を投稿するためにどれくらいの数の保存/更新を繰り返してきたのかを見てみましょう。今度はwp_postsテーブルのリビジョンに関するすべての行の合計を確認します。合計数は、846件でした。38件の記事を投稿するだけで846件の記事を保存していることになります。1つの記事に対して、20~30回の保存/更新を行っていることがわかります。


MariaDB [wp]> select count(*) from wp_posts where post_type="revision";
+----------+
| count(*) |
+----------+
|      846 |
+----------+
1 row in set (0.00 sec)

これは下書きの保存であれ、公開した記事の更新であれ、保存を行うために1件1件の投稿記事データがデータベースに保存されているためです。これはWordPressでリビジョン管理が行われているためです。

投稿記事の保存/更新履歴を見る

データベース内に過去に更新された投稿記事がすべて保存されていることは確認できました。では、そのデータをどのように活用するのかも確認しておきましょう。

リビジョンの確認

WordPressの管理画面上からは投稿記事のリビジョンを確認することができます。現在この記事を投稿するために6件の履歴がデータベースに保存されていることがリビジョンの横の数字から確認できます。

管理画面上のリビジョンの場所

管理画面上のリビジョンの場所

リビジョンの左にある表示ボタンを押すとリビジョンの管理画面が表示され、スライダーを使って保存されている過去の記事にアクセスすることができます。

リビジョン管理スライダー

リビジョン管理スライダー

リビジョンの比較

右上にある2つのリビジョンを比較をクリックすると2つのスライダーをずらすことで記事の比較も行うことができます。

リビジョンの比較

リビジョンの比較

リビジョンの復元

もし、投稿記事を誤って更新した場合は、リビジョンの復元を使って以前の状態に戻すことができます。

リビジョンを復元する

リビジョンを復元する

リビジョン管理に制限を行う

リビジョン管理いる?いらない?

ここまでの説明でリビジョン管理によってどれくらいのデータがデータベースに保存されているのか。また、リビジョン管理をどのように活用していくのかを理解してもらえたかと思います。これらの知識を踏まえて上で、自サイトがリビジョン管理が必要なのか必要ではないのかの判断ができるかと思います。

過去のリビジョンの復元機能はすべて必要だという人はリビジョン管理の制限を行う必要はないので、下記の記事は読まなくてOKです。
fukidashi

リビジョン管理に制限を加えてみましょう。

リビジョンの制限を行うためには、いくつかの方法があります。

wp_revisions_to_keepを使った方法

リビジョン管理の制限を行うためには、functions.phpでadd_filterを使用して、wp_revisions_to_keepの設定を行います。下記では、3つまでのリビジョン管理を行う設定を行っています。下記のコードをfunctions.phpにコピー&ペーストしてもらえればそのまま使えます。set_revision_store_numberのreturnの後の数字を変更すれば、保存するリビジョンの数を変更できます。


function set_revision_store_number($num){
  return 3;
}
add_filter( 'wp_revisions_to_keep', 'set_revision_store_number');

【wp_revisions_to_keepの定義】
投稿された記事にどれだけのリビジョンを保存するかを変更できるfilterです。デフォルトでは、post typeがリビジョンをサポートしているならば、無制限にリビジョンを保存します。

設定を行い、再度記事の更新ボタンを押すとリビジョンの数が3になっていることを確認できます。投稿記事を保存するwp_posts上からは、設定した数以外の古いリビジョンが削除されます。

リビジョン数が3に

リビジョン数が3に

リビジョンを保存しない設定

wp_revisions_to_keepで3件までリビジョンを保存する設定を行いました。全く保存する必要がないという場合はfunctions.phpに下記の設定を行ってください。


add_filter('wp_revisions_to_keep', '__return_false');

‘__return_false’についてはフィルターでfalseを戻す時に使用します。
fukidashi

管理画面からリビジョンの表示がなくなります。

リビジョンが非表示に

リビジョンが非表示に


wp_postsを確認すると更新しても過去に保存されていたリビジョンは削除されないようです。再度リビジョンの非保存を解除するとこれまでに保存されていたリビジョン数が管理画面上に表示されます。
fukidashi

リビジョン設定後のより詳細な動作確認

wp_revisions_to_keepの設定前にリビジョン管理のデータを大量に保存していた投稿記事の動作確認を行ってみます。

下記の記事は、34のリビジョンを保存しています。

現在のリビジョン数の確認

現在のリビジョン数の確認

SQL文からも確認を行っておきましょう。上記の記事のIDは1241なので、リビジョンだけの記事数を検索するためにpost_parentは元記事のIDを設定、post_typeはrevisionを設定します。管理画面上で確認した数と一致します。


MariaDB [wp]> select count(*) from wp_posts where post_parent="1241" and post_type="revision";
+----------+
| count(*) |
+----------+
|       34 |
+----------+
1 row in set (0.00 sec)

ここで記事の更新を行います。

更新ボタンを押すだけはなく必ずなにか変更を加えてください。
fukidashi

再度同じSQL文を実行すると保存しているリビジョンの数が3になっていることを確認できます。


MariaDB [wp]> select count(*) from wp_posts where post_parent="1241" and post_type="revision";
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

wp_revisions_to_keepをfunctions.phpで設定後、記事の更新を行えば、古いリビジョンをデータベースから自動で削除されることが確認できました。

wp-config.phpをつかった方法

wp-config.phpにWP_POST_REVISIONSを下記のように追加することでも実現可能です。functions.phpにwp_revisions_to_keepを設定を行うほうが簡単なので個人的にこの設定を行ったことはありません。参考まで。


define ('WP_POST_REVISIONS',3);

まとめ

WordPressにおけるリビジョン管理の動作確認を行い、機能の理解を行った上で、リビジョン管理の制限方法の説明を行いました。もし、設定を行う場合は、自分たちにとってリビジョンが必要なのかまたどれくらいな数を保持すべきなのかを検討して設定を行ってください。