{"id":72,"date":"2025-05-28T09:33:47","date_gmt":"2025-05-28T09:33:47","guid":{"rendered":"https:\/\/bangblazevape.com\/?page_id=72"},"modified":"2026-08-06T13:34:06","modified_gmt":"2026-08-06T13:34:06","slug":"orders-tracking","status":"publish","type":"page","link":"https:\/\/bangblazevape.com\/orders-tracking\/","title":{"rendered":"Orders Tracking"},"content":{"rendered":"\n\n\n<div class=\"track-container\">\n  <div class=\"track-main\">\n    <div class=\"track-header\">\n      <h2>Track Your Shipment<\/h2>\n    <\/div>\n    <div class=\"track-form\">\n      <div class=\"input-wrapper\">\n        <svg class=\"search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"><\/circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"><\/line><\/svg>\n        <input id=\"inputNo\" class=\"track-input\" type=\"text\" placeholder=\"Enter your tracking number...\" autocomplete=\"off\" \/>\n      <\/div>\n      <button id=\"checkButton\" class=\"track-button\">\n        <span>TRACK<\/span>\n        <svg class=\"arrow-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"><\/line><polyline points=\"12 5 19 12 12 19\"><\/polyline><\/svg>\n      <\/button>\n    <\/div>\n  <\/div> \n  \n  <div id=\"trackingResults\" class=\"track-result\"><\/div>\n    \n  <div class=\"lang-switch-wrap\">\n      <span class=\"lang-label\">\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"><\/line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"><\/path><\/svg>\n        Language\n      <\/span>\n      <div class=\"lang-pills\">\n        <a class=\"lang-pill\" data-lang=\"english\" href=\"javascript:translate.changeLanguage('english');\">English<\/a>\n        <a class=\"lang-pill\" data-lang=\"deutsch\" href=\"javascript:translate.changeLanguage('deutsch');\">Deutsch<\/a>\n        <a class=\"lang-pill\" data-lang=\"french\" href=\"javascript:translate.changeLanguage('french');\">Fran\u00e7ais<\/a>\n        <a class=\"lang-pill\" data-lang=\"spanish\" href=\"javascript:translate.changeLanguage('spanish');\">Espa\u00f1ol<\/a>\n        <a class=\"lang-pill\" data-lang=\"italian\" href=\"javascript:translate.changeLanguage('italian');\">Italiano<\/a>\n        <a class=\"lang-pill\" data-lang=\"swedish\" href=\"javascript:translate.changeLanguage('swedish');\">Svenska<\/a>\n        <a class=\"lang-pill\" data-lang=\"dutch\" href=\"javascript:translate.changeLanguage('dutch');\">Nederlands<\/a>\n        <a class=\"lang-pill\" data-lang=\"japanese\" href=\"javascript:translate.changeLanguage('japanese');\">\u65e5\u672c\u8a9e<\/a>\n        <a class=\"lang-pill\" data-lang=\"chinese_simplified\" href=\"javascript:translate.changeLanguage('chinese_simplified');\">\u4e2d\u6587<\/a>\n      <\/div>\n  <\/div>\n<\/div>\n\n<script>\n    \/\/ \u8bed\u8a00\u7f13\u5b58\u4e0e\u6620\u5c04\n    let currentLanguage = localStorage.getItem('SelectedLanguage') || 'en';\n\n    function delUrlParam(param) {\n        let obj = new window.URL(window.location.href);\n        obj.searchParams.delete(param);\n        return obj.href;\n    }\n    \n    function addUrlParam(key, value) {\n        let obj = new window.URL(window.location.href);\n        obj.searchParams.set(key, value);\n        return obj.href;\n    }\n\n    \/\/ \u6b63\u5219\u94fe\u63a5\u66ff\u6362\n    function addLinksToText(text) {\n        if (!text) return '';\n        const regex = new RegExp(\"(https?:\/\/[^\\s]+)\", \"g\");\n        return text.replace(regex, function(match) {\n            return `<a class=\"track-link\" href=\"${match}\" target=\"_blank\">${match}<\/a>`;\n        });\n    }\n    \n    function performTrackingQuery(trackingNumber) {\n        jQuery('#trackingResults').html(`\n            <div class=\"track-loading\">\n                <div class=\"spinner-box\">\n                    <div class=\"circle-border\">\n                        <div class=\"circle-core\"><\/div>\n                    <\/div>\n                <\/div>\n                <p>Retrieving real-time logistics status...<\/p>\n            <\/div>\n        `);\n\n        jQuery.ajax({\n            url: '\/wp-json\/api\/v1\/tracking\/' + trackingNumber,\n            method: 'GET',\n            success: async function(response) {\n                let list = [];\n                try {\n                    list = typeof response === 'string' ? JSON.parse(response) : response;\n                } catch(e) {\n                    console.error(\"JSON parse error\", e);\n                }\n\n                if (!Array.isArray(list) || list.length === 0) {\n                    jQuery('#trackingResults').html(`\n                        <div class=\"track-empty\">\n                            <svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"><\/line><\/svg>\n                            <p>No tracking information found for this number.<\/p>\n                        <\/div>\n                    `);\n                    return;\n                }\n\n                var html = `<ul class=\"track-list\">`;\n                list.forEach(function(item, index) {\n                    html += `\n                        <li id=\"track-item-${index}\" class=\"track-item\" style=\"animation-delay: ${index * 0.08}s\">\n                            <div class=\"track-node\"><\/div>\n                            <div class=\"track-content\">\n                                <span class='time'>${item.time || ''}<\/span>\n                                <span class='location' id='location-${index}' data-raw=\"${encodeURIComponent(item.location || '')}\">\n                                    <span class=\"translating-tag\">Translating...<\/span>\n                                <\/span>\n                                <span class='detail' id='detail-${index}' data-raw=\"${encodeURIComponent(item.detail || '')}\">\n                                    <span class=\"translating-tag\">Translating...<\/span>\n                                <\/span>\n                            <\/div>\n                        <\/li>`;\n                });\n                html += `<\/ul>`;\n\n                jQuery('#trackingResults').html(html);\n                translateAndUpdateBatch(list);\n            },\n            error: function() {\n                jQuery('#trackingResults').html(`\n                    <div class=\"track-empty error\">\n                        <p>Query error, please check network or try again later.<\/p>\n                    <\/div>\n                `);\n            }\n        });\n    }\n\n    async function translateAndUpdateBatch(list) {\n        try {\n            const textsToTranslate = list.flatMap(item => [item.location || '', item.detail || '']);\n            const translatedTexts = await translateTexts(textsToTranslate);\n\n            list.forEach(function(item, index) {\n                jQuery(`#location-${index}`).html(translatedTexts[index * 2] || item.location);\n                jQuery(`#detail-${index}`).html(addLinksToText(translatedTexts[index * 2 + 1] || item.detail));\n            });\n        } catch (error) {\n            console.error('Translation batch error:', error);\n            list.forEach(function(item, index) {\n                jQuery(`#location-${index}`).html(item.location);\n                jQuery(`#detail-${index}`).html(addLinksToText(item.detail));\n            });\n        }\n    }\n\n    var translate = {\n        changeLanguage: function(language) {\n            const languageMap = {\n                'english': 'en',\n                'deutsch': 'de',\n                'french': 'fr',\n                'spanish': 'es',\n                'italian': 'it',\n                'swedish': 'sv',\n                'dutch': 'nl',\n                'japanese': 'ja',\n                'chinese_simplified': 'zh-CN'\n            };\n            currentLanguage = languageMap[language] || 'en';\n            localStorage.setItem('SelectedLanguage', currentLanguage);\n            updateActivePill(language);\n\n            const list = jQuery('.track-list li').map(function(index, element) {\n                return {\n                    location: decodeURIComponent(jQuery(`#location-${index}`).data('raw') || ''),\n                    detail: decodeURIComponent(jQuery(`#detail-${index}`).data('raw') || '')\n                };\n            }).get();\n\n            if (list.length > 0) {\n                list.forEach(function(item, index) {\n                    jQuery(`#location-${index}`).html('<span class=\"translating-tag\">Translating...<\/span>');\n                    jQuery(`#detail-${index}`).html('<span class=\"translating-tag\">Translating...<\/span>');\n                });\n                translateAndUpdateBatch(list);\n            }\n        }\n    };\n    \n    function updateActivePill(langKey) {\n        jQuery('.lang-pill').removeClass('active');\n        jQuery(`.lang-pill[data-lang=\"${langKey}\"]`).addClass('active');\n    }\n\n    async function translateTexts(texts) {\n        try {\n            const promises = texts.map(text => {\n                if (!text || text.trim() === '') return Promise.resolve('');\n                const url = `https:\/\/translate.googleapis.com\/translate_a\/single?client=gtx&sl=auto&tl=${currentLanguage}&dt=t&q=${encodeURIComponent(text)}`;\n                return fetch(url)\n                    .then(res => res.json())\n                    .then(data => data[0].map(item => item[0]).join(''));\n            });\n            return await Promise.all(promises);\n        } catch (err) {\n            console.warn('Google Translate failed, trying MyMemory backup...', err);\n        }\n\n        try {\n            const promises = texts.map(text => {\n                if (!text || text.trim() === '') return Promise.resolve('');\n                const url = `https:\/\/api.mymemory.translated.net\/get?q=${encodeURIComponent(text)}&langpair=auto|${currentLanguage}`;\n                return fetch(url)\n                    .then(res => res.json())\n                    .then(data => data.responseData.translatedText || text);\n            });\n            return await Promise.all(promises);\n        } catch (err) {\n            console.error('All translation APIs failed:', err);\n            return texts;\n        }\n    }\n\n    jQuery(document).ready(function() {\n        var urlParams = new URLSearchParams(window.location.search);\n        var trackingNumber = urlParams.get('no');\n\n        const langReverseMap = {\n            'en': 'english', 'de': 'deutsch', 'fr': 'french', 'es': 'spanish',\n            'it': 'italian', 'sv': 'swedish', 'nl': 'dutch', 'ja': 'japanese', 'zh-CN': 'chinese_simplified'\n        };\n        updateActivePill(langReverseMap[currentLanguage] || 'english');\n\n        if (trackingNumber) {\n            jQuery('#inputNo').val(trackingNumber);\n            performTrackingQuery(trackingNumber);\n        }\n\n        jQuery('#checkButton').click(function() {\n            var trackingNumber = jQuery('#inputNo').val();\n\n            if (trackingNumber && trackingNumber.trim() !== '') {\n                history.pushState({}, 0, delUrlParam('no')); \n                history.pushState({}, 0, addUrlParam('no', trackingNumber.trim()));\n                performTrackingQuery(trackingNumber.trim());\n            } else {\n                jQuery('.input-wrapper').addClass('shake-warning');\n                setTimeout(() => jQuery('.input-wrapper').removeClass('shake-warning'), 500);\n            }\n        });\n\n        jQuery('#inputNo').keypress(function(e) {\n            if(e.which == 13) {\n                jQuery('#checkButton').click();\n            }\n        });\n    });\n<\/script>\n\n<style>\n\/* ================= \u6781\u7b80\u660e\u4eae + \u56fe\u7247\u8349\u7eff\u70b9\u7f00 ================= *\/\n:root {\n  --brand-green: #82d837;       \/* \u5339\u914d\u56fe\u7247\u4e2d\u7684\u8349\u7eff\u8272 *\/\n  --brand-green-hover: #72c32c;\n}\n\n.track-container {\n  width: 100%;\n  max-width: 100%;\n  box-sizing: border-box;\n  margin: 0 auto;\n  padding: 36px;\n  background: #ffffff;\n  border: 1px solid #e2e8f0;\n  border-radius: 20px;\n  box-shadow: 0 10px 30px rgba(15, 23, 42, 0.05);\n  color: #0f172a;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.track-header {\n  margin-bottom: 24px;\n}\n\n\/* \u6807\u9898\u6539\u6210\u8349\u7eff\u8272 *\/\n.track-header h2 {\n  margin: 0;\n  font-size: 26px;\n  font-weight: 800;\n  color: var(--brand-green);\n  letter-spacing: -0.5px;\n}\n\n\/* ================= \u8868\u5355 & \u8f93\u5165\u6846 ================= *\/\n.track-form {\n  display: flex;\n  gap: 12px;\n  margin-bottom: 28px;\n}\n\n.input-wrapper {\n  position: relative;\n  flex: 1;\n  display: flex;\n  align-items: center;\n}\n\n.search-icon {\n  position: absolute;\n  left: 18px;\n  width: 18px;\n  height: 18px;\n  color: #94a3b8;\n  transition: color 0.2s;\n  pointer-events: none;\n  z-index: 5;\n}\n\n.track-input {\n  width: 100%;\n  height: 52px;\n  background: #f8fafc;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 12px;\n  padding: 0 20px 0 52px !important;\n  color: #0f172a;\n  font-size: 15px;\n  font-weight: 500;\n  outline: none;\n  box-sizing: border-box;\n  transition: all 0.25s ease;\n}\n\n.track-input::placeholder {\n  color: #94a3b8;\n}\n\n.track-input:focus {\n  background: #ffffff;\n  border-color: var(--brand-green);\n  box-shadow: 0 0 0 4px rgba(130, 216, 55, 0.2);\n}\n\n.track-input:focus ~ .search-icon {\n  color: var(--brand-green);\n}\n\n.shake-warning {\n  animation: shake 0.4s ease-in-out;\n  border-color: #ef4444 !important;\n}\n\n@keyframes shake {\n  0%, 100% { transform: translateX(0); }\n  25% { transform: translateX(-6px); }\n  75% { transform: translateX(6px); }\n}\n\n.track-button {\n  height: 52px;\n  padding: 0 32px;\n  background: var(--brand-green);\n  border: none;\n  border-radius: 12px;\n  color: #ffffff;\n  font-weight: 800;\n  font-size: 15px;\n  letter-spacing: 0.5px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  white-space: nowrap;\n  transition: all 0.25s ease;\n  box-shadow: 0 4px 14px rgba(130, 216, 55, 0.3);\n}\n\n.track-button:hover {\n  background: var(--brand-green-hover);\n  box-shadow: 0 6px 20px rgba(130, 216, 55, 0.4);\n  transform: translateY(-1px);\n}\n\n.arrow-icon {\n  width: 18px;\n  height: 18px;\n  transition: transform 0.2s;\n}\n\n.track-button:hover .arrow-icon {\n  transform: translateX(3px);\n}\n\n\/* ================= \u65f6\u95f4\u8f74 ================= *\/\n.track-list {\n  padding: 10px 0;\n  margin: 0;\n  list-style: none;\n  position: relative;\n}\n\n.track-list::before {\n  content: '';\n  position: absolute;\n  left: 8px;\n  top: 25px;\n  bottom: 25px;\n  width: 2px;\n  background: #e2e8f0;\n}\n\n.track-item {\n  position: relative;\n  padding-left: 32px;\n  margin-bottom: 22px;\n  opacity: 0;\n  animation: fadeInUp 0.35s ease forwards;\n}\n\n@keyframes fadeInUp {\n  from { opacity: 0; transform: translateY(12px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n.track-node {\n  position: absolute;\n  left: 2px;\n  top: 5px;\n  width: 14px;\n  height: 14px;\n  border-radius: 50%;\n  background: #cbd5e1;\n  border: 3px solid #ffffff;\n  transition: all 0.3s;\n}\n\n.track-item:first-child .track-node {\n  background: var(--brand-green);\n  animation: pulseGreen 2s infinite;\n}\n\n@keyframes pulseGreen {\n  0% { box-shadow: 0 0 0 0px rgba(130, 216, 55, 0.4); }\n  70% { box-shadow: 0 0 0 8px rgba(130, 216, 55, 0); }\n  100% { box-shadow: 0 0 0 0px rgba(130, 216, 55, 0); }\n}\n\n.track-content {\n  background: #f8fafc;\n  border: 1px solid #f1f5f9;\n  padding: 16px;\n  border-radius: 12px;\n  transition: border-color 0.2s;\n}\n\n.track-item:first-child .track-content {\n  background: #f8fdf2;\n  border-color: #d1f2a5;\n}\n\n.track-list .time {\n  font-size: 13px;\n  color: #5ea11d;\n  font-weight: 700;\n  margin-bottom: 4px;\n  display: block;\n}\n\n.track-list .location {\n  font-size: 15px;\n  font-weight: 700;\n  color: #0f172a;\n  margin-bottom: 6px;\n  display: block;\n}\n\n.track-list .detail {\n  font-size: 14px;\n  color: #475569;\n  line-height: 1.5;\n  display: block;\n  word-break: break-word;\n}\n\n.track-link {\n  color: #0284c7 !important;\n  text-decoration: none;\n  border-bottom: 1px stroke #0284c7;\n  transition: all 0.2s;\n}\n\n.track-link:hover {\n  color: #0369a1 !important;\n  text-decoration: underline;\n}\n\n.translating-tag {\n  font-size: 12px;\n  color: #94a3b8;\n  font-style: italic;\n}\n\n\/* ================= \u52a0\u8f7d & \u7a7a\u72b6\u6001 ================= *\/\n.track-loading {\n  text-align: center;\n  padding: 40px 0;\n  color: #64748b;\n}\n\n.spinner-box {\n  display: flex;\n  justify-content: center;\n  margin-bottom: 12px;\n}\n\n.circle-border {\n  width: 36px;\n  height: 36px;\n  padding: 3px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border-radius: 50%;\n  background: linear-gradient(0deg, rgba(130, 216, 55, 0.1) 33%, var(--brand-green) 100%);\n  animation: spin 0.8s linear infinite;\n}\n\n.circle-core {\n  width: 100%;\n  height: 100%;\n  background-color: #ffffff;\n  border-radius: 50%;\n}\n\n@keyframes spin {\n  from { transform: rotate(0deg); }\n  to { transform: rotate(360deg); }\n}\n\n.track-empty {\n  text-align: center;\n  padding: 36px 0;\n  color: #64748b;\n}\n\n.track-empty svg {\n  margin-bottom: 8px;\n  color: #94a3b8;\n}\n\n\/* ================= \u8bed\u8a00\u80f6\u56ca\u5207\u6362 ================= *\/\n.lang-switch-wrap {\n  margin-top: 30px;\n  padding-top: 20px;\n  border-top: 1px solid #f1f5f9;\n  display: flex;\n  align-items: center;\n  gap: 15px;\n  flex-wrap: wrap;\n}\n\n.lang-label {\n  font-size: 13px;\n  font-weight: 600;\n  color: #64748b;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.lang-pills {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n\n.lang-pill {\n  font-size: 12px;\n  font-weight: 500;\n  color: #64748b !important;\n  background: #f1f5f9;\n  border: 1px solid transparent;\n  padding: 6px 14px;\n  border-radius: 20px;\n  text-decoration: none !important;\n  transition: all 0.2s ease;\n}\n\n.lang-pill:hover {\n  color: #0f172a !important;\n  background: #e2e8f0;\n}\n\n.lang-pill.active {\n  color: #ffffff !important;\n  background: var(--brand-green);\n  font-weight: 600;\n  box-shadow: 0 2px 8px rgba(130, 216, 55, 0.3);\n}\n\n\/* ================= \u79fb\u52a8\u7aef\u9002\u914d ================= *\/\n@media (max-width: 640px) {\n  .track-container {\n    padding: 20px 16px;\n    border-radius: 16px;\n  }\n  \n  .track-form {\n    flex-direction: column;\n  }\n\n  .track-button {\n    justify-content: center;\n    width: 100%;\n  }\n\n  .lang-switch-wrap {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n}\n<\/style>\n\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-72","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/pages\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/comments?post=72"}],"version-history":[{"count":0,"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/pages\/72\/revisions"}],"wp:attachment":[{"href":"https:\/\/bangblazevape.com\/wp-json\/wp\/v2\/media?parent=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}