この記事は最後に更新してから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


お勧め

get_userdata(2022年2月4日 更新)

mixed get_userdata( int $user_id )
ユーザIDを指定し、マッチするユーザ情報を取得する。

has_filter(2022年11月8日 更新)

mixed has_filter( $tag, [ mixed $function_to_check = false ] )
WordPressタグにフィルターが登録されているか調べる。

wp_add_object_terms(2013年8月6日 更新)

mixed wp_add_object_terms( int $object_id, mixed $terms, mixed $taxonomy )
投稿情報などにタクソノミーを追加する。

is_tag(2018年5月27日 更新)

bool is_tag( [ mixed $slug = '' ] )
要求されているページが、タグアーカイブページか調べる。

add_meta_box(2014年11月16日 更新)

void add_meta_box( string $id, string $title, string $callback, string $page [, string $context = 'advanced' [, string $priority = 'default' [, array $callback_args = null ] ] ] )
投稿ページに独自のメタボックスを表示する。