Discuss and resolve questions on Liquid, JavaScript, themes, sales channels, and site speed enhancements.
Hi Guys,
I am working on here.
Click for Wishlist Page
Wishlist is not working.
It was working a couple of days ago.
I have checked the codes but I don't understand the problem.
Can you help me please?
Here is page.wishlist.liquid:
{% section 'page_header' %}
<div class="container wishlist-container">
<!-- Product Tile Grid -->
<div class="wishlist-grid">
{% for product in collections.all.products %}
{% include 'product-tile' %}
{% endfor %}
<div class="wishlist-grid--empty-list">
<div class="empty-list--info">
<h6 class="empty-list--text black"{% if settings.language_enable %} data-translate="wishlist.general.empty"{% endif %}>{{ 'wishlist.general.empty' | t }}</h6>
<a class="btn empty-list--btn" href="/collections/all"{% if settings.language_enable %} data-translate="wishlist.general.start_shopping"{% endif %}>{{ 'wishlist.general.start_shopping' | t }}</a>
</div>
</div>
</div>
<!-- Loader -->
<div class="wishlist-loader">
<p class="wishlist-loader--text"{% if settings.language_enable %} data-translate="wishlist.general.loading"{% endif %}>{{ 'wishlist.general.loading' | t }}</p>
</div>
</div>
And here is Wishlist.js:
;(function (Wishlist, $) {
var $wishlistButton = $('.wishlist-btn');
var $wishlistTile = $('.wishlist-tile-container');
var numProductTiles = $wishlistTile.length;
var wishlist = localStorage.getItem('user_wishlist') || [];
if (wishlist.length > 0) {
wishlist = JSON.parse(localStorage.getItem('user_wishlist'));
}
/*
* Update button to show current state (gold for active)
*/
var animateWishlist = function (self) {
$(self).toggleClass('is-active');
};
/*
* Add/Remove selected item to the user's wishlist array in localStorage
* Wishlist button class 'is-active' determines whether or not to add or remove
* If 'is-active', remove the item, otherwise add it
*/
var updateWishlist = function (self) {
var productHandle = $(self).attr('data-product-handle');
var isRemove = $(self).hasClass('is-active');
/* Remove */
if (isRemove) {
var removeIndex = wishlist.indexOf(productHandle);
wishlist.splice(removeIndex, 1);
localStorage.setItem('user_wishlist', JSON.stringify(wishlist));
}
/* Add */
else {
wishlist.push(productHandle);
localStorage.setItem('user_wishlist', JSON.stringify(wishlist));
}
console.log(JSON.stringify(wishlist));
};
/*
* Loop through wishlist buttons and activate any items that are already in user's wishlist
* Activate by adding class 'is-active'
* Run on initialization
*/
var activateItemsInWishlist = function () {
$wishlistButton.each(function () {
var productHandle = $(this).attr('data-product-handle');
if (wishlist.indexOf(productHandle) > -1) {
$(this).addClass('is-active');
}
});
};
/*
* Loop through product titles and remove any that aren't a part of the wishlist
* Decrement numProductTiles on removal
*/
var displayOnlyWishlistItems = function () {
$wishlistTile.each(function () {
var productHandle = $(this).attr('data-product-handle');
if (wishlist.indexOf(productHandle) === -1) {
$(this).remove();
numProductTiles--;
}
});
};
/*
* Check if on the wishlist page and hide any items that aren't a part of the wishlist
* If no wishlist items exist, show the empty wishlist notice
*/
var loadWishlist = function () {
if (window.location.href.indexOf('pages/wishlist') > -1) {
displayOnlyWishlistItems();
$('.wishlist-loader').fadeOut(1000, function () {
$('.wishlist-grid').addClass('is_visible');
$('.wishlist-hero').addClass('is_visible');
if (numProductTiles == 0) {
$('.wishlist-grid--empty-list').addClass('is_visible');
} else {
$('.wishlist-grid--empty-list').hide();
}
});
}
};
var resultload = function () {
$("#resultLoading").show();
setTimeout(function () {
$("#resultLoading").hide();
},1000)
};
var bindUIActions = function () {
$wishlistButton.click(function (e) {
e.preventDefault();
updateWishlist(this);
animateWishlist(this);
resultload();
});
};
Wishlist.init = function () {
bindUIActions();
activateItemsInWishlist();
loadWishlist();
};
}(window.Wishlist = window.Wishlist || {}, jQuery, undefined));
Thanks.
Solved! Go to the solution
This is an accepted solution.
when visit your wishlist page, got js code error as below:
please try to fix the above issue
and have a try again
if you need help, please let me know
This is an accepted solution.
when visit your wishlist page, got js code error as below:
please try to fix the above issue
and have a try again
if you need help, please let me know
Thanks for your respond.
I checked the console. You are right.
I have edited product.tile.liquid and add {{product.id}} variable as suffix to element ID's.
<form class="product-form" id="product-form-{{ product.id }}-form" action="/cart/add" method="post" enctype="multipart/form-data" data-product-id="{{product.id}}" data-id="{{ product.handle }}">
and
<select id="product-select-{{ product.id }}" name="id" >
Now, I don't get an error on console. But still wishlist page is not working.
Do I need to modify option_selection.js too? And how?
Thanks.
option_selection.js:
function floatToString(a, b) {
var c = a.toFixed(b).toString();
return c.match(/^\.\d+/) ? "0" + c : c;
}
if ("undefined" == typeof Shopify) var Shopify = {};
(Shopify.each = function (a, b) {
for (var c = 0; c < a.length; c++) b(a[c], c);
}),
(Shopify.map = function (a, b) {
for (var c = [], d = 0; d < a.length; d++) c.push(b(a[d], d));
return c;
}),
(Shopify.arrayIncludes = function (a, b) {
for (var c = 0; c < a.length; c++) if (a[c] == b) return !0;
return !1;
}),
(Shopify.uniq = function (a) {
for (var b = [], c = 0; c < a.length; c++) Shopify.arrayIncludes(b, a[c]) || b.push(a[c]);
return b;
}),
(Shopify.isDefined = function (a) {
return "undefined" != typeof a;
}),
(Shopify.getClass = function (a) {
return Object.prototype.toString.call(a).slice(8, -1);
}),
(Shopify.extend = function (a, b) {
function c() {}
(c.prototype = b.prototype), (a.prototype = new c()), (a.prototype.constructor = a), (a.baseConstructor = b), (a.superClass = b.prototype);
}),
(Shopify.urlParam = function (a) {
var b = RegExp("[?&]" + a + "=([^&]*)").exec(window.location.search);
return b && decodeURIComponent(b[1].replace(/\+/g, " "));
}),
(Shopify.Product = function (a) {
Shopify.isDefined(a) && this.update(a);
}),
(Shopify.Product.prototype.update = function (a) {
for (property in a) this[property] = a[property];
}),
(Shopify.Product.prototype.optionNames = function () {
return "Array" == Shopify.getClass(this.options) ? this.options : [];
}),
(Shopify.Product.prototype.optionValues = function (a) {
if (!Shopify.isDefined(this.variants)) return null;
var b = Shopify.map(this.variants, function (b) {
var c = "option" + (a + 1);
return void 0 == b[c] ? null : b[c];
});
return null == b[0] ? null : Shopify.uniq(b);
}),
(Shopify.Product.prototype.getVariant = function (a) {
var b = null;
return a.length != this.options.length
? b
: (Shopify.each(this.variants, function (c) {
for (var d = !0, e = 0; e < a.length; e++) {
var f = "option" + (e + 1);
c[f] != a[e] && (d = !1);
}
return 1 == d ? void (b = c) : void 0;
}),
b);
}),
(Shopify.Product.prototype.getVariantById = function (a) {
for (var b = 0; b < this.variants.length; b++) {
var c = this.variants[b];
if (a == c.id) return c;
}
return null;
}),
(Shopify.money_format = "${{amount}}"),
(Shopify.formatMoney = function (a, b) {
function c(a, b) {
return "undefined" == typeof a ? b : a;
}
function d(a, b, d, e) {
if (((b = c(b, 2)), (d = c(d, ",")), (e = c(e, ".")), isNaN(a) || null == a)) return 0;
a = (a / 100).toFixed(b);
var f = a.split("."),
g = f[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + d),
h = f[1] ? e + f[1] : "";
return g + h;
}
"string" == typeof a && (a = a.replace(".", ""));
var e = "",
f = /\{\{\s*(\w+)\s*\}\}/,
g = b || this.money_format;
switch (g.match(f)[1]) {
case "amount":
e = d(a, 2);
break;
case "amount_no_decimals":
e = d(a, 0);
break;
case "amount_with_comma_separator":
e = d(a, 2, ".", ",");
break;
case "amount_no_decimals_with_comma_separator":
e = d(a, 0, ".", ",");
}
return g.replace(f, e);
}),
(Shopify.OptionSelectors = function (a, b) {
return (
(this.selectorDivClass = "selector-wrapper"),
(this.selectorClass = "single-option-selector"),
(this.variantIdFieldIdSuffix = "-variant-id"),
(this.variantIdField = null),
(this.historyState = null),
(this.selectors = []),
(this.domIdPrefix = a),
(this.product = new Shopify.Product(b.product)),
(this.onVariantSelected = Shopify.isDefined(b.onVariantSelected) ? b.onVariantSelected : function () {}),
this.replaceSelector(a),
this.initDropdown(),
b.enableHistoryState && (this.historyState = new Shopify.OptionSelectors.HistoryState(this)),
!0
);
}),
(Shopify.OptionSelectors.prototype.initDropdown = function () {
var a = { initialLoad: !0 },
b = this.selectVariantFromDropdown(a);
if (!b) {
var c = this;
setTimeout(function () {
c.selectVariantFromParams(a) || c.fireOnChangeForFirstDropdown.call(c, a);
});
}
}),
(Shopify.OptionSelectors.prototype.fireOnChangeForFirstDropdown = function (a) {
this.selectors[0].element.onchange(a);
}),
(Shopify.OptionSelectors.prototype.selectVariantFromParamsOrDropdown = function (a) {
var b = this.selectVariantFromParams(a);
b || this.selectVariantFromDropdown(a);
}),
(Shopify.OptionSelectors.prototype.replaceSelector = function (a) {
var b = document.getElementById(a),
c = b.parentNode;
Shopify.each(this.buildSelectors(), function (a) {
c.insertBefore(a, b);
}),
(b.style.display = "none"),
(this.variantIdField = b);
}),
(Shopify.OptionSelectors.prototype.selectVariantFromDropdown = function (a) {
var b = document.getElementById(this.domIdPrefix).querySelector("[selected]");
if (!b) return !1;
var c = b.value;
return this.selectVariant(c, a);
}),
(Shopify.OptionSelectors.prototype.selectVariantFromParams = function (a) {
var b = Shopify.urlParam("variant");
return this.selectVariant(b, a);
}),
(Shopify.OptionSelectors.prototype.selectVariant = function (a, b) {
var c = this.product.getVariantById(a);
if (null == c) return !1;
for (var d = 0; d < this.selectors.length; d++) {
var e = this.selectors[d].element,
f = e.getAttribute("data-option"),
g = c[f];
null != g && this.optionExistInSelect(e, g) && (e.value = g);
}
return "undefined" != typeof jQuery ? jQuery(this.selectors[0].element).trigger("change", b) : this.selectors[0].element.onchange(b), !0;
}),
(Shopify.OptionSelectors.prototype.optionExistInSelect = function (a, b) {
for (var c = 0; c < a.options.length; c++) if (a.options[c].value == b) return !0;
}),
(Shopify.OptionSelectors.prototype.insertSelectors = function (a, b) {
Shopify.isDefined(b) && this.setMessageElement(b), (this.domIdPrefix = "product-" + this.product.id + "-variant-selector");
var c = document.getElementById(a);
Shopify.each(this.buildSelectors(), function (a) {
c.appendChild(a);
});
}),
(Shopify.OptionSelectors.prototype.buildSelectors = function () {
for (var a = 0; a < this.product.optionNames().length; a++) {
var b = new Shopify.SingleOptionSelector(this, a, this.product.optionNames()[a], this.product.optionValues(a));
(b.element.disabled = !1), this.selectors.push(b);
}
var c = this.selectorDivClass,
d = this.product.optionNames(),
e = Shopify.map(this.selectors, function (a) {
var b = document.createElement("div"),
e = c;
if ("undefined" != typeof a.name) {
var f = a.name.name || a.name;
e = c + " " + f.toLowerCase().replace(" ", "_");
}
if ((b.setAttribute("class", e), d.length > 1 || d.length >= 1)) {
var g = document.createElement("label");
if (((g.htmlFor = a.element.id), (g.innerHTML = a.name.name || a.name), b.appendChild(g), /size/i.test(f.toLowerCase()) && window.size_chart)) {
var h = jQuery('<a id="size_chart_trigger" href="#" class="sizechart-ctl" data-ctl-toggle="#sizechart-ctl">' + window.size_chart_txt + "</a>");
jQuery(g).append(h);
}
}
return b.appendChild(a.element), b;
});
return e;
}),
(Shopify.OptionSelectors.prototype.selectedValues = function () {
for (var a = [], b = 0; b < this.selectors.length; b++) {
var c = this.selectors[b].element.value;
a.push(c);
}
return a;
}),
(Shopify.OptionSelectors.prototype.updateSelectors = function (a, b) {
var c = this.selectedValues(),
d = this.product.getVariant(c);
d ? ((this.variantIdField.disabled = !1), (this.variantIdField.value = d.id)) : (this.variantIdField.disabled = !0), this.onVariantSelected(d, this, b), null != this.historyState && this.historyState.onVariantChange(d, this, b);
}),
(Shopify.OptionSelectorsFromDOM = function (a, b) {
var c = b.optionNames || [],
d = b.priceFieldExists || !0,
e = b.delimiter || "/",
f = this.createProductFromSelector(a, c, d, e);
(b.product = f), Shopify.OptionSelectorsFromDOM.baseConstructor.call(this, a, b);
}),
Shopify.extend(Shopify.OptionSelectorsFromDOM, Shopify.OptionSelectors),
(Shopify.OptionSelectorsFromDOM.prototype.createProductFromSelector = function (a, b, c, d) {
if (!Shopify.isDefined(c)) var c = !0;
if (!Shopify.isDefined(d)) var d = "/";
var e = document.getElementById(a),
f = e.childNodes,
g = (e.parentNode, b.length),
h = [];
Shopify.each(f, function (a) {
if (1 == a.nodeType && "option" == a.tagName.toLowerCase()) {
var e = a.innerHTML.split(new RegExp("\\s*\\" + d + "\\s*"));
0 == b.length && (g = e.length - (c ? 1 : 0));
var f = e.slice(0, g),
i = c ? e[g] : "",
j = (a.getAttribute("value"), { available: !a.disabled, id: parseFloat(a.value), price: i, option1: f[0], option2: f[1], option3: f[2] });
h.push(j);
}
});
var i = { variants: h };
if (0 == b.length) {
i.options = [];
for (var j = 0; g > j; j++) i.options[j] = "option " + (j + 1);
} else i.options = b;
return i;
}),
(Shopify.SingleOptionSelector = function (a, b, c, d) {
(this.multiSelector = a), (this.values = d), (this.index = b), (this.name = c), (this.element = document.createElement("select"));
for (var e = 0; e < d.length; e++) {
var f = document.createElement("option");
(f.value = d[e]), (f.innerHTML = d[e]), this.element.appendChild(f);
}
return (
this.element.setAttribute("class", this.multiSelector.selectorClass),
this.element.setAttribute("data-option", "option" + (b + 1)),
(this.element.id = a.domIdPrefix + "-option-" + b),
(this.element.onchange = function (c, d) {
(d = d || {}), a.updateSelectors(b, d);
}),
!0
);
}),
(Shopify.Image = {
preload: function (a, b) {
for (var c = 0; c < a.length; c++) {
var d = a[c];
this.loadImage(this.getSizedImageUrl(d, b));
}
},
loadImage: function (a) {
new Image().src=a;
},
switchImage: function (a, b, c) {
if (a && b) {
var d = this.imageSize(b.src),
e = this.getSizedImageUrl(a.src, d);
c ? c(e, a, b) : (b.src=e);
}
},
imageSize: function (a) {
var b = a.match(/_(1024x1024|2048x2048|pico|icon|thumb|small|compact|medium|large|grande)\./);
return null != b ? b[1] : null;
},
getSizedImageUrl: function (a, b) {
if (null == b) return a;
if ("master" == b) return this.removeProtocol(a);
var c = a.match(/\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\?v=\d+)?$/i);
if (null != c) {
var d = a.split(c[0]),
e = c[0];
return this.removeProtocol(d[0] + "_" + b + e);
}
return null;
},
removeProtocol: function (a) {
return a.replace(/http(s)?:/, "");
},
}),
(Shopify.OptionSelectors.HistoryState = function (a) {
this.browserSupports() && this.register(a);
}),
(Shopify.OptionSelectors.HistoryState.prototype.register = function (a) {
window.addEventListener("popstate", function () {
a.selectVariantFromParamsOrDropdown({ popStateCall: !0 });
});
}),
(Shopify.OptionSelectors.HistoryState.prototype.onVariantChange = function (a, b, c) {
this.browserSupports() && (!a || c.initialLoad || c.popStateCall || window.history.replaceState({}, document.title, "?variant=" + a.id));
}),
(Shopify.OptionSelectors.HistoryState.prototype.browserSupports = function () {
return window.history && window.history.replaceState;
});
Hey Community! As the holiday season unfolds, we want to extend heartfelt thanks to a...
By JasonH Dec 6, 2024Dropshipping, a high-growth, $226 billion-dollar industry, remains a highly dynamic bus...
By JasonH Nov 27, 2024Hey Community! It’s time to share some appreciation and celebrate what we have accomplis...
By JasonH Nov 14, 2024