あるサービスサイトの料金ページを想像してください。本文には料金の説明文しか無く、金額そのものはACFAdvanced Custom Fields。投稿に独自の入力欄(カスタムフィールド)を追加するプラグインの定番。無料版と有料のPro版がある。の「月額料金」フィールドに入っていて、テンプレートがそれを表示しています。店舗ページの営業時間は business_hours というカスタムフィールド投稿に本文とは別の「項目名と値」を持たせる入力欄。資本金や営業時間のような値を本文の外で管理でき、ACFなどのプラグインで追加するのが一般的。。求人ページの「募集人数」もフィールド。どれも記事本文を読んでも出てこない値で、編集画面ではエディタの下のほうに並んでいます。
こういう値は、記事単位で「この記事を半年ごとに見直す」と決めても抜けます。本文を読み直して「合っている」と判断した担当者が、下にスクロールして月額料金の欄を見たかどうかは分からない。しかも本文を書いた人と金額を決める人は別の部署にいることが多い。コンテンツ更新管理では、ACFフィールドとカスタムフィールドを1つずつ独立した管理対象にして、それぞれに担当者と次回確認日を持たせられるようにしました。この記事はその範囲と、期限が来たときに「値をどうするか(どうしないか)」の話です。
フィールドを管理対象にすると何が付くか
管理対象になったフィールドには、投稿全体を管理するときと同じ情報が付きます。担当者(必須)、承認者、エスカレーション先、次回確認日(必須)、更新頻度、重要度、確認メモ、参照URL、期限前・期限超過の通知日数、通知チャンネル、そして期限切れ処理。1つの投稿に何個でも置けるので、「月額料金は管理部が3か月ごと、募集人数は人事が毎月」を同じ投稿の中で分けられます。
管理対象名の初期値は、ACFならフィールドラベル、カスタムフィールドなら設定画面で登録した表示名です。重要度は4段階で、価格や製品仕様のような値は「高」を想定しています。
ACFで対象にできる単位、できない単位

ACFフィールドとして選べるのは、通常のフィールドと、グループ全体、リピーター全体、Flexible Content全体の4つの形です。リピーターの行単位、Flexible Contentのレイアウト単位では管理できません。「料金プランのリピーターの3行目だけ」は無理で、リピーターまるごとを1つの管理対象にします。行ごとに担当者を変えたい場面には向いていない、とはっきり言っておきます。
既定で候補に出るフィールドタイプは20種類です。text / textarea / wysiwyg / number / range / email / url / select / checkbox / radio / button_group / true_false / link / date_picker / date_time_picker / time_picker / color_picker / repeater / group / flexible_content。逆に image / file / gallery / post_object / relationship / page_link / taxonomy / user / google_map / oembed / message / tab / accordion / clone は既定では候補から外してあります。画像や関連投稿のような参照系と、タブやメッセージのような表示専用のタイプです。必要ならACF設定の「管理候補に表示するフィールドタイプ」で候補に戻せます。特定のフィールドやフィールドグループを丸ごと候補から外す設定も同じ画面にあります。
ACFは任意の依存です。入っていないサイトではACFフィールドの項目が出ないだけで、投稿・ブロック・カスタムフィールドの管理はそのまま使えます。
投稿の編集画面から追加する

