Liquid、JavaScriptなどに関する質問
Liteプランで購入ボタンを外部のwordpressに埋め込んで運用しています。
在庫の無いバリエーションの場合、Add to cartボタンがOut of stockとなるのは良いのですが、バリエーションが多い商品だと、プルダウンで1つ1つ選択していかないと在庫の有無がわからないので、プルダウンをクリックした時に表示される選択肢の在庫の無いバリエーション名の後ろに“(Sold out)”と付け加えたいのですが、可能でしょうか?
商品管理で在庫が無くなったバリエーション名を「〇〇〇〇(Sold out)」の様に書き換えることで、同じ見た目は実現できますが、1つ1つ在庫を追って作業しなければならないので、できれば在庫数に連動して自動的にSold outがつく様にしたいです。
もし可能であれば、方法をアドバイスしていただけると助かります。
解決済! ベストソリューションを見る。
成功
下記のように埋め込みコードをカスタマイズされるとどうでしょうか?
ShopifyBuy.UI.onReady(client).then(function (ui) {
console.log(ui);
ui.createComponent('product', {
id: '6574139670688',
node: document.getElementById('product-component-1653907257261'),
moneyFormat: '%C2%A5%7B%7Bamount_no_decimals%7D%7D',
options: {
"product": {
"styles": {
"product": {
"@media (min-width: 601px)": {
"max-width": "calc(25% - 20px)",
"margin-left": "20px",
"margin-bottom": "50px"
}
},
},
"text": {
"button": "Add to cart"
}
},
"productSet": {
"styles": {
"products": {
"@media (min-width: 601px)": {
"margin-left": "-20px"
}
}
}
},
カスタマイズ状況によってコードは異なりますが、上記のコードを下記のようにします。
ShopifyBuy.UI.onReady(client).then(function (ui) {
console.log(ui);
ui.createComponent('product', {
id: '6574139670688',
node: document.getElementById('product-component-1653907257261'),
moneyFormat: '%C2%A5%7B%7Bamount_no_decimals%7D%7D',
options: {
"product": {
"styles": {
"product": {
"@media (min-width: 601px)": {
"max-width": "calc(25% - 20px)",
"margin-left": "20px",
"margin-bottom": "50px"
}
},
},
"text": {
"button": "Add to cart"
},
"events": {
"afterRender": function(component) {
const selectElements = component.node.childNodes[0].contentWindow.document.querySelectorAll('[data-element="option.select"]');
const optionElements = selectElements[0].querySelectorAll('option');
component.model.variants.forEach((variant,index) => {
if (!variant.available) {
optionElements[index].innerText = optionElements[index].innerText + " (Sold Out)";
}
});
}
}
},
"productSet": {
"styles": {
"products": {
"@media (min-width: 601px)": {
"margin-left": "-20px"
}
}
}
},
具体的に言うと、
options.productに下記を追加しました。
"events": {
"afterRender": function(component) {
const selectElements = component.node.childNodes[0].contentWindow.document.querySelectorAll('[data-element="option.select"]');
const optionElements = selectElements[0].querySelectorAll('option');
component.model.variants.forEach((variant,index) => {
if (!variant.available) {
optionElements[index].innerText = optionElements[index].innerText + " (Sold Out)";
}
});
}
}
なお、下記は注意点です。
もし、オプションが2つ以上存在する場合は、上記のコードは全く意味をなしません。
オプションが2つ以上存在する場合の実装が少し大変なので割愛させていただきましたが、
もし必要であれば、このスレッドにご返信ください。
即答はできないかもしれませんが、カスタマイズを考えてみます。
ご参考まで。
(キュー田辺)
成功
下記のように埋め込みコードをカスタマイズされるとどうでしょうか?
ShopifyBuy.UI.onReady(client).then(function (ui) {
console.log(ui);
ui.createComponent('product', {
id: '6574139670688',
node: document.getElementById('product-component-1653907257261'),
moneyFormat: '%C2%A5%7B%7Bamount_no_decimals%7D%7D',
options: {
"product": {
"styles": {
"product": {
"@media (min-width: 601px)": {
"max-width": "calc(25% - 20px)",
"margin-left": "20px",
"margin-bottom": "50px"
}
},
},
"text": {
"button": "Add to cart"
}
},
"productSet": {
"styles": {
"products": {
"@media (min-width: 601px)": {
"margin-left": "-20px"
}
}
}
},
カスタマイズ状況によってコードは異なりますが、上記のコードを下記のようにします。
ShopifyBuy.UI.onReady(client).then(function (ui) {
console.log(ui);
ui.createComponent('product', {
id: '6574139670688',
node: document.getElementById('product-component-1653907257261'),
moneyFormat: '%C2%A5%7B%7Bamount_no_decimals%7D%7D',
options: {
"product": {
"styles": {
"product": {
"@media (min-width: 601px)": {
"max-width": "calc(25% - 20px)",
"margin-left": "20px",
"margin-bottom": "50px"
}
},
},
"text": {
"button": "Add to cart"
},
"events": {
"afterRender": function(component) {
const selectElements = component.node.childNodes[0].contentWindow.document.querySelectorAll('[data-element="option.select"]');
const optionElements = selectElements[0].querySelectorAll('option');
component.model.variants.forEach((variant,index) => {
if (!variant.available) {
optionElements[index].innerText = optionElements[index].innerText + " (Sold Out)";
}
});
}
}
},
"productSet": {
"styles": {
"products": {
"@media (min-width: 601px)": {
"margin-left": "-20px"
}
}
}
},
具体的に言うと、
options.productに下記を追加しました。
"events": {
"afterRender": function(component) {
const selectElements = component.node.childNodes[0].contentWindow.document.querySelectorAll('[data-element="option.select"]');
const optionElements = selectElements[0].querySelectorAll('option');
component.model.variants.forEach((variant,index) => {
if (!variant.available) {
optionElements[index].innerText = optionElements[index].innerText + " (Sold Out)";
}
});
}
}
なお、下記は注意点です。
もし、オプションが2つ以上存在する場合は、上記のコードは全く意味をなしません。
オプションが2つ以上存在する場合の実装が少し大変なので割愛させていただきましたが、
もし必要であれば、このスレッドにご返信ください。
即答はできないかもしれませんが、カスタマイズを考えてみます。
ご参考まで。
(キュー田辺)
教えていただいたコードを追加したらうまく動きました!ありがとうございます。
今の所、バリエーションは1種類しかないのですが、2つになった場合は、またご相談させていただきたいと思います。
2023年2月、Shopifyはcheckout.liquidを廃止し、Checkout Extensibilityに移行することを発表いたしました。この新しいチェックアウト...
By JasonH Aug 15, 2024「味噌の可能性を、とき放つ」をコンセプトに、豊かな自然に恵まれた信州で味噌の製造販売を行う新田醸造。江戸末期に創業した老舗のみそ屋さんですが、2024年春、顧客層や販売範囲の...
By Minami_ Jul 30, 2024ネットショッピングは、利便性に優れいている反面、利用に抵抗感がある人も多くいます。Amazonや楽天市場等、大型モールの企業は、知名度や運営企業の信頼性から顧客が不...
By JapanGuru Jul 23, 2024