Shopifyの商品ページに入力形式のオプションを追加する|コーディング、Web開発の外注、代行ならコーディングアライブ

Chat Work

mail

blog

ブログ
  • HOME
  • ブログ
  • Shopifyの商品ページに入力形式のオプションを追加する
2022-12-13 ECサイト構築

Shopifyの商品ページに入力形式のオプションを追加する

Writer

長屋 めぐみ

Web Developer

Shopifyの商品には、カラーやサイズなど、選択式のオプションを3つまで持たせることができます。
しかし、商品の名入れやメッセージカードの文章のようなユーザーに文字入力させるタイプのオプションを実装したいケースもよくあると思います。
当記事ではそれを実現する「Line Item Property」という機能をご紹介します。

 

◼️合わせて読みたいShopify関連記事

Line Item Propertyとは

「Line Item Property」は、商品に追加オプションを持たせるための特殊なフィールドです。
ルールは至って簡単で、好きなフォーム要素に properties[任意の名前] というname属性を設定するだけ。

<label for="message">メッセージ</label>
<textarea id="message" name="properties[メッセージ]"></textarea>

このコードを商品ページのテンプレートに記述することで入力欄が表示され、注文データにも反映されます。

具体的に実装の流れを見ていきましょう。

 

テーマ「Debut」に実装してみる

フォーム要素のコード(HTML)を作成する

先ほどの例のように自分でフォーム要素をコーディングしてもOKですが、ジェネレーターを使ってコードを生成することもできます。

ジェネレーターを使った場合の設定例は下図のとおりです。
「Grab your code」に出来上がるソースコードをコピーしておいてください。

コードを商品ページの<form>内に貼り付ける

コピーしたコードを商品ページに表示させます。

テーマの「コードを編集」を開き、商品ページのテンプレート内から {% form %} … {% endform %} の記述を探しましょう。
「Debut」の場合は、product-template.liquid にあります。
下図は「カートに追加」ボタンの上に表示させた例です。

保存して商品ページを確認すると、作成したフォーム要素が表示されています。

動作確認

たったこれだけで基本の実装は完了です!
追加したフォーム要素に何か入力して、商品をカートに追加したり注文完了まで進めたりしてみると、きちんと各所に入力内容が反映されていることがわかります。

 

応用編1:商品ごとに入力欄の表示・非表示を制御する

先ほどのテンプレート編集例だと、全ての商品に入力欄が表示されます。
もし商品によって入力欄を出す・出さないを設定したい場合は、Shopifyに標準で備わっている「メタフィールド」を活用すると良いでしょう。

管理画面「設定>メタフィールド」で、「商品」を開きます。
「定義を追加する」をクリックし、コンテンツタイプ「trueまたはfalse」の定義を追加してください。

保存すると、商品編集画面に次のようなフィールドが現れます。

先ほど product-template.liquid に追加したコードを「メタフィールドがtrueだったら入力欄を表示」という処理に書き換えたら完成です。

{% if product.metafields.custom.message == true %}
<label for="message">メッセージ</label>
<textarea id="message" name="properties[メッセージ]"></textarea>
{% endif %}

 

応用編2:簡易的なXSS対策を実装する

テーマによっては、Line Item PropertyのXSS対策が実装されていないかもしれません。
そのままにしておくと、悪意のあるユーザーがプログラム言語を入力・送信したときに思わぬ不具合が起こる危険性があります。

簡易的な対策として、次のようなものが考えられます。

  • ユーザーからの入力を、ダミーの入力欄で受け付ける(例:name=”message_pre”)
  • JSでダミーの入力内容を受け取り、不具合の原因になる文字を安全な形に変換して本物の入力欄(例:name=”properties[メッセージ]”)に戻す。本物の入力欄は type=”hidden” など表に見えないように作る。

修正前:

<label for="message">メッセージ</label>
<textarea id="message" name="properties[メッセージ]"></textarea>

修正後:

<label for="message_pre">メッセージ</label>
<textarea id="message_pre" name="message_pre"></textarea>
<input id="message" type="hidden" name="properties[メッセージ]">
$('#message_pre').on('change', function() {
  $('#message').val(escapeHTML($(this).val()));
});
function escapeHTML(string){
  return string.replace(/&/g, '&lt;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, "&#x27;");
}

 

応用編3:メールにも入力内容を表示させる

カート画面やShopifyの注文管理画面には自動的にLine Item Propertyの内容が反映されますが、管理者やユーザーに送られる注文受付メールには表示されていません。
管理画面「設定>通知」から対象のメールテンプレートを開き、下記のように追記しましょう。

{% for p in line.properties %}{% unless p.last == blank %}
{{ p.first }} : {{ p.last }}<br>
{% endunless %}{% endfor %}

その他、ご希望に合わせてShopifyのカスタマイズのご相談を承っています。
お気軽にご相談ください!