Craft CMS のコマンドラインツールの resave/entries の便利な使い方をご紹介します。
Craft CMS で、サイトの運用を開始後しばらくしてからフィールドを追加するというケースはよくあると思います。
追加したフィールドがテキストフィールドで初期値は空っぽ、というのであれば問題ありません。しかし、例えば、追加するフィールドがラジオボタンで、初期値を設定する(つまり初期状態として特定の項目を選択させておく)場合、フィールド追加後に作成したエントリについては、自動で初期値の値が保存されますが、フィールド追加時点ですでに存在していたエントリについては、そのフィールドには何も値が保存されないままになってしまいます。
このようなケースでは resave/entries
コマンドが便利です。
このコマンドに下記のように --set
オプションと --to
オプションをつけることで、フィールドに値をセットすることができます。
php craft resave/entries --section=blog --set=bannerType --to="=wide"
上記のコマンドではセクションハンドルが blog
のエントリのフィールドハンドルが bannerType
というフィールドに wide
という値をセットしています。
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
をそのまま値として設定します。
--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を叩く必要はありませんね!