ETBS Edit Conflict Guard

説明

WordPress は、他の人が投稿を編集していることを標準で知らせてくれます。投稿タイトルの下に出る「編集中です」の通知です。しかしこの通知は警告にすぎません。2人目の編集者が「更新」や「公開」をクリックするのを止めることはなく、保存も止まりません。2人が同じ投稿をほぼ同時に編集すると、最後に保存した人が相手の変更を黙って上書きしてしまい、WordPress 本体にはそれを防ぐ仕組みがありません。

ETBS Edit Conflict Guard は、この通知に加えて投稿単位の実効性のある排他ロックを追加します。あるユーザーが投稿を開いて編集している間、他のすべてのユーザーの保存をブロックし、その理由をはっきりと伝えます。

動作の仕組み

  • 投稿の編集画面を開くと、その投稿のロックの取得を試みます (先に開いた人がロックを取得します)。
  • 編集画面を開いている間、ロックは WordPress 標準の Heartbeat API によって自動的に延長されます。
  • 「下書き保存」「更新」「公開」をクリックすると (旧エディター・ブロックエディターのどちらでも) ロックを判定します。他の人がロックを取得している場合、保存はブロックされ、モーダルで理由を説明します。
  • ロックは、保存に成功したとき、または Heartbeat が止まり (タブを閉じた場合など) 有効期限が過ぎたときに、自動的に解除されます。
  • ブロックは、旧エディターの投稿保存とブロックエディターの REST 経由の保存の両方について、サーバー側でも実施されます。そのため JavaScript が無効な場合や通信が不安定な場合でも、ロックは有効なままです。

管理画面を持つ投稿タイプは、初期状態ですべて対象になります (添付ファイルは除外)。設定画面から個別に除外できます。ロックの判定は「下書き保存」「更新」「公開」をクリックした瞬間にのみ行われ、編集画面を開いただけの状態では何も表示されません。

設定

設定 > Edit Conflict Guard で次の項目を変更できます。

  • ロックの有効期限 (秒)。
  • ロックの対象から除外する投稿タイプ。
  • ロック中の投稿のゴミ箱への移動もブロックするかどうか (初期状態はオフ。オンにすると、ロックを取得している本人の別タブからでも、ロック中の投稿のゴミ箱への移動はすべてブロックされます。完全削除は対象外です)。
  • 現在ロック中のすべての投稿を表示する一覧表。管理者向けに、行ごとの「強制解除」ボタンが付きます。

既知の制限

Edit Conflict Guard は意図的に厳格な作りになっており、その結果として、あらかじめ知っておいたほうがよい癖がいくつかあります。

  1. ブロックエディターのゴミ箱通知。 「ゴミ箱へ移動」がブロックされると、サーバーは正しく拒否します (投稿は公開状態のまま) が、ブロックエディター自体は「ゴミ箱へ移動しました」という成功通知を一瞬表示することがあります。これはロックの失敗ではなく、WordPress 本体の表示先行の挙動です。投稿一覧を再読み込みすれば、実際には移動していないことを確認できます。
  2. 一括でのゴミ箱移動。 ゴミ箱ブロックが有効なとき、投稿一覧からの一括「ゴミ箱へ移動」の対象にロック中の投稿が含まれていると、その投稿で処理が止まり、後続の投稿は未処理のまま残ります。
  3. 完全削除はゴミ箱ブロックの対象外です。 ゴミ箱ブロックが対象にするのはゴミ箱への移動だけです。ゴミ箱を経由せずに完全削除する操作 (たとえばカスタム投稿タイプに対する XML-RPC の wp.deletePost は、WordPress 本体がゴミ箱に入れず直接削除します) は、投稿がロック中でもブロックされません。
  4. マルチサイトには対応していません。 ロックはマルチサイトのネットワーク内の他のサイトを認識せず、サイト間で共有されることもありません。
  5. ロックは取得した本人にも適用されます。 仕様として、ロックを取得しているユーザー自身も、2つ目のタブやウィンドウから同じ投稿を保存することはできません。これは不具合ではなく意図的な動作です。プラグインには、2つのタブと2人の別々の編集者を区別する手段がありません。

スクリーンショット

インストール

  1. プラグインのファイルを /wp-content/plugins/etbs-edit-conflict-guard ディレクトリにアップロードするか、WordPress のプラグイン画面から直接インストールします。
  2. WordPress の「プラグイン」画面からプラグインを有効化します。
  3. 設定 > Edit Conflict Guard を開き、ロックの有効期限、対象から除外する投稿タイプ、ゴミ箱への移動をロック対象にするかどうかを確認します。

