基本操作・設定

基本操作・設定

[上級者向け] テーマを追加課金可能なプランへ対応する

本ページの内容は上級者向けのコンテンツとなっております。
サポート窓口へご連絡いただくことで当社の方で代理で実装をさせていただくこともできますので、ご相談くださいませ。

テーマを追加課金可能なプランへ対応させるためにはいくつかの修正作業が必要となります。当アプリでは選択肢の項目などの有償化を行うために、別商品を自動で作成しその商品を同時にカートに入れる形で実現をしています。そのため、その商品を表示しない対応をして頂く必要がございます。

実装上の注意点

  • 本番用のテーマではなく、本番用のテーマをコピーしたものに反映するようにしてください。
  • 本修正によりサイトの購買機能に影響がある場合があります。必ずカスタムオプション対応の商品と通常商品それぞれについての購入テストを行うようにしてください。
  • お問い合わせいただく際には、編集元のテーマと、編集後のテーマについてご教授いただくと対応がスムーズとなっております。

1. カート一覧を修正する

Dawnの場合 sections/main-cart-items.liquid に該当し、通常 templates/cart.jsontemplates/cart.liquid などのテンプレートから定義されるテンプレートの修正となります。
※Ajaxカートの場合は、実装方式が異なる場合があります。その場合はliquid対応のjsテンプレを使うか、実装を調整する必要があるため、お問い合わせください。

(1)カートのアイテム一覧ループの後に価格計算・商品スキップロジックを入れる

{%- for item in cart.items -%} などのカート内部のアイテムをループするコードの直後に以下のコードを埋め込みます。商品のタグに__CUSTOMER_HIDDENが入っている場合、スキップし、そうでない場合はその商品と関連する商品の価格を計算し直します。

              {% comment %} fix start {% endcomment %}
              {% liquid 
                if item.product.tags contains '__CUSTOMORDER_HIDDEN'
                  continue
                endif

                assign original_price = item.original_price
                assign final_price = item.final_price
                assign original_line_price = item.original_line_price
                assign final_line_price = item.final_line_price
                for item2 in cart.items
                  unless item2.product.tags contains '__CUSTOMORDER_HIDDEN'
                    continue
                  endunless
                  for propertyName in item.properties
                    if propertyName[0] == item2.product.title and propertyName[1] == item2.variant.title
                      assign original_price = item.original_price | plus: item2.original_price
                      assign final_price = item.final_price | plus: item2.final_price
                      assign original_line_price = item.original_line_price | plus: item2.original_line_price
                      assign final_line_price = item.final_line_price | plus: item2.final_line_price
                    endif
                  endfor
                endfor
                %}
              {% comment %} fix end {% endcomment %}

(2)カート一覧の価格表現をすべて変更する

(1)と同じファイルにて、以下のようにカートのそれぞれの価格表現を変更します。

before

{{- item.original_price | money -}}

after

{{- original_price | money -}}

before

{{- item.final_price | money -}}

after

{{- final_price | money -}}

before

{{ item.original_line_price | money }

after

{{ original_line_price | money }}

before

{{ item.final_line_price | money }}

after

{{{ final_line_price | money }}

同様に、 item.original_price => original_price / item.final_price => final_price / item.original_line_price => original_line_price / item.final_line_price => final_line_price のように差し替えをする必要があります。

2. カートの更新・削除の際にカート情報の差し替えを行う

カートの数量変更時にJavaScriptで実行されるコードに対して修正を加えます。このコードは assets内にあるJavaScriptに記載がある場合が非常に多く、Dawnの場合は assets/cart.js に記載されています。 routes.cart_change_url や /cart/ などの検索文言でファイルを探すことが可能です。

以下のbefore-afterはあくまで、サンプルですが、「// 再描画処理など、カート数量増減の処理後に実行するコード」のところにはroutes.cart_change_urlなどのAPIをコールした後のコードが入ります。大事なことは、window.customorderCartDoctor をコールして、その後再描画をすることで、不明であれば location.reload() などを CartDoctorの後に実行するという手もあります。

before

// 再描画処理など、カート数量増減の処理後に実行するコート

after

    if (window.customorderCartDoctor) {
       window.customorderCartDoctor(function() {
         // 再描画処理など、カート数量増減の処理後に実行するコート
       });
    } else {
         // 再描画処理など、カート数量増減の処理後に実行するコート
    }

3. 商品をカートに入れる処理の際にカート情報の差し替えを行う

商品をカートに入れる際にも、同様にカート情報の差し替えが必要です。これもJavaScriptで行われるケースが多く、Dawnの場合は assets/product-form.js に記載があります。 routes.cart_add_url などの文言で検索することで該当箇所を見つけることができます。
※ここでも、customorderCartDoctorを使うことも可能です。その場合カートに入れるー>cartDoctorを実行するという2段階になるため、「カートに入れました!」のようなPOPUPが変に動作する可能性があります。

before

fetch(`${routes.cart_add_url}`, config)

after

      // start custom order fix
      if (window.customorderCartRepair) {
        config.headers['Content-Type'] = 'application/json'
        const newFormData = window.customorderCartRepair(formData);
        config.body = JSON.stringify(newFormData);
      }
      // end custom order fix
      fetch(`${routes.cart_add_url}`, config)

before

this.cartNotification.renderContents(response);

after

          // start custom order fix
          this.cartNotification.renderContents(Object.assign(Object.assign({}, response), response.items[0]));
          // end custom order fix

※この修正はcartに入れたという追加の通知を行う場合に関連するコードを修正するものです。テーマによって異なりますが、response.items[0]のみを対象とするコードを入れることで複数アイテムの追加されました表現をスキップすることができます。

4. カートの数量を表示するコードの差し替えを行う

カートの中にあるアイテムの数量についても、価格変更用の商品の数がたされないよう修正をする必要があります。Dawnの場合は sections/cart-icon-bubble.liquid などに配置がありますが、実際のカートの数量を表示するクラス名や cart.item_count などの表現をを検索して探すのが良いでしょう。以下は、Dawnによる修正例です。

before

       {%- if cart.item_count < 100 -%}
         <span aria-hidden="true">{{ cart.item_count }}</span>
       {%- endif -%}

after

      {% comment %} fix start {% endcomment %}
      {% assign cart_item_count = 0 %}
      {% for item in cart.items %}
      {% if item.product.tags contains '__CUSTOMORDER_HIDDEN' %}{% continue %}{% endif %}
      {% assign cart_item_count = cart_item_count | plus: item.quantity %}
      {% endfor %}
      {%- if cart_item_count < 100 -%}
        <span aria-hidden="true">{{ cart_item_count }}</span>
      {%- endif -%}
      {% comment %} fix end {% endcomment %}

5. カートに追加されたという通知POPUPの差し替えを行う(ある場合)

3の時点でもカートに追加したというアラートの修正は実装されていますが、その際のカート内の商品点数を修正するためには以下のようなコードを修正します。不要な場合もございます。

before

 {{ 'general.cart.view' | t: count: cart.item_count }}

after

{% comment %} fix start {% endcomment %}
{% assign cart_item_count = 0 %}
{% for item in cart.items %}
{% if item.product.tags contains '__CUSTOMORDER_HIDDEN' %}{% continue %}{% endif %}
{% assign cart_item_count = cart_item_count | plus: item.quantity %}
{% endfor %}
{{ 'general.cart.view' | t: count: cart_item_count }}
{% comment %} fix end {% endcomment %}

6. テーマの内容の検証を行う

ここまで行ったテーマにて、実際に通常商品+カスタム商品でテストを必ず行った後、テーマの公開を行ってください。不明点がございましたらお問い合わせくださいませ。