Paletteページの一括検索と置換
Paletteで構築したコンテンツは、各ページのコンポーネントツリー内に存在します。タイトル、リッチテキスト、ボタンのラベル、リンク先、メディア参照はすべて、ページに保存された inputs内に収められています。そのため、サイト全体の変更は面倒です。同じ製品名やロゴが何十ものページに表示されることがあり、編集できる単一のフィールドは存在しません。
Palette Pro の新しいコマンドがまさにそれを解決します。各コマンドはすべてのPaletteページを走査し、一致する箇所だけを書き換え、実際に変更があったページのみを保存します。また、 --dry-run でデータベースに触れる前にすべてをプレビューできます。
製品名を変更する
ページ本文やボタンに表示される製品名・機能名を、すべての箇所で変更します。
会社をリブランドする
古い会社名を新しい会社名に、サイト全体で一度に置き換えます。
リンクの向き先を変更する
すべてのリンクを、古いURLやページから新しい宛先へ移動します(内部・外部を問わず)。
ロゴを置き換える
古い画像・ロゴへのすべての参照を、新しいメディア項目に向け直します(サイト全体)。
出発点
デモページには、4つの要素が1つのビューにまとまっています。ヘッダーの ロゴ 、 “Download Palette” という製品ボタン、ナビゲーションと行動喚起の リンク、そしてヒーロー内の メディア画像 です。

① テキストと名前 — ppr:string
サイト全体で製品名や会社名を変更する
製品「Palette」を「Prism」に改名するとします。まずドライランを実行して、何が変更されるかを正確に確認します。この時点ではまだ何も書き込まれません:
$ drush ppr:string "Palette" "Prism" --dry-run ---------------- ------------- Canvas page ID Occurrences ---------------- ------------- 13 7 22 1 ---------------- ------------- [OK] [dry-run] Would replace "Palette" -> "Prism": 8 occurrence(s) across 2 page(s).
ページごとのテーブルに一致箇所が表示されます。問題なければ、 --dry-run を外して適用します:
$ drush ppr:string "Palette" "Prism" [OK] Replaced "Palette" -> "Prism": 8 occurrence(s) across 2 page(s).
製品ボタンは即座に更新されます。ページ本文・見出し・リッチテキスト内の他のすべての「Palette」も同様です:
変更前

変更後

マッチングは単純な部分文字列の置換で、文字列値・リッチテキストHTML・各ページのタイトルと説明に適用されます。大文字と小文字を区別するため、 Palette と palette は別々に扱われます。
② リンク — ppr:link
すべてのリンクを新しいページに向ける
ランディングページが移動したら、リンクされているすべての箇所で宛先を更新します。linkコマンドはリンクURIを 完全一致でマッチするため、 /about が誤って /about-usを書き換えることはありません。絶対URLでもDrupal内部URL(internal:/…)でも同様に機能します。
$ drush ppr:link "https://www.drupal.org/project/canvas_palette" \ "https://prism.example.com/download" --dry-run ---------------- ------------- Canvas page ID Occurrences ---------------- ------------- 13 4 ---------------- ------------- [OK] [dry-run] Would replace https://www.drupal.org/project/canvas_palette -> https://prism.example.com/download: 4 occurrence(s) across 1 page(s).
古いアドレスを指していたすべての行動喚起・ナビゲーション項目・インラインボタンが、1つのコマンドで新しいアドレスに解決されます。ページごとの編集は不要です。
内部リンクも同様
サイトページ間の向き先変更も同じように機能します: drush ppr:link "internal:/old-page" "internal:/new-page".
③ メディアとロゴ — ppr:media
ロゴや画像をすべての箇所で入れ替える
メディア参照は識別子によって入れ替えられます。各引数は数値の メディアID または UUID, and both are validated to exist before anything changes. Here we replace the old header logo (media 24) with a new one (media 9):
$ drush ppr:media 24 9 --dry-run ---------------- ------------- Canvas page ID Occurrences ---------------- ------------- 13 1 ---------------- ------------- [OK] [dry-run] Would replace media 24 -> media 9: 1 occurrence(s) across 1 page(s). $ drush ppr:media 24 9 [OK] Replaced media 24 -> media 9: 1 occurrence(s) across 1 page(s).
ヘッダーはそれを使用するすべてのページに表示されるため、1回の実行でロゴをサイト全体でリブランドできます。このコマンドは、コンポーネントの画像・動画参照に加えて、ページ自身の画像フィールドも対象とします。
変更前 — 旧ロゴ

変更後 — 新ロゴ

リブランド全体を並べて比較
3つの短いコマンド(名前・リンク・ロゴ)でページが一変し、まったく同じ編集がサイト内の他のすべてのCanvasページにも適用されます。
変更前

変更後

実サイトで安全に使える設計
- まずプレビュー。 すべてのコマンドは
--dry-runを受け付け、何も書き込まずにページごとの正確な件数を出力します。 - 変更があったものだけが保存される。 一致しないページはそのまま残され、リビジョン履歴がクリーンに保たれます。
- 正確なマッチング。 リンクは完全一致のURIで、メディアは検証済みのID/UUIDでマッチし、巻き添えの編集はありません。
- 堅牢な実行。 あるページに、Canvasが再保存できないレガシーなコンポーネントデータが含まれている場合、そのページはバッチ全体を中止せず、明確な警告とともにスキップされます。
$ drush ppr:string "About us" "Our Story" ! [WARNING] 1 page(s) matched but could not be saved (pre-existing invalid component data) and were skipped: ---------------- ------------------------------------------------------------ Canvas page ID Save error ---------------- ------------------------------------------------------------ 9 inputs.baf00a36…flex_direction: The property flex_direction is required. ---------------- ------------------------------------------------------------
実行は続行され、正常なページはすべて更新されます。スキップされたページはIDで報告されるため、個別に修正できます。
コマンドリファレンス
| コマンド | エイリアス | 置換対象 |
|---|---|---|
palette-pro:replace-string "<search>" "<replace>" | ppr:string | 文字列値・リッチテキストHTML・ページのタイトル/説明内の任意の部分文字列。 |
palette-pro:replace-link "<old-uri>" "<new-uri>" | ppr:link | 完全一致のリンクURI(および素のリンク文字列)。絶対または internal:/…. |
palette-pro:replace-media <old> <new> | ppr:media | あらゆる箇所のメディア参照(コンポーネントの画像/動画+ページの画像フィールド)。引数はメディアIDまたはUUID。 |
任意のコマンドに --dry-run を追加するとプレビューできます。それぞれ、いくつの箇所を変更したかをページごとのテーブルで出力します。