# Reference fields

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

![](/files/OAbFwOGuqPBQvCYP4axO)

{% hint style="info" %}
The values shown specifically for **product** and **variant** selections can be customized to show additional information, making it easier to search and filter for the correct items.&#x20;

You can find the available options in your settings in the admin side menu
{% endhint %}

Once a value is selected, the Metafield will contain the referenced Shopify object's **handle** as its value (see special cases for file, resource, and 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.

```liquid
{{ 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](https://help.shopify.com/en/themes/liquid/objects#global-objects)

{% hint style="info" %}
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 archived object.
{% endhint %}

{% hint style="info" %}
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**
{% endhint %}

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.

```liquid
{{ 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:

```liquid
{% 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:

```liquid
{% 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.

{% hint style="warning" %}
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
{% endhint %}

### File reference fields

Using a File reference field, you can reference a file or an image uploaded to Shopify (under Settings > Files)\
\
A file reference is stored as the *filename*, so you can get a fully qualified URL pointing to the file within Shopify's CDN using the [Liquid filters *file\_url* or *file\_img\_url*:](https://shopify.dev/api/liquid/filters/url-filters#file_url)

```liquid
{% assign url = product.metafields.accentuate.referenced_file | file_url %}
<a href="{{ url }}">Click to download</a>
```

Also, the filename (of an image) can be used as a lookup value to the *images* global object in Liquid to get an [image object](https://shopify.dev/api/liquid/objects/image) of the file:

```liquid
{{ assign image = images[product.metafields.accentuate.referenced_file] }}
```

### Resource reference fields

Using a Resource reference field, you can reference any of the following Shopify objects: collections, products, pages, blogs, or articles.\
\
A resource reference is stored as a **partial URL** to the selected resource - like **/products/example** or **/pages/contact**, so you may redirect your visitor to the relevant page using links, buttons, etc.:

```liquid
{% assign url = product.metafields.accentuate.referenced_resource %}
<a href="{{ url }}">Please see here</a>
```

### 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 media, 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:

```liquid
{% 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:

```liquid
{% 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 %}
```

{% hint style="info" %}
Note the use of the Liquid filter "first" to pull the first element from the resulting array.
{% endhint %}

{% hint style="info" %}
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:
{% endhint %}

\
\&#xNAN;*When updating a media 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:*

![](/files/jRHaOi8TN04ubelcypKg)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.accentuate.io/metafield-definitions/fields/field-data-type/acf-field-types/reference-fields.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
