# メッセージコンテンツのパーソナライズ

In-Browser Messageキャンペーンでは、**プロフィール変数**と**Liquidテンプレート構文**を使用したダイナミックコンテンツのパーソナライズをサポートしています。変数はRT Personalization 2.0によって実行時に解決され、TD Web SDKがメッセージをブラウザに表示する前にレンダリングされます。

## 変数のソース

In-Browser Messageで利用できるプロフィール変数は、キャンペーンに紐付いた**ペアレントセグメント**から提供される以下の4つのソースが存在します。

| **ソース**  | **プレフィックス**  | **説明**  |
|  --- | --- | --- |
| バッチ属性 | `rt_profile.imported.*` | バッチ処理で算出され、RT 2.0にExternal（EXT）属性としてインポートされたユーザープロフィール属性（ロイヤルティティア、生涯価値、氏名など）。Liquid構文では`rt_profile.imported.*`でアクセスします（例：`rt_profile.imported.loyalty_tier`）。 |
| RTシングル属性 | `rt_profile.single.*` | ストリーミングイベントに基づいてリアルタイムで更新されるスカラー値（最近閲覧した商品、現在のセッションデータなど）。 |
| RTリスト属性 | `rt_profile.list.*` | リアルタイムで更新される配列値（カートの中身、閲覧履歴など）。 |
| RTカウンター属性 | `rt_profile.counter.*` | リアルタイムで更新される数値カウンター（訪問回数、購入回数など）。 |


イベントフィールドは現在非サポート
Liquidテンプレートコンテンツ内でトリガーイベントのフィールド（例：ページビューの`product_id`）を参照することはサポートされていません。

## 基本的な変数の出力

ダブルカーリーブレースを使用して変数の値をコンテンツに直接出力します。

```html
<p>Welcome back, {{rt_profile.imported.first_name}}!</p>
<p>Your current tier: {{rt_profile.imported.loyalty_tier}}</p>
<p>Most recent product viewed: {{rt_profile.single.most_recent_product}}</p>
```

変数出力はHTMLエスケープされます
すべての `{{ variable }}` 出力は、ブラウザに配信される前にRT 2.0によって自動的にHTMLエスケープされます。属性値内の `<`、`>`、`"`、`&` などの文字はエスケープされるため、Liquidの `escape` フィルターが非サポートであっても、ユーザーが入力したフィールドからXSSが発生することはありません。

## Liquidテンプレート構文

In-Browser MessageはLiquidテンプレート構文の**限定的なサブセット**をサポートしています。テンプレートはRealtime APIによって設定時にReactor互換のJavaScript式に変換され、各パーソナライズリクエストの実行時に評価されます。

### サポートされる構文

| **構文**  | **サポート**  | **備考**  |
|  --- | --- | --- |
| `{% if %} / {% elsif %} / {% else %} / {% endif %}` | ✅ | ネストの深さに制限なし。 |
| `{% for item in collection %} / {% endfor %}` | ✅ | 最大3レベルのネスト。 |
| `{{ variable }}`による変数出力 | ✅ | `rt_profile.*`プレフィックスを使用（例：`rt_profile.imported.*`、`rt_profile.single.*`）。 |
| `==`、`!=`比較 | ✅ | 文字列とnullの比較。 |
| `and` / `or`論理演算子 | ✅ | 複数の条件を組み合わせる場合に使用。 |
| `{% assign %}`変数代入 | ❌ | 非サポート。 |
| `{{ value \| filter }}`フィルター | ❌ | `upcase`、`downcase`、`truncate`などは非サポート。 |
| `{% unless %}` | ❌ | `{% if condition == false %}`で代替可能。 |
| `{% case %} / {% when %}` | ❌ | `{% if %} / {% elsif %}`の連鎖で代替可能。 |
| `contains`演算子 | ❌ | `{% if %}`条件内では非サポート。 |
| `forloop.index`、`limit`、`offset` | ❌ | ループのメタデータとパラメーターは非サポート。 |


### 変数構文リファレンス

| **Liquid構文**  | **属性タイプ**  |
|  --- | --- |
| `{{rt_profile.imported.attribute_name}}` | バッチ属性（In-Browser Messagingでは`rt_profile.imported.*`でアクセス） |
| `{{rt_profile.single.attribute_id}}` | RTシングル属性 |
| `{{rt_profile.list.attribute_id.sub_attribute}}` | RTリスト属性のサブフィールド |
| `{{rt_profile.counter.attribute_id.total}}` | RTカウンター属性の合計 |


## コード例

### ロイヤルティティアによるコンテンツの出し分け

```html
{% if rt_profile.imported.tier == "gold" %}
  <p>20% off for Gold members!</p>
{% elsif rt_profile.imported.tier == "silver" %}
  <p>10% off for Silver members!</p>
{% else %}
  <p>Sign up today for exclusive deals!</p>
{% endif %}
```

### カートアイテムのループ

```html
{% if rt_profile.list.cart_items.item_list != null %}
  <h2>Your Cart</h2>
  <ul>
    {% for item in rt_profile.list.cart_items.item_list %}
      <li>{{ item }}</li>
    {% endfor %}
  </ul>
{% endif %}
```

### ネストした条件とループ

```html
{% if rt_profile.single.most_recent_product %}
  <p>You recently viewed <strong>{{ rt_profile.single.most_recent_product }}</strong>.</p>
  {% if rt_profile.list.recommendations.product_ids != null %}
    <ul>
      {% for product in rt_profile.list.recommendations.product_ids %}
        {% if product != rt_profile.single.most_recent_product %}
          <li>{{ product }}</li>
        {% endif %}
      {% endfor %}
    </ul>
  {% endif %}
{% endif %}
```

## 制限事項

- **非サポートのLiquidフィルター**：文字列操作フィルター（`upcase`、`downcase`、`replace`、`truncate`、`split`、`join`、`date`など）は使用できません。変換が必要な場合はバッチ属性として事前に処理してください。
- **変数代入なし**：`{% assign %}`は非サポートです。算出された値を導くにはAudience Studioの属性システムを使用してください。
- **forループのネスト**：`{% for %}`ループは最大3レベルのネストをサポートします。
- **`{% unless %}`なし**：代わりに`{% if condition == false %}`を使用してください。