Craft CMS で後から追加したフィールドのデフォルト値を既存のエントリにもセットする方法

Craft CMS のコマンドラインツールの resave/entries の便利な使い方をご紹介します。

Craft CMS Logo

Craft CMS で、サイトの運用を開始後しばらくしてからフィールドを追加するというケースはよくあると思います。

追加したフィールドがテキストフィールドで初期値は空っぽ、というのであれば問題ありません。しかし、例えば、追加するフィールドがラジオボタンで、初期値を設定する(つまり初期状態として特定の項目を選択させておく)場合、フィールド追加後に作成したエントリについては、自動で初期値の値が保存されますが、フィールド追加時点ですでに存在していたエントリについては、そのフィールドには何も値が保存されないままになってしまいます。

resave/entries コマンド

このようなケースでは resave/entries コマンドが便利です。

このコマンドに下記のように --set オプションと --to オプションをつけることで、フィールドに値をセットすることができます。

php craft resave/entries --section=blog --set=bannerType --to="=wide"

上記のコマンドではセクションハンドルが blog のエントリのフィールドハンドルが bannerType というフィールドに wide という値をセットしています。

--to オプション

help コマンドで見た --to オプションの使い方は下記の通りです。

--to: string|null
  The value that should be set on the --set attribute.
  
  The following value types are supported:
  - An attribute name: `--to myCustomField`
  - An object template: `--to "={myCustomField|lower}"`
  - A raw value: `--to "=foo bar"`
  - A PHP arrow function: `--to "fn(\\$element) => \\$element->callSomething()"`
  - An empty value: `--to :empty:`

日本語にして詳しく見ていきましょう。ちなみにオプションの書き方は「 --オプション名=オプション値 」でも「 --オプション名 オプション値 」でもどちらでもOKです。僕は = で繋ぐことが多いかな。

フィールドハンドル

--to myCustomField と指定すると、myCustomField というハンドルのフィールドの現在の値をそのまま使用します。

オブジェクトテンプレート

--to "={myCustomField|lower}" と指定すると、myCustomField というハンドルのフィールドの値を小文字に変換して使用します。Twigフィルタが使える感じですね。

生の値

--to "=foo bar" と指定すると、文字列 foo bar をそのまま値として設定します。

PHP アロー関数

--to "fn(\$element) => \$element->callSomething()" と指定すると、指定されたエレメントに対して callSomething メソッドを呼び出した結果を値として設定します。

上記のように help コマンドで出力される使い方では \\ とエスケープが二つになっていますが、実際にコマンドで入力するエスケープは一つですので注意が必要です。

例えば、foo というハンドルのフィールドに、エントリの著者のEmailをセットする場合は以下のようになります。

php craft resave/entries --section=blog --set=foo --to="fn(\$element) => \$element->getAuthor()->email"

空の値

--to :empty: と指定すると、属性の値を空にします。

まとめ

このように resave/entries コマンドでは特定の値をセットするだけでなく、PHPが使えたり、他のフィールドの値を入れられたりと、とても便利です。もうこういったケースではDBでSQLを叩く必要はありませんね!

Published 2024-04-21
Updated 2024-04-21