リビジョンの仕組みを勘違いしてた

説明

過去の投稿情報を記録するリビジョン機能をカスタム投稿タイプで利用しようと思い作りこみしていたが、思惑通りの動きにならなかった。リビジョン機能は投稿情報の更新前の内容を記録するものと勝手に思い込んでいたのだが、どうやらそれは間違いだった。

リビジョンはどこで作られるのか

リビジョン機能を調べていくと、 wp_insert_post関数の'post_updated'アクションに指定されたwp_save_post_revision関数で作られていた。'post_updated'アクションが実行されるタイミングは既存の投稿データを更新した後でその投稿データを元にして、親ID(post_parent)を元となる投稿のIDに、投稿タイプ(post_type)を'revision'に、投稿ステータスを'inherit'にするなど、いくつかの変更を行ってから保存していた。

実際に管理者ページにログインし、新規投稿にてタイトルに'revison check'を、本文に'start!'を入力して公開。その投稿データを確認した。

+-----+---------------+--------------+-------------+-----------+---------------------+
| ID  | post_title    | post_content | post_parent | post_type | post_date           |
+-----+---------------+--------------+-------------+-----------+---------------------+
| 377 | revison check | start!       |           0 | post      | 2018-09-15 11:14:23 |
+-----+---------------+--------------+-------------+-----------+---------------------+

続いてこの投稿データのリビジョンデータを確認。タイトルと本文は元の投稿データのままである。

+-----+---------------+--------------+-------------+-----------+---------------------+
| ID  | post_title    | post_content | post_parent | post_type | post_date           |
+-----+---------------+--------------+-------------+-----------+---------------------+
| 378 | revison check | start!       |         377 | revision  | 2018-09-15 11:14:23 |
+-----+---------------+--------------+-------------+-----------+---------------------+

投稿編集ページに戻って本文に'1!'を追加して「公開」ボタンをクリックし、さらに'2!'を追加して「公開」ボタンをクリック。この状態でリビジョンデータを確認した。以下の通り、2つのリビジョンデータが追加されている。

+-----+---------------+--------------+-------------+-----------+---------------------+
| ID  | post_title    | post_content | post_parent | post_type | post_date           |
+-----+---------------+--------------+-------------+-----------+---------------------+
| 380 | revison check | start! 1! 2! |         377 | revision  | 2018-09-15 11:17:50 |
| 379 | revison check | start! 1!    |         377 | revision  | 2018-09-15 11:17:38 |
| 378 | revison check | start!       |         377 | revision  | 2018-09-15 11:14:23 |
+-----+---------------+--------------+-------------+-----------+---------------------+

今度は投稿編集ページからリビジョンページに移り、1つ前の'1!'を追加した状態に戻してみた。ちなみにプラグインで特定のリビジョンデータに戻す場合は wp_restore_post_revision関数が利用できる。

+-----+---------------+--------------+-------------+-----------+---------------------+
| ID  | post_title    | post_content | post_parent | post_type | post_date           |
+-----+---------------+--------------+-------------+-----------+---------------------+
| 381 | revison check | start! 1!    |         377 | revision  | 2018-09-15 19:49:47 |
| 380 | revison check | start! 1! 2! |         377 | revision  | 2018-09-15 17:14:50 |
| 379 | revison check | start! 1!    |         377 | revision  | 2018-09-15 17:14:38 |
| 378 | revison check | start!       |         377 | revision  | 2018-09-15 11:14:23 |
+-----+---------------+--------------+-------------+-----------+---------------------+

データベースを確認してみると、2つ目のリビジョンデータである投稿IDが379のデータは残ったまま、新たに投稿IDが381のリビジョンデータが追加されている。リビジョンを前の状態に戻した場合、ほぼ同じ内容のデータを重複して保持することは意識しておいた方がよいだろう。

リビジョン機能を使用する上で注意すること

ここで想定しているケースはプラグインでリビジョン機能を使いたいカスタム投稿タイプで、ポイントは次の通りである。

  1. カスタム投稿タイプ登録時、supportsプロパティに'revisions'を含める。
  2. リビジョンが作成されるのはwp_insert_post関数で投稿データが更新された場合のみであり、新規登録時には作成されない。
  3. リビジョンデータは更新後の投稿データをもとに作成される。

特に2番目は意識しておいた方がよく、初めからリビジョンデータを残す場合はまずwp_insert_post関数で空のデータを登録し、投稿した投稿IDに対して本番データを更新する手順となる。これをやらないと初めのリビジョンデータが残らない。というか、実際にこれをやってしまったので備忘録として残しておく。


最終更新 : 2018年09月17日 14:46


お勧め

the_posts_navigation(2018年5月27日 更新)

void the_posts_navigation( [ array $args = array() ] )
投稿ページ向けのナビゲーションを表示する。

popuplinks(2016年4月22日 更新)

string popuplinks( string $text )
Aタグに別ウィンドウで開く属性を追加する

language_attributes(2018年11月16日 更新)

void language_attributes( [ string $doctype = 'html' ] )
HTMLまたはXHTMLのHTMLタグ属性を表示する。

add_management_page(2018年5月27日 更新)

mixed add_management_page( string $page_title, string $menu_title, mixed string $capability, string $menu_slug [ , mixed $function = '' ] )
ツールメニューにサブメニューを登録する。

wp_list_bookmarks(2018年5月27日 更新)

string wp_list_bookmarks( [ mixed $args = '' ] )
ブックマーク(管理画面の「リンク」)をパラメータ$argsのecho値が1ならば表示する。echo値が0ならばその文字列を取得する。