Получить все варианты продукта с одинаковым названием продукта на Shopify - PullRequest
0 голосов
/ 15 января 2020

Итак, это так. Даже я не понимаю, как это объяснить.

Ситуация:

Все товары в нашем магазине, независимо от того, имеют ли они один и тот же стилизованный товар, имеют только один вариант цвета каждый. Таким образом, все цвета одного и того же продукта разделены (пример: у Mulan 9 различных цветов, поэтому мы перечислили каждый цвет как один продукт). Если вы понимаете, о чем я. Например: http://prntscr.com/qnwygd

Что мне нужно:

Мы хотели показать все доступные варианты / цвета для всех продуктов с одинаковым названием / стилем. Как это: http://prntscr.com/qnwzf2

Вопрос: Как нам это сделать? Пожалуйста, дайте мне несколько идей. Если у вас есть какие-либо вопросы / путаница, пожалуйста, не стесняйтесь спрашивать.

Вот код, который у меня сейчас есть.

 {% capture form_id %}AddToCartForm-{{ section_id }}{% endcapture %}
{% form 'product', product, id: form_id, class: 'product-single__form' %}

   {% unless product.options.size == 1 and product.variants[0].title == 'Default Title' %}
    {% for option in product.options_with_values %}
      {% assign hide = false %}
      {% if option.name == 'color' and product.metafields.color.value %}
        {% assign hide = true %}
      {% endif %}
      {% if settings.variant_type == 'button' %}
        {% include 'variant-button', section_id: section_id, option_drop: option, hide: hide %}
      {% else %}
        {% include 'variant-dropdown', section_id: section_id, hide: hide %}
      {% endif %}
    {% endfor %}
  {% endunless %}

 <!--  {% comment %}
    [Custom Feature] Color swatches
  {% endcomment %}
  {% if product.metafields.color.value %}
    {% assign product_types = product.type | split: ',' %}
    {% assign product_type = product_types[3] | handle %}
    {% comment %} The most specific hierarchy = fourth field in product type {% endcomment %}
    {% if collections[product_type] %}
      <div class="color-swatches">
        <label class="variant__label">Colors</label>
        {% include 'swatch' with product_type %}
      </div>
    {% endif %}
  {% endif %}-->

  <select name="id" id="ProductSelect-{{ section_id }}" class="product-single__variants no-js">
    {% for variant in product.variants %}
      {% if variant.available %}
        <option {% if variant == product.selected_or_first_available_variant %}
          selected="selected" {% endif %}
          value="{{ variant.id }}">
          {{ variant.title }} - {{ variant.price | money_with_currency }}
        </option>
      {% else %}
        <option disabled="disabled">
          {{ variant.title }} - {{ 'products.product.sold_out' | t }}
        </option>
      {% endif %}
    {% endfor %}
  </select>

  {% if settings.quantity_enable %}
    <div class="product__quantity product__quantity--{{ settings.variant_type }} js-qty">
      <label for="Quantity-{{ section_id }}">{{ 'products.product.quantity' | t }}</label>
      <input type="number" hidden="hidden" id="Quantity-{{ section_id }}" name="quantity" value="1" min="1" class="js-qty__fallback">
    </div>
  {% endif %}

<!--   <div class="rte">
    <div class="product-outofstock-message">
      {{ 'products.product.outofstock_email_notify_html' | t }}
    </div>
  </div> -->

  {% if settings.enable_payment_button %}
    <div class="payment-buttons">
  {% endif %}

    <button
      {% if product.empty? %}type="button"{% else %}type="submit"{% endif %}
      name="add"
      id="AddToCart-{{ section_id }}"
      class="{% if settings.enable_payment_button %}btn--tertiary{% else %}btn{% endif %} btn--full add-to-cart"
      {% unless current_variant.available %} disabled="disabled"{% endunless %}>
      <span id="AddToCartText-{{ section_id }}">
        {% if current_variant.available %}
          {{ 'products.product.add_to_cart' | t }}
        {% else %}
          {{ 'products.product.sold_out' | t }}
        {% endif %}
      </span>
    </button>