FAQ

WordPress が標準で表示する「他のユーザーが編集中です」の通知とは何が違うのですか ?

標準の通知はお知らせだけで、2人目のユーザーの保存を止めることはありません。このプラグインは実際のブロックを追加します。他の人がロックを取得している場合、「下書き保存」「更新」「公開」のクリックは拒否され (リクエストは HTTP ステータス409で拒否されます)、他の人の変更を黙って上書きする代わりに、理由を説明するモーダルが表示されます。

ロックが残ったままのようです。どうすれば解除できますか ?

ロックを取得しているユーザーの編集画面から Heartbeat が届かないまま有効期限 (設定 > Edit Conflict Guard で指定) が過ぎると、ロックは自動的に解除されます。保存せずにブラウザーのタブを閉じた場合などです。すぐに解除したい場合は、管理者が設定 > Edit Conflict Guard を開き、「現在ロック中の投稿」の表でその投稿の行にある「強制解除」ボタンを使ってください。

このプラグインはマルチサイトで動作しますか ?

現時点では対応していません。ロックはサイト単位で、マルチサイトのネットワーク内で他のサイトのロックを認識することはありません。

ゴミ箱への移動をブロックしたのに、画面には「ゴミ箱へ移動しました」と表示されました。失敗したのでしょうか ?

いいえ、投稿は移動していません。これはブロックエディターでのみ起こります。WordPress 本体はサーバーからの応答が届く前に成功の通知を表示しますが、サーバー側ではすでにリクエストを拒否しています。投稿一覧を再読み込みすると、投稿が元の状態のままであることを確認できます。

ロックを取得している本人が、自分でロックに引っかかることはありますか ?

はい、意図的にそうしています。同じユーザーが同じ投稿を2つ目のタブで開いた場合、その2つ目のタブは他のユーザーと同じように保存をブロックされます。このプラグインには2つのタブが同一人物のものだと判別する手段がないため、すべての人に同じルールを適用します。

評価

このプラグインにはレビューがありません。

貢献者と開発者

ETBS Edit Conflict Guard はオープンソースソフトウェアです。以下の人々がこのプラグインに貢献しています。

貢献者

“ETBS Edit Conflict Guard” は1ロケールに翻訳されています。 翻訳者のみなさん、翻訳へのご協力ありがとうございます。

“ETBS Edit Conflict Guard” をあなたの言語に翻訳しましょう。

開発に興味がありますか ?

コードを閲覧するか、SVN リポジトリをチェックするか、開発ログRSS で購読してみてください。

変更履歴

1.1.1

  • 日本語翻訳を同梱しました。translate.wordpress.org から配信される翻訳が利用できる場合は、そちらが優先されます。

1.1.0

  • プラグイン名を ETBS Edit Conflict Guard に変更しました。
  • 画面上のすべての文字列を英語にし、翻訳は同梱ファイルではなく translate.wordpress.org で扱うようにしました。
  • 同梱していた更新チェッカー (plugin-update-checker) を削除しました。
  • ダッシュボードウィジェットを削除しました。
  • プラグイン一覧の行から支援のリンクを削除しました。
  • 設定画面のインラインのスクリプトとスタイルを、読み込み用のアセットファイルに移しました。
  • 旧版と同時にインストールしても致命的なエラーにならないように、このプラグインの PHP クラス名と定数名を変更しました。設定のキーとロックテーブルは変更していないため、既存の設定はそのまま引き継がれます。
  • ロックテーブルと後片付け用のタスクが失われている場合、自動的に復元するようにしました。

1.0.3

  • 修正: プラグインを削除しても、設定した内容 (ロックの有効期限、対象から除外する投稿タイプ) が消えないようにしました。削除されるのは、このプラグイン自身の一時的なロックデータと、後片付け用の定期実行イベントだけです。

1.0.2

  • 「Requires at least」 (WordPress の最低バージョン) の宣言を削除しました。このプラグインが使用する API について、検証済みの最低バージョンが存在しないためです。

1.0.1

  • 宣言している「Requires PHP」を8.3から7.4に下げました。
  • プラグイン一覧の行と設定画面のフッターに、「カスタマイズのご依頼」・支援のリンクを追加しました。

1.0.0

  • 初回リリース。