この記事は最後に更新してから1年以上経過しています。

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

説明

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

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

リビジョン機能を調べていくと、 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_search_query(2018年5月27日 更新)

void the_search_query( )
検索フォームで入力された検索キーフレーズを表示する。

wp_parse_slug_list(2019年2月23日 更新)

array wp_parse_slug_list( mixed $list )
スラッグのリストをパースする。

get_current_user_id(2013年9月18日 更新)

int get_current_user_id()
現在のログイン済みユーザーのIDを取得抽出する。

wp_cache_set(2023年8月9日 更新)

bool wp_cache_set( mixed $id, mixed $data [, string $flag = '' [, int $expire = 0 ] ] )
任意のデータをキャッシュに保存する。

translate_user_role(2019年5月13日 更新)

string translate_user_role( string $name [ , string $domain = 'default' ] )
ロール(権限グループ)名の翻訳テキストを取得する。