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


お勧め

add_shortcode(2018年5月27日 更新)

void add_shortcode( string $tag, mixed $func )
ショートコード(独自タグ)を追加する。ショートコードは、投稿記事内でテキスト内容がない[tag]や、テキストを内包する[tag]テキスト[/tag]の書式で使用できる独自タグのこと。標準の状態では、 the_content関数によって表示する直前のフィルター処理内でパラメータ$funcで指定した関数・メソッドが実行される。

get_user_setting(2022年1月31日 更新)

mixed get_user_setting( string $name [ , string $default = false ] )
ユーザーインターフェイス設定を取得する。

have_posts(2018年5月27日 更新)

bool have_posts( )
次の投稿データが存在するかを調べる。

in_category(2018年5月27日 更新)

bool in_category( mixed $category [ , mixed $post = null ] )
投稿情報が指定したカテゴリーに属しているか調べる。

add_feed(2024年6月24日 更新)

string add_feed( string $feedname, callable $callback )
フィードを追加する。