Skip to main content

Example : get price from json (Shopify)

JS Code:

<script>

/* get all products to loop on */
function getProductElements(element) {
return [...element.querySelectorAll(`.fs-results-product-card`)];
}

function setNewPrice(productElement, newPrice, newCompare, country) {
let priceElement = productElement.querySelector('.price, .fs-price');
let compareElement = null;
if(newCompare) {
compareElement = productElement.querySelector('.compare, .fs-price.compare');
}


if(newPrice && priceElement) {
if(compareElement) {
priceElement.textContent = "$" + newPrice;
} else {
priceElement.textContent = "$" + newPrice;
if (priceElement.querySelectorAll(`.tax-title`).length === 0) {
priceElement.insertAdjacentHTML('beforeend', '<span class="tax-title">+ gst</span>');
}
}
}

if(newCompare) {
if(compareElement) {
compareElement.textContent = "$" + newCompare;
if (compareElement.querySelectorAll(`.tax-title`).length === 0) {
compareElement.insertAdjacentHTML('beforeend', '<span class="tax-title">+ gst</span>');
}
}
}
}

async function setProductSpecialPrice(productElement, pId, productURL){
const country = Shopify?.country;

if(!productURL) {
return;
}

const splattedURL = productURL.split('?');
let fullURL = `${splattedURL[0]}.json${splattedURL?.[1] ? `?${splattedURL[1]}` : ''}`;
const res = await fetch(fullURL);
const data = await res.json();

const product = data.product;

const variantID = productURL.split('&').find(param => param.includes('variant'))?.split('=')?.[1];

const variant = product.variants.find((variant) => variant.id === Number(variantID)) || product.variants?.[0];

if (variant) {

const compare = variant?.compare_at_price ? variant?.compare_at_price : undefined;

const price = variant?.price ? variant?.price : 0;

setNewPrice(productElement, price, compare, country);

}
}



function hooks() {
console.log("country - " + Shopify?.country);
SerpOptions.registerHook('serp-product-grid', ({products, element}) => {
for (const productElement of getProductElements(element)) {
/* get product data */
const productID = productElement.dataset.productId;
const data = products[productID];

if ( typeof(data) !== "undefined" && data !== null ) {
let productURL = data.productURL || '';

setProductSpecialPrice(productElement, productID, productURL);
}
}
});
}

function AChooks() {
FastAutocomplete.registerHook('render-autocomplete-product-item', ({product, index, element}) => {
//Set up special prices
let productURL = product.u || '';
let productID = product.id;

setProductSpecialPrice(element, productID, productURL);
});
}


if (window.FastAutocomplete) {
AChooks();
} else {
window.addEventListener('fast-autocomplete-ready', function () {
AChooks();
});
}

// execution here
if (window.SerpOptions) {
hooks();
} else {
window.addEventListener('fast-serp-ready', function () {
hooks();
});
}

//end for Vnext

</script>