以前、「Peter’s Collaboration E-mails」と「User Role Editor」、そして「WP Post Branches」プラグインを使って、公開中のページを更新する際の承認フローを実装した記事を書きました。
→ 公開中のページを公開したまま編集して承認待ちにする

これでうまく実装できたかに思えたのですが、ひとつ問題がありました。どんなに検証を重ねていても、いざ運用してみると見えなかった問題が明らかになるということは多々あります。

今回の案件、元々それぞれのコンテンツに対して担当者は1人という設定だったのですが、運用開始時点でいくつかのコンテンツに対しては複数の担当者が携わることになり、そこで問題が見つかりました。それは次のようなパターンです。

  1. 担当者Aが新規に記事を作成し、レビュー待ちする
  2. 承認者がレビュー待ちの記事を承認して公開する
  3. 担当者Bが記事のブランチ(修正用コピー)を作成して編集し、レビュー待ちとする
  4. 承認者がレビュー待ちのブランチを承認して記事を更新する

「Peter’s Collaboration E-mails」プラグインによって、担当者(WordPress での寄稿者)がレビュー待ちとした際に承認者(WordPress での編集者)に承認依頼のメールが送信され、承認されると担当者に承認通知のメールが送信されます。

これが上記のような場合、担当者Bがブランチを作成してレビュー待ちとした時に、承認者に届くメールは担当者Aからの承認依頼となっており、承認通知のメールも担当者Aに届いてしまうのです。

ブランチの作成は「WP Post Branches」プラグインによる機能ですが、検証してみたところ、元の記事の作成者がそのままブランチにも設定されているようでした。ブランチを作る際に、記事のタイトルや本文、カスタムフィールドの内容などとあわせて、記事の作成者までもコピーされるので、編集者(ブランチの作成者)ではなく、元の記事の作成者がそのまま引き継がれてしまうのです。

これでは運用上問題がありますので、ブランチを作った際にログインしているユーザーを記事の作成者として置き替えることができないか、「WP Post Branches」プラグインのソースを探ってみました。

そもそもプログラマじゃないので、WordPress Codex などを参照しながらの試行錯誤ですが、wp-post-branches.php に次のコードを追加することで解決することができました。

37行目からの function wpbs_pre_post_update( $id ) の関数の中に以下を追加します。

// replace login user to post_author
$user = wp_get_current_user();
$pub['post_author'] = $user -> ID;

これで、ブランチを作る時にログインしているユーザーをブランチの作成者として置き替えることになりますので、担当者Bがブランチを作成してレビュー待ちとした時に、承認者に届くメールは担当者Bからの承認依頼となり、承認通知のメールも担当者Bに届きます。

解決できない場合は、ブランチを作った際に編集画面で作成者を変更していただくという運用をお願いしようと考えていましたが、解決できてほっとしています。

ただ、プラグインのソースを編集していますので、プラグインの更新時には注意が必要です。