このページでは、一般的なルール、予約キーワード、型強制、使用可能な名前空間、ベストプラクティスなど、Adobe Journey OptimizerのHandlebarsとPQL パーソナライゼーション構文について説明します。
Journey OptimizerのPersonalizationは、同じ式で一緒に動作する2つの補完的な構文を使用します。
- Handlebars (
{{...}}) – プロファイル属性のレンダリング、配列のループ、および呼び出しブロックヘルパーに使用されます。 詳しくは、HandlebarsJS ドキュメント を参照してください。 - Profile Query Language (PQL) (
{%= ... %}) – 組み込み関数の呼び出し(例:upperCase()、formatDate()、dateDiff())および条件式の評価に使用されます。
どのコンテキストにいるのかを理解することは、ランタイムエラーを回避するための鍵となります。 例えば、{{...}}内に配置されたPQL関数呼び出しは、HandlebarsがPQL式として評価するのではなくヘルパーとして解決しようとするため、失敗します。
例:
{{profile.person.name.firstName}}{%= upperCase(profile.person.name.firstName) %}{%#if profile.loyalty.tier = "gold"%}...{%/if%}{{#each profile.orders}}...{{/each}}属性の構造は、Adobe Experience Platform XDM スキーマで定義されます。 学習を増やす。
構文の一般的なルール general-rules
-
識別子には、Handlebars 構文用に予約されている次の特殊文字を除く任意の Unicode 文字を使用できます。
code language-none Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~ -
構文では大文字と小文字が区別されます。
-
true、false、null および undefinedという語は、パス式の最初の部分でのみ使用できます。
-
Handlebars では、{{expression}} から返される値は HTML エスケープされています。 式に「
&」が含まれている場合、返される HTML エスケープ出力は「&」として生成されます。 Handlebars の値をエスケープしない場合は、「トリプルスタッシュ」を使用します。フィールド
profile.person.nameの値が「Mark & Mary」であるとします。 構文{{profile.person.name}}にはMark & Maryが表示され、{{{profile.person.name}}}にはMark & Maryが表示されます。 -
リテラル関数の引数に関して、テンプレート言語パーサーはエスケープされない単一のバックスラッシュ(
\)記号をサポートしていません。 この文字は、バックスラッシュ(\)記号を追加してエスケープする必要があります。 例:{%= regexGroup("abc@xyz.com","@(\\w+)", 1)%} -
文字列値の中に リテラルの二重引用符 を含めるには(例:JSON出力を生成する場合)、バックスラッシュ(
\")でエスケープします。code language-handlebars { "message": "Hello \"{{profile.person.name.firstName}}\"" }出力:
{ "message": "Hello \"John\"" }または、HTMLでエンコードしない特殊文字が値に含まれている場合は、トリプルスタッシュ
{{{ }}}を使用してエスケープされていないHTMLを出力します。
予約済みのキーワード reserved-keywords
特定のキーワードは、Profile Query Language(PQL)で予約され、パーソナライゼーション式のフィールド名または変数名として直接使用できません。 XDM スキーマに予約済みのキーワードと一致する名前のフィールドが含まれている場合、式で参照するには、バックティック(`)を使用してエスケープする必要があります。
予約済みのキーワードは次のとおりです。
nextlastthis
例:
プロファイルスキーマに next という名前のフィールドがある場合は、バックティックで囲む必要があります。
{{profile.person.`next`.name}}
バックティックがないと、パーソナライゼーションエディターは検証に失敗し、エラーが発生します。
{{...}}個のHandlebars パスと{%= ... %}個のPQL エクスプレッションの両方に適用されます。これは、これらのキーワードがパス解決レベルで予約されているためです。 これは、バックティックエスケープがPQL式の内部でのみサポートされるハイフネーション付きフィールド名とは異なります。 ハイフネーションされた属性キーを参照してください。特殊属性キーのPQL構文ルール pql-special-keys
予約済みキーワード以外にも、2つのケースでPQL エクスプレッションでバックティック エスケープが必要になります。
ハイフネーションされた属性キー hyphenated-keys
XDM スキーマにハイフン付きのフィールド名(例:my-field、event-type)または数字で始まるまたは含まれる名前が含まれている場合は、キーをPQL エクスプレッション内のバックティックにラップします。
{%= profile.events.`order-total` > 100 %}
{%= ... %})内でのみサポートされています。 Handlebars補間({{...}})ではサポートされていません。 ただし、ハイフネーションされたフィールド名は{{...}} ブロック (例:{{profile.my-custom-field}})で直接参照できます。バックティック構文のみが失敗します。PQL式でバックティックを使用しない場合、ハイフンは減算演算子として解釈され、PQL構文エラーが発生します。
コンテキスト属性の数値イベント ID numeric-event-ids
イベント IDが数値(例:1697323153)であるコンテキストイベント属性を参照する場合は、バックティックにラップします。 これはformatDate()のような関数の内部でも適用されます。
型強制 type-coercion
PQLは強く型付けされています。 値を比較または渡す場合、両側は同じタイプである必要があります。 一般的なケース:
stringToNumber()を使用:{%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}string_to_integer()またはstringToNumber()を使用toBool()を使用して変換:{%= toBool(profile.consents.email.val) = true %}使用可能な名前空間 namespaces
-
プロファイル
この名前空間を使用すると、プロファイルスキーマで定義されているすべての属性を参照できます。このスキーマについて詳しくは、Adobe Experience Platform データモデル(XDM)のドキュメントを参照してください。
属性は、Journey Optimizer のパーソナライゼーションブロックで参照する前に、スキーマで定義しておく必要があります。
条件でプロファイル属性を活用する方法について詳しくは、この節を参照してください。
accordion サンプルリファレンス {{profile.person.name.fullName}}{{profile.person.name.firstName}}{{profile.person.gender}}{{profile.personalEmail.address}}{{profile.mobilePhone.number}}{{profile.homeAddress.city}}{{profile.faxPhone.number}}
-
オーディエンス
セグメント化サービスについて詳しくは、このドキュメントを参照してください。
-
オファー
この名前空間では、既存のオファー決定を参照できます。
オファーを参照するには、オファーを定義する様々な情報を使用してパスを宣言する必要があります。 このパスの構造は次のようになります。
offers.Type.[Placement Id].[Activity Id].Attributeここで:
offersはオファー名前空間に属するパス式を識別します。Typeはオファー表示域のタイプを決定します。image、htmlおよびtextなどの値が使用されます。Placement IdとActivity Idは配置とアクティビティの識別子です。Attributesは、オファータイプに依存するオファー固有の属性です。 例:deliveryUrl(画像の場合)
決定 API とオファー表示域について詳しくは、このページを参照してください。
すべての参照は、このページで説明されている検証メカニズムを使用して、オファースキーマに対して検証されます
accordion サンプルリファレンス -
画像がホストされる場所:
offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].deliveryUrl -
画像をクリックしたときのターゲット URL:
offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].linkUrl -
決定エンジンから得られるオファーのテキストコンテンツ:
offers.text.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content -
決定エンジンから得られるオファーの HTML コンテンツ:
offers.html.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content
ヘルパー helpers-all
Handlebars ヘルパーは、パラメーターの後に付けられる単純な識別子です。 各パラメーターは、Handlebars 式です。 これらのヘルパーは、テンプレート内の任意のコンテキストからアクセスできます。
これらのブロックヘルパーは、ヘルパー名の先頭にある # で識別され、対となる同じ名前の / タグで閉じる必要があります。
ブロックは、ブロック開始タグ({{# }})と終了タグ({{/}})を持つ式です。
ヘルパー関数について詳しくは、この節を参照してください。
リテラル型 literal-types
Adobe Journey Optimizer では、次のリテラル型をサポートしています。
例:
"prospect"、"jobs"、"articles"例:
-201、0、412メモ:配列内の項目のプロパティに直接アクセスすることはできません。
例:
[1, 4, 7]、["US", "FR"]ベストプラクティス best-practices
パーソナライゼーション式を作成する前に、これらの構文ルールを確認します。 ほとんどのランタイムエラーは、HandlebarsとPQLのコンテキストを混在させることから発生します。
正しい条件付きブロック構文を使用
常に{%#if%} / {%else if%} / {%else%} / {%/if%}を使用してください。 {% if %} / {% elseif %} / {% endif %}構文はサポートされていません。
Handlebars ブロック内のPQL関数を呼び出さない{{...}}
{{...}}はHandlebars変数とヘルパーのみを解決します。PQLは評価されません。 {{...}}内のupperCase()のようなPQL関数をラップすると、「ヘルパーが見つかりませんでした」エラーが発生します。 代わりに{%= ... %}を使用してください:
{{upperCase(cleanName)}}{%= upperCase(cleanName) %}{{#each}}と{%#if%}を組み合わせる場合は、名前付きループ エイリアスを使用します
this.fieldはHandlebars レンダラーによって解決されますが、{%#if%}条件内のPQL エバリュエーターによって解決されません。 両方のコンテキストがフィールドを解決できるように、as |item|を使用して名前付きエイリアスを定義します。
ループする前にPQL関数の結果を変数に割り当てます
topNなどのPQL UDFは、{{#each}}内で直接呼び出すことはできません。 最初に{% let %}で評価し、次に結果を繰り返します。
関数呼び出しの繰り返しを避けるために{% let %}を使用する
計算された値が複数回必要な場合は、変数に格納します。 これにより、読みやすさが向上し、冗長な評価を防ぐことができます。
dateDiffの正しい引数順序を使用する
dateDiff(start, end)は前の日付を最初に使用します。 将来の日付までの残り日数を計算するには、現在の日付を最初の引数として渡します。
==ではなく、=を使用してPQLで等価比較を行います
PQLは、等号に1つの=演算子を使用します。 ==を使用すると、構文エラーが発生します。
ハイフネーションされたフィールド名にバックティックを使用する – PQL式のみ
XDM スキーマフィールド名にハイフン (例:order-total)が含まれる場合は、ハイフンが減算演算子として解析されないように、ハイフンをバックティックで折り返します。 これは、{{...}}個のHandlebars ブロックではなく、{%= ... %}個のPQL式でのみサポートされています。
{%= profile.events.`order-total` > 100 %}
すぐに使用できるエクスプレッションについては、Personalization レシピ を参照してください。