<!--     ADDITIONAL ADD TO WISHLIST    -->

      <div style="display: flex; flex-wrap: wrap">
        <div id="smartwishlist" data-product="{{ product.id }}" data-variant="{{ product.variants.first.id }}" style="outline:none;margin-top:15px; border:1px solid black;font-weight:100;flex-basis:0;flex-grow:1;max-width:50%"></div>
        <a onclick="justClick()" class="btn--secondary update-cart share-this-item" style="margin-top:15px; border:none;font-weight:100;flex-basis:0;flex-grow:1;max-width:50%">
          <span>
            Or, share this item
          </span>
        </a>
      </div>
      <script type="text/javascript">
        function justClick(){
          document.getElementById("ztb-sb-9abf1166-widget").style.display="block !important"
        }
      </script>
<!--  END -->


    {% if settings.enable_payment_button %}
      {{ form | payment_button }}
    {% endif %}

  {% if settings.enable_payment_button %}
    </div>
  {% endif %}
{% endform %}

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Если каждый отдельный цвет одного и того же стиля был создан в администраторе Shopify как отдельный продукт, а не как варианты одного продукта, то кажется, что вы сможете достичь того, что ищете, с помощью простого л oop:

<!-- Replace ".all" below with the name of the associated collection -->
{% assign collection = collections.all %}
<!-- This creates a variable to restrict the loop to return products with the same name as the product on the page visited -->
{% assign productName = product.title %}

{% for product in collection.products %}
  {% if product.title == productName %}
    <!-- Your HTML elements go here, for example the featured image of each product -->
  {% endif %}
{% endfor %} 
0 голосов
/ 15 января 2020

Вы можете использовать запрос Storefront GraphQL для этого.

{
    products(first: 40, query: "title:Mulan"){
    edges {
      node {
        handle
        variants(first: 1) {
          edges {
            node {
              selectedOptions{
                name
                value
              }
            }
          }
        }
      }
    }
  }
}

Ответ будет примерно таким:

{
  "data": {
    "products": {
      "edges": [
        {
          "node": {
            "handle": "mulan",
            "variants": {
              "edges": [
                {
                  "node": {
                    "selectedOptions": [
                      {
                        "name": "Color",
                        "value": "White"
                      }
                    ]
                  }
                }
              ]
            }
          }
        },
        {
          "node": {
            "handle": "mulan-1",
            "variants": {
              "edges": [
                {
                  "node": {
                    "selectedOptions": [
                      {
                        "name": "Color",
                        "value": "Black"
                      }
                    ]
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

Я предоставлю описание шаг за шагом, если вы не знаю, как его использовать.


Создание частного приложения

Вам необходимо создать личное приложение, расположенное в вашем магазине: https://YOUR_STORE.myshopify.com / admin / apps / private

и введите имя частного приложения:

enter image description here

После этого необходимо установить флажок Allow this app to access your storefront data using the Storefront API, расположенный на внизу экрана приложения и установите флажок Read products, variants, and collections.

enter image description here

После сохранения приложения вы увидите следующее:

enter image description here

Где важной частью является Storefront access token. Этот токен понадобится вам для выполнения запросов GraphQL.

Создание базового c запроса GraphQL

Создание базового c запроса GraphQL для проверки, например, работает ли он :

fetch('/api/graphql',{
  method: 'POST',
  headers: {
      'X-Shopify-Storefront-Access-Token': 'ENTER YOUR STOREFRONT ACCESS TOKEN HEER',
      'Content-Type': 'application/graphql',
  },
  body: `query {
    shop {name}
  }`
}).then(res => res.json()).then(data => {
  console.log(data)
})

Должно возвращаться что-то вроде этого:

{
  "data": {
    "shop": {
      "name": "YOUR STORE NAME"
    }
  }
}

Создайте запрос GraphQL

Позволяет создать функцию, в которой вы можете передать название продукта и сгенерированный токен:

function getProducts(title, token) {
  return fetch('/api/graphql',{
    method: 'POST',
    headers: {
        'X-Shopify-Storefront-Access-Token': `${token}`,
        'Content-Type': 'application/graphql',
    },
    body: `query {
      products(first: 40, query: "title:${title}"){
      edges {
        node {
          handle
          variants(first: 1) {
            edges {
              node {
                selectedOptions{
                  name
                  value
                }
              }
            }
          }
        }
      }
    }
  }`
  }).then(res => res.json())
}

Затем мы вызываем функцию следующим образом:

getProducts('Mulan', 'Your Access Token').then(res => console.log(res))

И вы получите объект JS с массивом элементов с их дескриптор, имя и значение первого варианта опции.

Вот и все.

...