Skip to content

filter

A filter describes one trusted storefront facet returned by collection.filters or search.filters. It supplies the buyer-facing label, canonical query parameter, values, counts, and add/remove URLs. Themes should render these fields instead of constructing metafield or variant parameters from untrusted input.

Examples

Render a list or boolean filter

{% for filter in collection.filters %}
{% if filter.type == 'list' or filter.type == 'boolean' %}
<fieldset>
<legend>{{ filter.label | escape }}</legend>
{% for value in filter.values %}
<label>
<input
type="checkbox"
name="{{ value.param_name }}"
value="{{ value.value | escape }}"
{% if value.active %}checked{% endif %}
{% if value.count == 0 and value.active == false %}disabled{% endif %}
>
{{ value.label | escape }} ({{ value.count }})
</label>
{% endfor %}
</fieldset>
{% endif %}
{% endfor %}

filter.operator is AND or OR for compatible list and boolean facets. Different filter sources always combine with AND.

Render a price or numeric range

Range filters expose min_value and max_value rather than entries in values. Price values are decimal major-currency amounts.

{% for filter in collection.filters %}
{% if filter.type == 'price_range' or filter.type == 'range' %}
{% if filter.min_value %}
<label>
Minimum
<input
type="number"
name="{{ filter.min_value.param_name }}"
value="{{ filter.min_value.value | escape }}"
min="0"
>
</label>
{% endif %}
{% if filter.max_value %}
<label>
Maximum
<input
type="number"
name="{{ filter.max_value.param_name }}"
value="{{ filter.max_value.value | escape }}"
min="0"
{% if filter.range_max != blank %}max="{{ filter.range_max }}"{% endif %}
>
</label>
{% endif %}
{% endif %}
{% endfor %}

For a price facet, the parameter names are filter.v.price.gte and filter.v.price.lte. A value of 50 means 50 units of the active storefront currency, including currencies whose minor-unit exponent is not two.

Clear the complete facet

{% if filter.active_values != empty and filter.url_to_remove %}
<a href="{{ filter.url_to_remove }}">Clear {{ filter.label | escape }}</a>
{% endif %}

Generated filter URLs retain the active locale and safe query state and reset the affected paginator. See Storefront filtering for the complete URL grammar, limits, tags, and relevant-variant behavior.

Properties

PropertyDescription
filter.active_valuesCurrently selected list/boolean values or active range-bound entries.
filter.collapsed_by_defaultSeller-configured initial collapsed state for the filter UI.
filter.display_typeSellerlane UI hint such as checkbox, dropdown, radio, box, or range.
filter.false_valueFalse option for a boolean filter, otherwise nil.
filter.inactive_valuesCurrently unselected values for a boolean or list filter.
filter.labelDisplay label.
filter.max_valueCurrent maximum-bound value for a range filter, otherwise nil.
filter.min_valueCurrent minimum-bound value for a range filter, otherwise nil.
filter.operatorAND or OR for compatible list/boolean filters; nil for ranges.
filter.param_nameCanonical public URL parameter, for example filter.v.option.Color.
filter.presentationtext, swatch, or image for list values; nil for other filter types.
filter.range_maxLargest available range value in storefront major currency units for price filters.
filter.show_all_valuesSeller-configured hint for expanding the complete value list.
filter.sort_modeSeller-configured value ordering mode, or nil.
filter.sort_orderSeller-configured filter position, or nil.
filter.tooltipOptional seller-authored help text.
filter.true_valueTrue option for a boolean filter, otherwise nil.
filter.typeFilter shape: list, boolean, price_range, or range.
filter.url_to_removeLocalized current-view URL with this entire filter removed.
filter.valuesAll selectable values for a list/boolean filter; empty for a range filter.

Property list is generated from the storefront engine (FilterDrop), so it always matches what your theme can use. Use {{ filter | json }} only as a curated debug snapshot; it can omit lazy or otherwise public properties.