0

My question is, is it possible to do access the variables in Shopify Liquid using Javascript?

{% assign my_array= "apples, oranges, peaches, tomatoes" | split: ", " %}


function my_function(number){
    return "{{my_array[number]}}";
  }

  $('#click_me').click(function(){
    alert(my_function(0));
  });

I know this is possible with AJAX and PHP, but is there a similar way I can implement using Shopify Liquid and JQuery alone?

2 Answers 2

3

Liquid is a back-end tempalting language, this means that it's rendered before the Javascript. It means that once the liquid rendering is done you won't have access to the liquid logic and since the JS is rendered AFTER the liquid it means that you can't access it at all.

So you can't pass JS variables to liquid in real time.

But you can create a JS object with liquid:

{% assign my_array= "apples, oranges, peaches, tomatoes" | split: ", " %}

var my_array = {{ my_array | json }};
function my_function(number){
  return "my_array[number]";
}

$('#click_me').click(function(){
  alert(my_function(0));
});

You can use AJAX to get specific page, but from your example this will do you no good, since you are trying to access a liquid variable on a Javascript event, which is not possible.

Sign up to request clarification or add additional context in comments.

2 Comments

Is there a way like creating a seperate page that is purely written in liquid and accessing its variables by requesting GET or POST using AJAX? Just like AJAX PHP
@PhilGreene No. You can get the generated content from the liquid, but you can't get the generated variable. Liquid variables are used only inside liquid logic, you can't access them in Javascript.
1

You can set up an alternate layout, such as product.json.liquid which you can then access via an AJAX request, something like:

var request = jQuery.get("/products/" + productHandle + "?view=json", function(res) {
   productJSON = JSON.parse(res)
}

Your product.json.liquid file might look something like this (note the layout none tag - important to receive unaltered json):

{% layout none %}

{
  "productTitle": "{{ product.title}}",
  "customField": "{{ product.metafields.global.customField }}"
}

See more info here: https://www.shopify.com/partners/blog/84342470-the-power-of-alternate-layout-files-in-shopify-theme-development

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.