ACFフィールドは、投稿編集画面に出る「コンテンツ更新管理(ACF フィールド)」というメタボックスから、その投稿に表示されているフィールドを選んで追加します。フィールドグループの位置ルールで別の投稿タイプにしか出ないフィールドは、当然ここには並びません。
カスタムフィールドの追加経路は3つ。投稿に既にあるメタキーから選ぶ、メタキーを手で入力する、運用ルールで事前に登録しておく。候補一覧には _ で始まる非公開メタと、このプラグイン自身のメタは出しません。_edit_lock や _thumbnail_id のようにWordPress本体が内部で使う保護対象メタは、手入力でも登録できません。それ以外の _ 始まりのメタキーは、管理者だけが直接入力で登録できます。テーマやプラグインが _ を付けて保存している値も対象にしたい、というときの入口です。
ACFが作るメタキー(foo に対して _foo に field_ 始まりの値が入っている、あの形)はカスタムフィールドの候補からは外し、手入力なら警告つきで登録できます。同じ値はACFフィールドの側からも管理できるので、どちらで持つかは先に決めておくほうがいい。同じメタキーに複数の値が入っている場合は、メタキー単位で1つの管理対象になります。
保存は投稿の「更新」で一緒に行われます。管理ブロックのように別の保存ボタンはありません。
設定画面のカスタムフィールド設定(登録済みメタキー・表示名・対象投稿タイプ・除外メタキー)は、あくまで「候補のカタログ」です。ここにメタキーを登録しても、既存投稿に管理対象が一括で作られるわけではなく、それは運用ルールの一括適用の役目になっています。
確認したあとに値が変わったかは、生の値で比べる
フィールドの管理対象には、確認が完了した時点の値が「確認基準値」として保存されます。以後、投稿を保存するたびに現在の値と比べて、変わっていれば一覧・履歴・編集画面に「前回確認後に変更あり」と出ます。次回確認日は動かない。変わったことを知らせるだけです。
比較は正規化した値で行います。リスト型は順序を区別し、連想配列はキーの順序を無視し、型と「未設定・null・空文字・空配列」は別物として区別する。そしてACFは書式化する前の生の値で比べます。作っている側から言うと、ここは意図して生の値にしました。書式化後の値は、たとえば画像フィールドなら設定次第で配列にもURLにもなり、ACFの設定変更や版の更新で形が変わりうる。中身は何も変わっていないのに「変更あり」が出る、というのはこの機能ではいちばんまずい誤検知なので、変わりにくい層で比べています。
文字列や数値のような単純な値は変更前後を並べて表示します。リピーターのような複雑な値は「変更あり」と整形済みのスナップショットだけで、視覚的な差分は出ません。
期限が過ぎても、値には触らない

投稿単位の管理対象は、期限が過ぎたときに下書き・非公開・リダイレクトあるURLを開いたとき、別のURLへ自動で転送すること。ページを消す代わりに関連ページへ送ると、検索エンジンからの流入やブックマークを失いにくい。を選べます。管理ブロックならフロントで非表示か代替メッセージ。ところがACFフィールドとカスタムフィールドの期限切れ処理は、「管理画面で警告」か「通知のみ」の2択しかありません。「通知のみ」は画面に警告を出さず、期限が来たときに期限切れ通知のイベントだけを発生させる設定です。
この仕様にしたのは、フィールドの値がどこで使われているかをプラグイン側から知りようがないからです。ACFやカスタムフィールドの値は、テーマのテンプレートからも、他のプラグインからも、ショートコードからも出力されます。期限が来たからと値を空にしたり、出力を自動で止めたりすると、どのページのどの部分が壊れるか予測できない。料金の欄が空白になるだけならまだしも、テンプレートが値の存在を前提にしていれば表示そのものが崩れます。だからフィールドについては、値を書き換えず、隠さず、「期限が過ぎています」と人に知らせるところまでにしました。期限が来たらフィールドの値を自動で隠したい、という要望には応えていません。
期限は次回確認日で、確認が完了すれば完了日と更新頻度から次の日付が入ります。値を直したかどうかは、確認結果の「内容を更新した/確認したが変更不要/対応対象外」で残ります。
ACFを止めたとき、フィールド定義が消えたとき
ACFプラグインを無効化しても、エラーにはなりません。ACFフィールドの管理対象と履歴はそのまま残り、「連携停止中」と表示されて編集できなくなるだけです。ACFを戻せば続きから使えます。設定画面でACF連携をオフにした場合も同じ扱いで、履歴は保持したまま変更検出と通知が止まります。
フィールド定義のほうが消えたとき——フィールドグループからそのフィールドを削除した、グループごと消した——は、該当の管理対象を無効化し、履歴に「フィールド定義なし」を残して、管理者へ一度だけ警告を出します。点検は日次の定期処理なので、拾われるのは消した直後ではなく次の点検のとき。定義を作り直しても自動では復帰しません。必要なら管理対象を追加し直してください。
フィールド単位で担当者と期限を持つ、というのは4つある管理単位のうちの2つで、投稿全体や本文の一部分と組み合わせて使うものです。全体の考え方は更新期限と担当者をWordPressの中で管理する記事にまとめてあります。
製品ページは コンテンツ更新管理 にあります。
