Skip to content

よくある質問

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

BrazeにおけるLiquidについて

BrazeでLiquidスニペットを使用するにはどうすればよいですか?

多くの場合、キャンペーンやキャンバスにアクセスし、メール本文やセグメントなどのエリアで、パーソナライゼーションモーダルにLiquidを挿入することで、Liquidスニペットを組み込むことができます。

さらに詳しく知るには?

Liquidについて詳しくは、Braze Learningのガイド付きパス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の使用を参照してください。

assigncaptureはどのように使い分けるべきですか?

assigncaptureはどちらもLiquid変数を作成しますが、用途が異なります。

  • assignは、ブール値、数値、単純な文字列など、単一の値を格納するシンプルな変数に使用します。同じ行で単一のフィルターを適用することもできます。
  • captureは、複数の変数、文字列、または複雑な式を含む可能性のあるテキストブロックを格納するために使用します。

他のLiquid変数やカスタム属性をパラメータとして使用するURLなど、値が単一のassignステートメントでは複雑すぎる場合にcaptureを使用してください。captureは、Connected Content呼び出しの本文にLiquid変数を実装する場合にも推奨されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% 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スニペットを使用できます。

1
2
3
4
{% 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と表示するには:

1
2
3
4
5
6
7
8
9
{% 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と表示するには:

1
2
3
4
{% 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つと閉じ波括弧2つを正確に使用してください:{{api_trigger_properties.${attribute_key}}}

キャンバスコンテキストプロパティにサイズ制限はありますか?

Brazeはキャンバスコンテキストプロパティにハードリミットを設けていませんが、ペイロードは約1 KB(約1,000文字)以下に抑えてください。大きなオブジェクトはメモリ使用量を増加させ、大量送信時にメッセージのレンダリングを遅延させる可能性があります。

ダッシュボードで特定のデータ型をプレビューする際にLiquidエラーが発生するのはなぜですか?

一部のキャンバスコンテキストプロパティの型は、比較や計算に使用する前にLiquidでの型変換が必要です。例えば、数値の動作が必要な場合は以下のようにします:

1
{{context.${property_name} | plus: 0}}

カタログのLiquidスニペットが中止メッセージを返すのはなぜですか?

カタログのLiquidスニペットが送信中に中止される場合は、一括選択や完全にダイナミックな選択を使用する代わりに、パーソナライゼーションメニューから個別のカタログアイテムを選択してスニペットを再作成してください。カタログセレクションを参照してください。

Content Blocksとメッセージ作成画面

Content Blocksを使用したメッセージに余分なスペースが表示されるのはなぜですか?

Liquidを使用するContent Blocksで送信されたメッセージに余分なスペースがある場合、条件文内に不要な段落や改行が含まれている可能性があります。条件文は複数行にまたがらず、1行にまとめて記述してください。

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
2
3
4
5
{%- 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つの連続した行にします。

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構文を参照してください。

ドラッグ&ドロップの検索ツールでにContent Blockが表示されないのはなぜですか?

一部のContent Blocksは、ドラッグ&ドロップエディターの検索での下に表示されません。コンテンツタブ(詳細)からHTMLブロックを追加し、そのHTMLブロック内にContent BlockのLiquidタグを挿入してブロックコンテンツをレンダリングしてください。

ドラッグ&ドロップのContent Blockプレビューが作成ビューと異なるのはなぜですか?

Content BlockをLiquidでテンプレート化すると、ブロック内のモバイルメディアクエリがプレビューで適用される方法が、ブロックを直接メッセージにドラッグした場合と異なることがあります。ブロックをドラッグするとレイアウトは保持されますが、ソースブロックから切り離されるため、ブロックを今後編集してもメッセージは自動的に更新されなくなります。

メッセージ作成画面でイベントプロパティの値をプレビューするにはどうすればよいですか?

カスタムユーザーとしてプレビューを使用し、プレビューするユーザーのサンプルカスタムイベントプロパティ値を入力してください。これは、中止ロジックを含むメッセージで、中止をトリガーしないプレビュー値が必要な場合にも便利です。

メールメッセージにおけるLiquid

「Invalid from email address for recipient:」でメッセージが中止されるのはなぜですか?

この中止は、差出人アドレス内のLiquidが無効な構文(変数の欠落、余分なスペース、許可されていない文字など)を生成した場合に発生します。テストユーザーでプレビューし、レンダリングされた差出人アドレスが設定済みの送信ドメインと一致していることを確認してください。

ダイナミックな返信先アドレスを作成するにはどうすればよいですか?

ワークスペースがダイナミックな返信先設定をサポートしている場合は、返信先フィールドでLiquidを使用してください。必要に応じて差出人の表示名設定と組み合わせてください。ワークスペース固有のオプションについては、メール設定を参照してください。

Liquidエラーのトラブルシューティング

Liquidコードが正しく見えるのに動作しないのはなぜですか?

Liquidコードの構文が正しいように見えるのに動作しない場合は、ストレート引用符(' '" ")やハイフン(-)の代わりに、スマート引用符(' '" "のような丸引用符)やスマートダッシュ(のようなemダッシュ)が使われていないか確認してください。Liquidはストレート ASCII 文字のみを認識するため、スマート引用符やスマートダッシュはパースエラーの原因となります。

これはmacOSのキーボード設定でスマート引用符とスマートダッシュを使用が有効になっている場合によく発生し、Brazeダッシュボードで入力中に文字が自動的に変換されます。

macOSでこの設定を無効にするには:

  1. システム設定 > キーボード > テキスト入力 > 編集に移動します。
  2. スマート引用符とスマートダッシュを使用のチェックを外します。
丸引用符(動作しない) ストレート引用符(動作する)
デフォルト値 {{${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は、時間オブジェクトと文字列など、異なるデータ型間の直接比較をサポートしていません。

以下はこのエラーを引き起こす一般的な例です。

1
2
3
{% if {{custom_attribute.${expiration_date}}} == blank %}
  <a>Some words</a>
{% endif %}

これは、データ型が時間であるカスタム属性を文字列(blank)と比較できないため失敗します。

この問題を解決するには、時間属性を変数に割り当て、レンダリング時に属性が空と評価される場合にdefaultフィルターを使用して文字列に変換します。

1
2
3
4
5
{% assign expiration_date = {{custom_attribute.${expiration_date}}} | default: "" %}

{% if expiration_date == blank %}
  <a>Example Words</a>
{% endif %}

時間型のカスタム属性を現在の時刻や将来の日付と比較する場合も、同じアプローチを使用します。

1
2
3
4
5
6
7
8
9
{% 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 %}
New Stuff!