Filter product by variant

Hi, I want to show the variant as a product on my collection page. I have added a snippet in my store and the code is

{{ 'component-rating.css' | asset_url | stylesheet_tag }}
{{ 'component-volume-pricing.css' | asset_url | stylesheet_tag }}

{% comment %}
  Code is tested by WebSensePro team with Dawn 12.0.0 Theme

  Code is subject to be updated with every theme updates, for more info contact via https://websensepro.com/contact-us
{% endcomment %}

{%- if card_variant and card_variant != empty -%}
  {%- liquid
    assign ratio = 1
    if card_variant.featured_media and media_aspect_ratio == 'portrait'
      assign ratio = 0.8
    elsif card_variant.featured_media and media_aspect_ratio == 'adapt'
      assign ratio = card_variant.featured_media.aspect_ratio
    endif
    if ratio == 0 or ratio == null
      assign ratio = 1
    endif
  -%}
  
    

      

        {%- if card_variant.featured_media -%}
          

            

              

              {%- if card_product.media[1] != null and show_secondary_image -%}
                
              {%- endif -%}
            

          

        {%- endif -%}
        
          

            ### 
              
                {{ card_variant.product.title | escape }} - {{ variant_option }}
              
            
          

          
            {%- if card_variant.available == false -%}
              
                {{- 'products.product.sold_out' | t -}}
              
            {%- elsif card_variant.compare_at_price > card_variant.price and card_variant.available -%}
              
                {{- 'products.product.on_sale' | t -}}
              
            {%- endif -%}
          

        

      

      
        

          ### 
            
              {{ card_variant.product.title | escape }} - {{ variant_option }}
            
          
          
            {%- if show_vendor -%}
              {{ 'accessibility.vendor' | t }}
              
{{ card_variant.vendor }}

            {%- endif -%}

            {{ block.settings.description | escape }}

            {%- if show_rating and card_variant.metafields.reviews.rating.value != blank -%}
              {% liquid
                assign rating_decimal = 0
                assign decimal = card_variant.metafields.reviews.rating.value.rating | modulo: 1
                if decimal >= 0.3 and decimal <= 0.7
                  assign rating_decimal = 0.5
                elsif decimal > 0.7
                  assign rating_decimal = 1
                endif
              %}
              {% comment %}
                Code is tested by WebSensePro team with Dawn 12.0.0 Theme

                Code is subject to be updated with every theme updates, for more info contact via https://websensepro.com/contact-us
              {% endcomment %}
              

                
              

              

                
                  {{- card_variant.metafields.reviews.rating.value }} /
                  {{ card_variant.metafields.reviews.rating.value.scale_max -}}
                
              

              

                ({{ card_variant.metafields.reviews.rating_count }})
                
                  {{- card_variant.metafields.reviews.rating_count }}
                  {{ 'accessibility.total_reviews' | t -}}
                
              

            {%- endif -%}

            {% render 'price', product: card_variant, price_class: '', show_compare_at_price: true %}
            {%- if card_variant.quantity_price_breaks_configured? -%}
              
                {{ 'products.product.volume_pricing.note' | t }}
              

            {%- endif -%}
          

        

        {%- if show_quick_add -%}
          
            {%- liquid
              assign product_form_id = 'quick-add-' | append: section_id | append: card_product.id
              assign qty_rules = false
              if card_product.selected_or_first_available_variant.quantity_rule.min > 1 or card_product.selected_or_first_available_variant.quantity_rule.max != null or card_product.selected_or_first_available_variant.quantity_rule.increment > 1
                assign qty_rules = true
              endif
            -%}
            {%- if card_product.variants.size > 1 or qty_rules -%}
              
              
            {%- else -%}
              
            {%- endif -%}
          

        {%- endif -%}
        
          {%- if card_product.available == false -%}
            
              {{- 'products.product.sold_out' | t -}}
            
          {%- elsif card_product.compare_at_price > card_product.price and card_product.available -%}
            
              {{- 'products.product.on_sale' | t -}}
            
          {%- endif -%}
        

      

    

  

{%- else -%}
  
    

      

        

          

            {%- if placeholder_image -%}
              {{ placeholder_image | placeholder_svg_tag: 'placeholder-svg' }}
            {%- else -%}
              {{ 'product-apparel-2' | placeholder_svg_tag: 'placeholder-svg' }}
            {% endif %}
          

        

      

      
        

          ### 
            
              {{ 'onboarding.product_title' | t }}
            
          
          
            {%- if show_vendor -%}
              {{ 'accessibility.vendor' | t }}
              
