Large sets
Repeatable fields in ACF are stored as data arrays in metafields of type "json_string" which in Shopify has a storage limit of 100,000 characters. This limit may prove a challenge when working with large sets of repeatable fields, especially of types Media v2 or HTML in excess of 100-150 occurrences (sometimes fewer when working with large blocks of HTML). ACF is able to work around this limitation by distributing your content across multiple individual metafields. This is something you need to enable on a per-field basis (due to the theme handling being different - see below) but is otherwise handled internally to give you a seamless experience when working in the ACF editor or with exports/imports.
The "automatically handle large sets of repeatable values" setting is available for all field types that can be defined as repeatable (which is every field type with the exception of the "Shopify" types) and for all scopes except for product types, vendors and locations. With "large sets" enabled the storage limit is now 1,000,000 characters, which allows you to work with sets in excess of 1,000 elements.
Note that each individual occurrence (e.g a block of HTML) still needs to fit inside a 100,000 characters metafield and - in case of 10+ occurrences - this space is shared with other occurrences
A rough calculation of the size limit per occurrence (for reasonably like-sized blocks) is 100,000 / ceil(#occurrences / 10)

Required theme changes

So why is this just not enabled by default? The reasoning here is that enabling the setting requires a subtle change to your theme since the original metafield no longer contains the actual data items but rather is a "reference object" with references to the actual data metafields.

Example code - looping HTML blocks

This code example shows you how to loop a repeatable HTML field with "large sets" enabled:
1
{% for html in shop.metafields.globals.very_large_description %}
2
{{ shop.metafields.globals[html.metafield][html.index] }}
3
{% endfor %}
Copied!
Please note that the code doesn't just render the "html" loop variable as we would for a traditional repeatable field but uses it as a reference to get to the actual metafield used to store the data for that specific entry. shop.metafields.globals should be replaced with whatever scope and namespace your field is defined under, for example product.metafields.accentuate.

Example code - looping Media v2 fields

This code example shows you how to loop a repeatable Media v2 field with "large sets" enabled:
1
{% for media in shop.metafields.globals.very_large_media_set %}
2
{% assign single_media = shop.metafields.globals[media.metafield][media.index] | first %}
3
<img src="{{ single_media.src }}" alt="{{ single_media.alt }}"/>
4
{% endfor %}
Copied!
Last modified 11d ago
Copy link