Shopifyで gift_card.liquidにバリエーション関連の値を渡す

フォーラムでのやりとりで試作したのでメモとして。

実現したいこと

gift_cardオブジェクトでは購入した商品の値は取れても、選ばれたバリエーションの情報が取れないようで今回はそこが問題でした。{{ gift_card.product.variant }}で取れる値は商品に紐ずくバリエーション全てで、どれが選ばれているのかの情報がほぼありませんでした(価格自体はバリエーションの値を反映しているので、価格からの推測は可能ですが)。

ギフトカードの補足

あくまで一時的な措置として、本来は使えないプランでもギフトカードの機能が開放されています。

今回の対象となるgift_card.liquidを用いて表示されるページにたどり着くには以下のような手順が必要でした。

  1. 管理画面でギフトカードを作る
  2. ギフトカード商品を追加する
  3. ストアでギフトカードの商品を普通に購入する
  4. メールでギフトカードのディスカウントコードを確認するためのボタンが記載されたメールが届く
  5. ボタンを押すとギフトカードのディスカウントコードやQRコードが表示されたページが開く
  6. このページがgift_card.liquidを用いて表示されている

上記4のメールであれば、管理画面内の「設定 > 通知 > ギフトカードを作成する > プレビュー」で確認可能ですが、その先のページは確認できませんでした。
実際に購入して試すしかないのか、他の方法があるのか…。

サンプルコード

  • Debutテーマ使用
  • 商品ページ用のproduct_template.liquidproperties[]をつけたinputタグを用意し、ページ表示時のオプションの値を設定する
  • オプションを選択した場合に、properties[]をつけたinputタグのvalueを選択したオプションの値に書き換える
  • gift_card.liquidで、このproperties[]の値を出力する

上記が概要と前提で、以下がサンプルコードです。最初のオプションの値を習得して用いていますが、IDを変更すれば別のオプションの値も取れます。


{% form 'product' %}
 {{ comment }}いろいろ省略{{ endcomment }}
 <input id="SelectOptionValue" type="hidden" name="properties[_selectOptionValue]" value=" 
 {{product.selected_or_first_available_variant.option1}}" />
 <script>
  window.addEventListener('DOMContentLoaded', () => {
    const selecter = document.getElementById('SingleOptionSelector-0');
    if(selecter){
      const selectOptionValue = document.getElementById('SelectOptionValue');
      selectOptionValue.value = selecter.value;
      selecter.addEventListener('change',function(){
        selectOptionValue.value = event.target.value;
      },false);
    }
  })
 </script>
 {{ comment }}いろいろ省略{{ endcomment }}
{% endform %}

{{ comment }}gift_card.liquidに以下を記載すれば値が取れる{{ endcomment }}
{{ gift_card.properties['_selectOptionValue']}}

関連する参考ヘルプなどは以下の通り。

結び

結構無理やりですが、properties[]を介すれば応用は効きそうです。

このコードが不要な商品に出力しないようにする必要がありますが、ギフトカード用の商品の判別方法はまだ把握できていません。簡単に取れそうですが、取れない場合はタグかコレクションでどうにかするしかないかもしれません。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