{{ 'products.product.vendor' | t }}

            {%- endif -%}
            {% render 'price', show_compare_at_price: true %}
          

        

      

    

  

{%- endif -%}

It is working fine.

I also made some changes in my “main-collection-product-grid.liquid”. I have replaced the following code:

<li
                  class="grid__item{% if settings.animations_reveal_on_scroll %} scroll-trigger animate--slide-in{% endif %}"
                  {% if settings.animations_reveal_on_scroll %}
                    data-cascade
                    style="--animation-order: {{ forloop.index }};"
                  {% endif %}
                >
                  {% render 'card-product',
                    card_product: product,
                    media_aspect_ratio: section.settings.image_ratio,
                    image_shape: section.settings.image_shape,
                    show_secondary_image: section.settings.show_secondary_image,
                    show_vendor: section.settings.show_vendor,
                    show_rating: section.settings.show_rating,
                    lazy_load: lazy_load,
                    show_quick_add: section.settings.enable_quick_add,
                    section_id: section.id
                  %}
                </li>

With this code:

{%- liquid
                    assign option_chosen = "Color" 
                    assign option_index = ''
                    for option in product.options
                        if option_chosen == option
                            assign option_index = forloop.index0 
                            break
                        endif
                    endfor
                -%}
                {% comment %}
                Code is tested by WebSensePro team with Dawn 12.0.0 Theme 
                
                Code is subject to be updated with every theme updates, for more info contact via https://websensepro.com/contact-us
                
                {% endcomment %}
                
                {%- if option_index == '' -%}
                  <li
                  class="grid__item{% if settings.animations_reveal_on_scroll %} scroll-trigger animate--slide-in{% endif %}"
                  {% if settings.animations_reveal_on_scroll %}
                      data-cascade
                      style="--animation-order: {{ forloop.index }};"
                  {% endif %}
                  >
                  {% render 'card-product',
                      card_product: product,
                      media_aspect_ratio: section.settings.image_ratio,
                      image_shape: section.settings.image_shape,
                      show_secondary_image: section.settings.show_secondary_image,
                      show_vendor: section.settings.show_vendor,
                      show_rating: section.settings.show_rating,
                      lazy_load: lazy_load,
                      show_quick_add: section.settings.enable_quick_add,
                      section_id: section.id
                  %}
                  </li>
                {%- else -%}
                  {% assign displayed_values = "" %}
                  {% for variant in product.variants %}
                  {%- liquid
                    assign variant_option = variant.options[option_index]
                    assign valueIsDisplayed = false
                    for value in displayed_values
                      if value == variant_option
                        assign valueIsDisplayed = true
                        break
                      endif
                    endfor
                  -%}
                  {% unless valueIsDisplayed %}
                      {%- assign variant_option_arr = variant_option | append: ';'  | split: ';' -%}
                      {% assign displayed_values = displayed_values | concat: variant_option_arr %}
                      <li
                      class="grid__item{% if settings.animations_reveal_on_scroll %} scroll-trigger animate--slide-in{% endif %}"
                      {% if settings.animations_reveal_on_scroll %}
                          data-cascade
                          style="--animation-order: {{ forloop.index }};"
                      {% endif %}
                      >
                      {% render 'card-variant',
                          card_variant: variant,
                          card_product: product,
                          variant_option: variant_option,
                          media_aspect_ratio: section.settings.image_ratio,
                          image_shape: section.settings.image_shape,
                          show_secondary_image: section.settings.show_secondary_image,
                          show_vendor: section.settings.show_vendor,
                          show_rating: section.settings.show_rating,
                          lazy_load: lazy_load,
                          show_quick_add: section.settings.enable_quick_add,
                          section_id: section.id
                      %}
                      </li>
                    {% endunless %}
                  {% endfor %}
                {%- endif -%}

It shows the variant as a product on my collection page perfectly. But when I select a variant color suppose “Black” it should show only the black variants. Instead of that it shows all the variants because the filtering is applied to the product. How can I filter by variant here? I am using Shopify’s built-in “Search and Discovery” app here.

1 Like

Hi @tahrim_miad

From my experience the “Search and Discovery” app will not meet your specific requirements. You might want to consider using another app like AI Search & Product Filter |SB, which has worked excellently for me. It’s easy to set up and will spare you the hassle, the filters and variants will be shown as products within just a few minutes