(function () { "use strict"; function updateCart(product, quantity, replace) { var key = "aksrt_cart"; var current; try { current = JSON.parse(localStorage.getItem(key) || "[]"); if (!Array.isArray(current)) { current = []; } } catch (error) { current = []; } var index = current.findIndex(function (item) { return Number(item.product_id || item.id || 0) === Number(product.product_id); }); if (index >= 0) { current[index].qty = replace ? quantity : Number(current[index].qty || 1) + quantity; } else { current.push({ product_id: product.product_id, id: product.product_id, title: product.title, image: product.image, price: product.price, qty: quantity }); } localStorage.setItem(key, JSON.stringify(current)); } var productPage = document.querySelector("[data-aksrt-product-page]"); if (productPage) { var quantityInput = productPage.querySelector("[data-aksrt-quantity]"); var productId = Number(productPage.getAttribute("data-product-id") || 0); var titleEl = productPage.querySelector(".aksrt-product-page__title"); var imageEl = productPage.querySelector(".aksrt-product-page__primary-image img"); var priceEl = productPage.querySelector(".aksrt-product-page__price"); var couponEl = productPage.querySelector("[data-aksrt-product-coupon]"); productPage.addEventListener("click", function (event) { var qtyBtn = event.target.closest("[data-aksrt-qty-action]"); if (qtyBtn && quantityInput) { var action = qtyBtn.getAttribute("data-aksrt-qty-action"); var current = Number(quantityInput.value || 1); var max = Number(quantityInput.getAttribute("max") || 999); quantityInput.value = action === "inc" ? Math.min(max, current + 1) : Math.max(1, current - 1); return; } if (event.target.closest("[data-aksrt-add-cart]")) { updateCart({ product_id: productId, title: titleEl ? titleEl.textContent.trim() : "商品", image: imageEl ? imageEl.getAttribute("src") : "", price: Number((priceEl ? priceEl.textContent : "0").replace(/[^\d.]/g, "")) }, Number(quantityInput ? quantityInput.value : 1), false); if (typeof window.aksrtToast === 'function') { window.aksrtToast("已加入购物车。", 'success'); } else { window.alert("已加入购物车。"); } return; } if (event.target.closest("[data-aksrt-buy-now]")) { updateCart({ product_id: productId, title: titleEl ? titleEl.textContent.trim() : "商品", image: imageEl ? imageEl.getAttribute("src") : "", price: Number((priceEl ? priceEl.textContent : "0").replace(/[^\d.]/g, "")) }, Number(quantityInput ? quantityInput.value : 1), true); var cartUrl = new URL(aksrtData.cartUrl || window.location.href, window.location.origin); if (couponEl && couponEl.value) { cartUrl.searchParams.set("coupon", couponEl.value); } window.location.href = cartUrl.toString(); } }); productPage.addEventListener("click", function (event) { var thumb = event.target.closest("[data-aksrt-product-thumb]"); var primaryImage = productPage.querySelector(".aksrt-product-page__primary-image img"); if (thumb && primaryImage) { primaryImage.setAttribute("src", thumb.getAttribute("data-aksrt-product-thumb")); } }); // SKU 规格选择器 var skuSelector = productPage.querySelector("[data-aksrt-sku-selector]"); if (skuSelector) { var selectedSpecs = {}; var skuInfo = productPage.querySelector("[data-aksrt-sku-info]"); var skuPrice = skuInfo ? skuInfo.querySelector(".aksrt-product-page__sku-price") : null; var skuStock = skuInfo ? skuInfo.querySelector(".aksrt-product-page__sku-stock") : null; var skus = []; try { var skuData = skuSelector.getAttribute("data-aksrt-skus"); if (skuData) skus = JSON.parse(skuData); } catch (e) { /* ignore */ } skuSelector.addEventListener("click", function (event) { var btn = event.target.closest("[data-aksrt-spec]"); if (!btn) return; var specIndex = btn.getAttribute("data-aksrt-spec"); var specVal = btn.getAttribute("data-aksrt-spec-val"); // 切换选中状态 var siblings = skuSelector.querySelectorAll('[data-aksrt-spec="' + specIndex + '"]'); siblings.forEach(function (s) { s.classList.remove("is-active"); }); btn.classList.add("is-active"); selectedSpecs[specIndex] = specVal; // 查找匹配的 SKU var matchedSku = findMatchingSku(skus, selectedSpecs); if (matchedSku && skuInfo) { skuInfo.hidden = false; if (skuPrice) skuPrice.textContent = "¥" + Number(matchedSku.price || 0).toFixed(2); if (skuStock) skuStock.textContent = "库存: " + (matchedSku.stock || 0); // 更新主价格显示 if (priceEl) priceEl.textContent = "¥" + Number(matchedSku.price || 0).toFixed(2); // 更新库存限制 if (quantityInput) { quantityInput.setAttribute("max", String(matchedSku.stock || 999)); if (Number(quantityInput.value) > (matchedSku.stock || 999)) { quantityInput.value = matchedSku.stock || 1; } } // 更新主图 if (matchedSku.image && primaryImage) { primaryImage.setAttribute("src", matchedSku.image); } } else if (skuInfo) { skuInfo.hidden = true; } }); function findMatchingSku(skus, specs) { if (!skus.length) return null; var specKeys = Object.keys(specs); if (specKeys.length === 0) return null; return skus.find(function (sku) { if (!sku.specs) return false; return specKeys.every(function (key) { return sku.specs[key] === specs[key]; }); }) || null; } } } var editor = document.querySelector("[data-aksrt-product-editor]"); if (!editor || !window.aksrtData) { return; } var form = editor.querySelector("[data-aksrt-product-form]"); var messageEl = editor.querySelector("[data-aksrt-product-editor-message]"); function selectedMultiValues(select) { if (!select) { return []; } return Array.prototype.slice.call(select.options) .filter(function (option) { return option.selected; }) .map(function (option) { return Number(option.value || 0); }) .filter(Boolean); } form.addEventListener("submit", function (event) { event.preventDefault(); var formData = new FormData(form); var productId = Number(editor.getAttribute("data-product-id") || 0); var gallery = String(formData.get("gallery") || "") .split(/\r?\n/) .map(function (line) { return line.trim(); }) .filter(Boolean); var payload = { title: String(formData.get("title") || "").trim(), price: Number(formData.get("price") || 0), stock: Number(formData.get("stock") || 0), excerpt: String(formData.get("excerpt") || ""), content: String(formData.get("content") || ""), status: String(formData.get("status") || "draft"), categories: selectedMultiValues(form.querySelector('select[name="categories[]"]')), tags: String(formData.get("tags") || "") .split(",") .map(function (tag) { return tag.trim(); }) .filter(Boolean), image: String(formData.get("image") || "").trim(), gallery: gallery, shipping_mode: String(formData.get("shipping_mode") || "express"), shipping_fee: Number(formData.get("shipping_fee") || 0), after_sale_policy: String(formData.get("after_sale_policy") || ""), support_refund: formData.get("support_refund") === "1" }; var path = productId > 0 ? "/shop/frontend/products/" + productId : "/shop/frontend/products"; messageEl.textContent = "正在保存商品..."; fetch("/wp-json/aksrt/v1" + path, { method: "POST", headers: { "Content-Type": "application/json", "X-WP-Nonce": aksrtData.restNonce }, body: JSON.stringify(payload) }) .then(function (response) { return response.json(); }) .then(function (result) { if (!result.success) { messageEl.textContent = result.message || "保存失败。"; return; } var centerUrl = aksrtData.userCenterUrl || "/"; messageEl.textContent = "商品已保存,正在返回用户中心..."; window.location.href = centerUrl; }) .catch(function () { messageEl.textContent = "网络错误,请稍后重试。"; }); }); })();