よくある質問
このページでは、Liquidに関するよくある質問への回答を紹介します。

Brazeは現在、ShopifyのLiquidを100%サポートしているわけではなく、ドキュメントで概要を説明している特定の部分のみをサポートしています。エラーやサポートされていないLiquidの使用リスクを軽減するために、送信前にLiquidを使用したすべてのメッセージをテストしてください。
BrazeにおけるLiquidについて
BrazeでLiquidスニペットを使用するにはどうすればよいですか?
多くの場合、キャンペーンやキャンバスにアクセスし、メール本文やセグメントなどの領域でパーソナライゼーションモーダルにLiquidを挿入することで、Liquidスニペットを組み込むことができます。
詳しくはどこで学べますか?
Liquidの詳細については、Braze Learningのガイド付きパス「Dynamic Personalization with Liquid」をご覧ください。また、Liquidユースケースライブラリを参照して、Liquidを使用したさまざまなパーソナライゼーション例からインスピレーションを得ることもできます。
パーソナライゼーションにおけるLiquidとConnected Contentの違いは何ですか?
Braze Connected Contentは、Liquidタグの一例です。パーソナライゼーションにも使用されますが、このデータはBraze内に保存されたデータではなく、外部エンドポイントから取得されます。メッセージのパーソナライズ方法を拡張する方法については、専用のConnected Contentセクションをご覧ください。
Liquidテンプレートとは何ですか?
これは、BrazeでLiquidを使用する最も一般的な方法です。Liquidテンプレートでは、ユーザープロファイルからメッセージにデータを取り込みます。このデータは、ユーザーの名からトリガーメッセージのカスタムイベントまで多岐にわたります。
サポートされているLiquidタグの完全なリストについては、サポートされているパーソナライゼーションタグを参照してください。
Liquidの使用でデータポイントは消費されますか?
いいえ。
パーソナライゼーションタグとデータソース
Liquidを使用してパーソナライズされた挨拶を送信するにはどうすればよいですか?
ユーザーの名を使用してパーソナライズされた挨拶を行うには、{{${first_name}}}や{{${last_name}}}などの標準ユーザープロファイル属性を使用します。
また、Liquidの{% if X %}ステートメントを使用して、曜日やカスタム属性など、あらゆる条件に基づいた条件付きレンダリングを行うこともできます。条件文で使用できるサポートされているLiquidオペレーターの詳細については、オペレーターを参照してください。
ユーザーの位置情報に基づいてメッセージをパーソナライズするにはどうすればよいですか?
ユーザーの位置情報にはデフォルト属性があります:{{${most_recent_location}}}。
{{campaign.${name}}}と{{campaign.${message_name}}}の違いは何ですか?
{{campaign.${name}}}と{{campaign.${message_name}}}はどちらもサポートされているLiquidパーソナライゼーションタグです。どちらのタグもキャンペーン属性を参照します。{{campaign.${name}}}はキャンペーンの名前を示し、{{campaign.${message_name}}}はメッセージバリアントの名前です。
URLやクエリ文字列での使用(例:名前に%やスペースが含まれる場合)については、URL内のキャンペーン名を参照してください。
ネストされたオブジェクトでLiquidを使用するにはどうすればよいですか?
Brazeには、メッセージで使用できるセグメント用のLiquidコードを生成する組み込み機能があります。具体的には、オブジェクト内の複数の条件に一致するセグメントを作成できます。
詳細については、複数条件セグメンテーションを参照してください。
イベント属性を使用して、イベントがトリガーしているメッセージをパーソナライズするにはどうすればよいですか?
APIトリガーイベントのプロパティには、api_triggered_propertyタグを使用してアクセスできます:{{api_trigger_properties.${attribute_key}}}。
BrazeはLiquidで配列の配列をサポートしていますか?
Liquidは配列の配列をネイティブにサポートしていません。値をカンマ区切りの文字列の配列として保存し、必要に応じてsplitフィルターを使用して解析してください。
変数と構文
Liquidで変数を割り当てるにはどうすればよいですか?
assignタグを使用して変数を作成し、割り当てることができます。これにより、メッセージ作成画面内に変数が作成され、メッセージ全体で参照することもできます。
すべてのBraze Liquid変数を二重波括弧({{ }})で囲めば、assignを複数行に分割できます。これらの波括弧がないと、複数行のassignステートメントが予期しないレンダリングを引き起こす可能性があり、カスタム属性のテンプレート化に失敗する場合があります。例と関連する構文ルールについては、Liquidの使用を参照してください。
assignとcaptureはどのように使い分けるべきですか?
assignとcaptureはどちらもLiquid変数を作成しますが、目的が異なります。
assignは、ブール値、数値、単純な文字列など、単一の値を格納するシンプルな変数に使用します。同じ行で単一のフィルターを適用することもできます。captureは、複数の変数、文字列、または複雑な式を含む可能性のあるテキストブロックを格納するために使用します。
他のLiquid変数やカスタム属性をパラメーターとして使用するURLなど、単一のassignステートメントでは値が複雑すぎる場合にcaptureを使用してください。captureは、Connected Content呼び出しの本文でLiquid変数を実装する場合にも推奨されます。
例
{% comment %}Use assign for custom attributes{% endcomment %}
{% assign name = {{custom_attribute.${first_name}}} %}
{% assign price = {{custom_attribute.${price}}} | plus: 0 %}
{% comment %}Use assign for a simple variable{% endcomment %}
{% assign discount_label = "20% off" %}
Hello {{ customer.first_name | default: "there" }}, enjoy {{ discount_label }} on your next order!
{% comment %}Use capture for complex strings{% endcomment %}
{% capture greeting %}Hello, {{custom_attribute.${first_name}}}! Your order #{{custom_attribute.${order_id}}} is ready.{% endcapture %}
{{ greeting }}
{% comment %}Use capture to create conditional content{% endcomment %}
{% capture promo_block %}
{% if customer.vip == true %}
As a VIP member, you get free shipping.
{% else %}
Join our VIP program to unlock free shipping.
{% endif %}
{% endcapture %}
Liquid変数は件名と本文の間で引き継がれますか?
いいえ。Brazeは各メッセージコンポーネント(件名、HTML本文、プリヘッダー、プッシュタイトルなど)を個別にレンダリングします。あるフィールドで行った割り当てやキャプチャは、別のフィールドでは利用できません。値が必要な各フィールドでLiquidまたはConnected Content呼び出しを繰り返してください。
forループロジックとは何ですか?どのように使用できますか?
forループは反復タグとも呼ばれます。Liquidスニペットでforループロジックを使用すると、条件が満たされるまでLiquidブロックを繰り返し処理できます。
Brazeでは、配列カスタム属性の項目を確認したり、カタログ、セレクション、またはConnected Content呼び出しの応答で返される値やオブジェクトのリストを確認したりするために使用できます。具体的には、商品が在庫にあるかどうか、または商品が最低評価を持っているかどうかを確認するために、forループロジックをメッセージングの一部として使用できます。
例えば、「Games」というカタログに「cheap_games」というセレクションがあるとします。「cheap_games」のゲームタイトルを取得するには、次のLiquidスニペットを使用できます。
{% catalog_selection_items Games cheap_games %}
{% for item in items %}
Get this game: {{ item.title }}
{% endfor %}
設定した条件が満たされると、メッセージの送信に進むことができます。このロジックを使用することは、異なる条件に対してLiquidブロックを繰り返す代わりに時間を節約する便利な方法です。
中止ロジックとは何ですか?どのように使用できますか?
中止ロジックを使用すると、条件が満たされた場合にメッセージの送信を停止できます。これは、不完全なメッセージがユーザーに送信されるのを防ぐのに特に役立ちます。マーケティングキャンペーンでの中止ロジックの例については、メッセージの中止を参照してください。
abort_messageタグ内でLiquidを使用できますか?
いいえ。{% abort_message %}タグは引用符で囲まれた静的文字列を受け付けますが、Liquidパーソナライゼーションは受け付けません。条件付きの中止動作が必要な場合は、タグの前に他のLiquidロジックを使用してください。
Liquidで電話番号をマスクするにはどうすればよいですか?
sliceフィルターを使用して特定の桁を抽出し、appendフィルターを使用してマスク文字と組み合わせることで、電話番号をマスクできます。
下4桁以外をすべてマスクする
10桁の電話番号を******7890と表示するには:
{% assign phone = {{${phone_number}}} | split: '' %}
{% assign masked_phone = '' %}
{% for i in (0..5) %}
{% assign masked_phone = masked_phone | append: '*' %}
{% endfor %}
{% for i in (6..9) %}
{% assign masked_phone = masked_phone | append: phone[i] %}
{% endfor %}
{{ masked_phone }}
最初の3桁と最後の4桁を表示する
10桁の電話番号を123***7890と表示するには:
{% assign first_part = {{${phone_number}}} | slice: 0, 3 %}
{% assign last_part = {{${phone_number}}} | slice: -4, 4 %}
{% assign masked_phone_number = first_part | append: "***" | append: last_part %}
{{ masked_phone_number }}
キャンバス、カタログ、およびトリガープロパティ
APIトリガーのLiquidがBrazeで失敗するのはなぜですか?
余分な波括弧のペアが一般的な原因です。例えば、{{{api_trigger_properties.${attribute_key}}}} は有効なBrazeパーソナライゼーション構文ではありません。開き波括弧と閉じ波括弧をそれぞれ正確に2つずつ使用してください:{{api_trigger_properties.${attribute_key}}}。
キャンバスコンテキストプロパティにサイズ制限はありますか?
Brazeはキャンバスコンテキストプロパティにハードリミットを設けていませんが、ペイロードは約1 KB(約1,000文字)以下に抑えてください。オブジェクトが大きくなると、メモリ使用量が増加し、大量送信時にメッセージのレンダリングが遅延する可能性があります。
ダッシュボードで特定のデータ型をプレビューする際にLiquidエラーが発生するのはなぜですか?
一部のキャンバスコンテキストプロパティの型は、比較や計算で使用する前にLiquidでの型変換が必要です。例えば、数値としての動作が必要な場合は次のようにします:
{{context.${property_name} | plus: 0}}
カタログのLiquidスニペットが中止メッセージを返すのはなぜですか?
カタログのLiquidスニペットが送信中に中止される場合は、一括選択や完全な動的選択を使用する代わりに、パーソナライゼーションメニューから個別のカタログアイテムを選択してスニペットを再作成してください。詳細については、カタログおよびセレクションを参照してください。
Content Blocksとメッセージ作成画面
Content Blocksを使用するメッセージに余分なスペースが入るのはなぜですか?
Liquidを使用したContent Blocksで送信されたメッセージに余分なスペースがある場合、条件文内に不要な段落や改行が含まれている可能性があります。条件文は複数行にまたがるのではなく、1行で記述してください。
例
{% if {{custom_attribute.${has_discount}}} == true %}Discounted Item{% elsif {{custom_attribute.${is_new_arrival}}} == true %}New Arrival{% else %}Regular Item{% endif %}
複数行のLiquidがドラッグ&ドロップエディターで予期しない空白を生成するのはなぜですか?
アプリ内メッセージのドラッグ&ドロップエディターやメールのドラッグ&ドロップエディターでLiquidコードが複数行にわたって記述されている場合、各{% %}ブロックは非表示テキストとしてレンダリングされます。改行は表示される出力の前に空行として保持されるため、予期しない空白が発生します。
解決策1:空白制御タグを使用する(推奨)
タグの区切り文字の内側にハイフンを追加して、コードの可読性を維持しながら周囲の空白を除去します。
{%- assign event_date = {{custom_attribute.${PreferredPickupDate}}} | date: "%s" -%}
{%- assign today = 'now' | date: "%s" -%}
{%- assign difference = event_date | minus: today -%}
{%- assign difference_days = difference | divided_by: 86400 -%}
Only {{ difference_days }} days until your move!
解決策2:Liquidを1行にまとめる
すべての改行を削除して、Liquidを1つの連続した行にします。
{% assign event_date = {{custom_attribute.${PreferredPickupDate}}} | date: "%s" %}{% assign today = 'now' | date: "%s" %}{% assign difference = event_date | minus: today %}{% assign difference_days = difference | divided_by: 86400 %}Only {{ difference_days }} days until your move!
どちらの方法でも、レンダリングされたメッセージで不要な空行を防ぐことができます。これはアプリ内メッセージのドラッグ&ドロップエディター、メールのドラッグ&ドロップエディター、およびLiquidを使用したContent Blocksに適用されます。詳細については、ShopifyのWhitespace controlドキュメントおよびBrazeのLiquid構文を参照してください。
ドラッグ&ドロップの検索ツールでRowにContent Blockが表示されないのはなぜですか?
一部のContent Blocksはドラッグ&ドロップエディターの検索でRowの下に表示されません。コンテンツタブ(Advanced)からHTMLブロックを追加し、そのHTMLブロック内にContent BlockのLiquidタグを挿入してブロックコンテンツをレンダリングしてください。
ドラッグ&ドロップのContent Blockプレビューが作成画面の表示と異なるのはなぜですか?
Content BlockをLiquidでテンプレート化する場合、ブロック内のモバイルメディアクエリがプレビューでは、ブロックをメッセージに直接ドラッグした場合と同じように適用されないことがあります。ブロックをドラッグするとレイアウトは保持されますが、ソースブロックとの連携が切断されるため、将来のブロック編集がメッセージに自動的に反映されなくなります。
メッセージ作成画面でイベントプロパティの値をプレビューするにはどうすればよいですか?
カスタムユーザーとしてプレビューを使用し、プレビューするユーザーのサンプルカスタムイベントプロパティ値を入力します。これは、中止をトリガーしないプレビュー値が必要な、中止ロジックを含むメッセージにも便利です。
プッシュメッセージでのLiquid
iOSのプッシュタイトルでLiquidを使用すると切り詰められて表示されるのはなぜですか?
iOSのプッシュ通知タイトルは、デバイス上で1行として表示されます。Liquidの出力に改行文字が含まれている場合、ユーザーには最初の改行までのテキストしか表示されない場合があります。
最終的なタイトル出力にstrip_newlinesフィルターを適用してください。プッシュ作成画面での例については、プッシュ通知を作成するを参照してください。タイトルテキストの表示量に影響するその他の要因については、テキスト切り詰めにおける変数を参照してください。
プッシュメッセージの本文(タイトルではなく)については、Brazeはメッセージ送信時にLiquidタグに隣接する改行を自動的に削除します。この動作はタイトルフィールドには適用されません。詳細については、プッシュ通知の改行を参照してください。
メールメッセージでのLiquid
「Invalid from email address for recipient:」でメッセージが中止されるのはなぜですか?
この中止は、差出人アドレス内のLiquidが無効な構文を生成した場合に発生します。例えば、変数の欠落、余分なスペース、許可されていない文字などが原因です。テストユーザーでプレビューし、レンダリングされた差出人アドレスが設定済みの送信ドメインと一致していることを確認してください。
動的な返信先アドレスを作成するにはどうすればよいですか?
ワークスペースが動的な返信先設定をサポートしている場合は、返信先フィールドでLiquidを使用してください。必要に応じて、差出人の表示名設定と組み合わせてください。ワークスペース固有のオプションについては、メール設定を参照してください。
Liquidエラーのトラブルシューティング
Liquidコードが正しく見えるのに動作しないのはなぜですか?
Liquidコードの構文が正しいように見えるのに動作しない場合、ストレートクォート(' 'や" ")やハイフン(-)ではなく、スマートクォート(' 'や" "のような丸い引用符)やスマートダッシュ(—のようなemダッシュ)が使用されていないか確認してください。Liquidはストレート ASCII文字のみを認識するため、スマートクォートやダッシュは解析エラーの原因になります。
これは、macOSのキーボード設定でスマート引用符とスマートダッシュを使用が有効になっている場合によく発生します。この設定により、Brazeダッシュボードで入力する際に文字が自動的に変換されます。
macOSでこの設定を無効にするには:
- システム設定 > キーボード > テキスト入力 > 編集に移動します。
- スマート引用符とスマートダッシュを使用のチェックを外します。
| 例 | 丸い引用符(動作しない) | ストレートクォート(動作する) |
|---|---|---|
| デフォルト値 | {{${first_name} | default: 'Torchie'}} |
{{${first_name} | default: 'Torchie'}} |
| 条件式 | {% if ${country} contains 'US' %} |
{% if ${country} contains 'US' %} |
これはデフォルト値、条件式、およびクォートを使用するその他すべてのLiquidに当てはまります。丸い引用符とストレートクォートは画面上では同じように見えることがあるため、コードを注意深く比較するか、プレーンテキストエディタに貼り付けて確認してください。
Liquidでのクォートの使用に関する詳細は、Liquid構文を参照してください。
「Unexpected end token」というLiquidエラーが表示されるのはなぜですか?
このエラーは通常、余分な波括弧や波括弧の不足を示しています。{{ }}を別のLiquidタグ式の内部にネストしないでください。例えば、属性参照を追加の波括弧で囲むのではなく、{{custom_attribute.${date_of_birth} | date: '%s'}}のように使用してください。
アプリ内メッセージでConnected Contentのリトライが利用できないのはなぜですか?
リトライ付きの{% connected_content %}タグは、一部のアプリ内メッセージ形式を含むすべてのメッセージタイプでサポートされているわけではありません。リトライパラメーターを削除するか、リトライ対応のConnected Content呼び出しにはサポートされているチャネルを使用してください。
「Liquid Error: Comparison of Time with String Failed」が表示されるのはなぜですか?
このエラーは、時間型のカスタム属性やイベントプロパティを空白の値(空の文字列)と直接比較した場合に発生します。Liquidは、時間オブジェクトと文字列など、異なるデータ型間の直接比較をサポートしていません。
以下は、このエラーを引き起こす一般的な例です:
{% if {{custom_attribute.${expiration_date}}} == blank %}
<a>Some words</a>
{% endif %}
これは、データ型が時間であるカスタム属性を文字列(blank)と比較しようとしているため失敗します。
これを解決するには、時間属性を変数に代入して文字列に変換し、レンダリング時に属性が空白と評価される場合にdefaultフィルターを使用します:
{% assign expiration_date = {{custom_attribute.${expiration_date}}} | default: "" %}
{% if expiration_date == blank %}
<a>Example Words</a>
{% endif %}
時間型のカスタム属性を現在の時刻や将来の日付と比較する場合も、同じアプローチを使用します:
{% assign today = 'now' | date: '%s' %}
{% assign month = 'now' | date: '%s' | plus: 2592000 %}
{% assign expiration_date = {{custom_attribute.${expiration_date}}} | default: "" %}
{% if expiration_date == blank %}
<a>Example Words</a>
{% elsif expiration_date >= today and expiration_date >= month %}
<a>More Words</a>
{% endif %}