Reference field types

A reference type custom field is a specialized version of a 'Selection' type which will list all available objects of its type: 

Once a value is selected, the metafield will contain the referenced Shopify object's handle as its value (see special case for variant reference fields below).You can use this handle as a reference to a Shopify object via a Liquid global object depending on the type.

{{ blogs[product.metafields.accentuate.related_blog].title }}  
{{ articles[product.metafields.accentuate.related_article].title }}  
{{ pages[product.metafields.accentuate.related_page].title }}  
{{ collections[product.metafields.accentuate.related_collection].title }}  
{{ all_products[product.metafields.accentuate.related_product].title }}  
{{ linklists[product.metafields.accentuate.related_linklist].links }}

The above examples use Shopify Global Objects

Note: Shopify global objects only return values for published products, collections, pages etc. Be sure to check if the returned object is valid in case the reference suddenly points to a deleted or unpublished object.

Also, Shopify imposes a restriction on how many calls to "all_products" you can make from a single Liquid page. This is currently set to 20 unique handles per page

Using reference types, we can also get the metafields from the referenced objects using the handle. This is just as easy as getting the url or title as shown above.

{{ all_products[product.metafields.accentuate.related_product].metafields.accentuate.isbn }}

Multiple selections

As is the case for the basic type 'Selection', if you have opted for multiple selections for your reference type, each object's handle is listed with the "pipe" symbol ("|") as a separator token. You can use Liquid's 'split' filter on the metafield to separate the handles - like this:

{% assign selected_handles = product.metafields.accentuate.selection | split: '|' %}
{% for selected_handle in selected_handles %}
  <p><a href="{{ all_products[selected_handle].url }}">{{ all_products[selected_handle].title }}</a></p>
{% endfor %}

Variant reference fields

In Shopify, individual product variants don't have handles, so we need to rely on the product's handle combined with the id of the referenced variant. Therefore variant references are stored as product_handle:variant_id for easy access to both the product object and the underlying variant, like this:

{% assign product_handle = product.metafields.accentuate.referenced_variant | split: ':' | first %}
{% assign variant_id = product.metafields.accentuate.referenced_variant | split: ':' | last | plus: 0 %}

{% assign referenced_product = all_products[product_handle] %}
{% assign referenced_variant = referenced_product.variants | where: "id", variant_id | first %}

<p>The referenced variant is {{ referenced_product.title }} {{ referenced_variant.title }}</p>

Note the use of the Liquid filter "plus: 0" which converts a string to a number for use in the "where" filter.

Note: Variant references cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores. Shopify does not offer a way to uniquely identify a specific product variant across store boundaries

Media reference fields

Media references don't contain references to Shopify objects such as products and collections. Instead they contain internal references to ACF Media v2 type field values defined under either the "shop" or "globals" scope. 

Defining a media reference field allows you to reference a globally defined media from any scope like a specific product or collection. If, for example, you have a collection of vendor logos, icons or author avatars and would like to associate these with specific products or articles, you can define a Media v2 field under the "shop" or "globals" scope and use a media reference field to point to any of the uploaded medias, allowing for a single point of maintenance of the media itself. 

The media reference field itself will contain the referenced media's handle and you can do a lookup in Liquid like this:

{% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", product.metafields.accentuate.vendor_logo_ref | first %}
<img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>

Or, if you have multiple media references selected:

{% assign selected_handles = product.metafields.accentuate.vendor_logo_ref | split: '|' %}
{% for selected_handle in selected_handles %}
  {% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", selected_handle | first %}
  <img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>
{% endfor %}

Note the use of the Liquid filter "first" to pull the first element from the resulting array.

Important: When updating a media being referenced by one or more media reference fields, you must ensure that the references stay valid by doing a "replace" operation rather than deleting and reloading the media (which will break the reference). This is available as an option button when hovering over the media:

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.

Still need help? Contact Us Contact Us