{"id":3833,"date":"2022-04-18T07:18:40","date_gmt":"2022-04-18T07:18:40","guid":{"rendered":"https:\/\/demo2wpopal.b-cdn.net\/digitaz\/?page_id=3833"},"modified":"2026-09-17T08:16:21","modified_gmt":"2026-09-17T08:16:21","slug":"order-tracking","status":"publish","type":"page","link":"https:\/\/bangkingvapes.com\/order-tracking\/","title":{"rendered":"Order Tracking"},"content":{"rendered":"\n<div class=\"row\"  id=\"row-1668316631\">\n\n\n\t<div id=\"col-862689087\" class=\"col small-12 large-12\"  >\n\t\t\t\t<div class=\"col-inner\"  >\n\t\t\t\n\t\t\t\n\n\n\n\n    <style>\n        #bkv-logistics-tracking {\n            --primary: #000;\n            --accent: #00c29a;\n            --background: #f7f7f7;\n            --card-bg: #fff;\n            width: 100%;\n            font-family: Arial, sans-serif;\n            color: #333;\n            padding: 20px;\n            box-sizing: border-box;\n        }\n\n        #bkv-logistics-tracking,\n        #bkv-logistics-tracking * {\n            box-sizing: border-box;\n        }\n\n        #bkv-logistics-tracking .track-main {\n            width: 100%;\n            max-width: 1200px;\n            padding: 20px;\n            background-color: var(--card-bg);\n            border-radius: 10px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n            margin: 0 auto 40px auto;\n        }\n\n        #bkv-logistics-tracking .track-title {\n            font-size: 20px;\n            margin-bottom: 16px;\n            color: #222;\n        }\n\n        #bkv-logistics-tracking .track-form {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n            height: auto;\n        }\n\n        #bkv-logistics-tracking .track-input {\n            flex: 1 1 250px;\n            padding: 0 16px;\n            height: 55px;\n            font-size: 16px;\n            border: 1px solid #ccc;\n            border-radius: 6px;\n            background-color: var(--card-bg);\n            color: #333;\n        }\n\n        #bkv-logistics-tracking .track-button {\n            height: 55px;\n            padding: 0 24px;\n            font-size: 16px;\n            font-weight: bold;\n            color: #fff;\n            background-color: var(--primary);\n            border: none;\n            border-radius: 6px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        #bkv-logistics-tracking .track-button:hover {\n            background-color: #222;\n        }\n\n        #bkv-logistics-tracking .lang-switch {\n            text-align: center;\n            margin: 20px 0;\n            font-size: 14px;\n            color: #888;\n        }\n\n        #bkv-logistics-tracking .lang-switch a {\n            color: #007bff;\n            margin: 0 5px;\n            text-decoration: none;\n            cursor: pointer;\n        }\n\n        #bkv-logistics-tracking .lang-switch a:hover {\n            text-decoration: underline;\n        }\n\n        #bkv-logistics-tracking .content-row {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 40px;\n            max-width: 1200px;\n            margin: 0 auto;\n            align-items: flex-start;\n        }\n\n        #bkv-logistics-tracking .track-result {\n            flex: 1 1 60%;\n            min-width: 300px;\n        }\n\n        #bkv-logistics-tracking .timeline {\n            position: relative;\n            padding: 20px 0;\n        }\n\n        #bkv-logistics-tracking .timeline::before {\n            content: '';\n            position: absolute;\n            left: 50%;\n            top: 0;\n            bottom: 0;\n            width: 4px;\n            background: #e0e0e0;\n            transform: translateX(-50%);\n        }\n\n        #bkv-logistics-tracking .timeline-item {\n            position: relative;\n            width: 50%;\n            padding: 0 30px;\n            margin-bottom: 30px;\n        }\n\n        #bkv-logistics-tracking .timeline-item .content {\n            background: var(--card-bg);\n            padding: 20px;\n            border-radius: 12px;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.12);\n            position: relative;\n        }\n\n        #bkv-logistics-tracking .timeline-item .icon {\n            position: absolute;\n            top: 30px;\n            width: 20px;\n            height: 20px;\n            border-radius: 50%;\n            border: 3px solid #fff;\n            z-index: 2;\n            background-color: #ccc;\n            transition: background-color 0.3s;\n        }\n\n        #bkv-logistics-tracking .icon-current {\n            background-color: var(--accent);\n        }\n\n        #bkv-logistics-tracking .timeline-item.left {\n            left: 0;\n            text-align: right;\n        }\n\n        #bkv-logistics-tracking .timeline-item.left .icon {\n            right: -12px;\n        }\n\n        #bkv-logistics-tracking .timeline-item.right {\n            left: 50%;\n            text-align: left;\n        }\n\n        #bkv-logistics-tracking .timeline-item.right .icon {\n            left: -12px;\n        }\n\n        #bkv-logistics-tracking .timeline-item .time {\n            font-size: 14px;\n            color: #666;\n            margin-bottom: 8px;\n        }\n\n        #bkv-logistics-tracking .timeline-item .location {\n            font-size: 18px;\n            font-weight: 700;\n            margin-bottom: 10px;\n        }\n\n        #bkv-logistics-tracking .timeline-item .detail {\n            font-size: 15px;\n            line-height: 1.5;\n            color: #444;\n        }\n\n        #bkv-logistics-tracking .right-panel {\n            flex: 1 1 35%;\n            max-width: 400px;\n            background: var(--card-bg);\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n        }\n\n        #bkv-logistics-tracking .faq-list {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n        }\n\n        #bkv-logistics-tracking .faq-list li {\n            position: relative;\n            padding-left: 24px;\n            margin-bottom: 20px;\n            color: #333;\n        }\n\n        #bkv-logistics-tracking .faq-list li::before {\n            content: '';\n            position: absolute;\n            left: 0;\n            top: 6px;\n            width: 12px;\n            height: 12px;\n            background-color: #e74c3c;\n            border-radius: 50%;\n        }\n\n        #bkv-logistics-tracking .faq-list li strong {\n            font-size: 16px;\n            color: #c0392b;\n            margin-bottom: 6px;\n            display: block;\n        }\n\n        #bkv-logistics-tracking .faq-list li p {\n            font-size: 15px;\n            margin: 0;\n        }\n\n        @media (max-width: 900px) {\n            #bkv-logistics-tracking {\n                padding: 12px;\n            }\n\n            #bkv-logistics-tracking .content-row {\n                flex-direction: column;\n            }\n\n            #bkv-logistics-tracking .right-panel {\n                width: 100%;\n                max-width: none;\n            }\n\n            #bkv-logistics-tracking .timeline::before {\n                left: 20px;\n                transform: none;\n            }\n\n            #bkv-logistics-tracking .timeline-item {\n                width: 100% !important;\n                padding-left: 50px;\n                padding-right: 20px;\n                margin-bottom: 25px;\n            }\n\n            #bkv-logistics-tracking .timeline-item.left,\n            #bkv-logistics-tracking .timeline-item.right {\n                left: 0 !important;\n                text-align: left !important;\n            }\n\n            #bkv-logistics-tracking .timeline-item .icon {\n                left: 10px !important;\n                right: auto !important;\n            }\n        }\n    <\/style>\n\n    <div id=\"bkv-logistics-tracking\">\n        <div class=\"track-main\">\n            <h6 class=\"track-title\">Logistics tracking number:<\/h6>\n            <div class=\"track-form\">\n                <input id=\"inputNo\" class=\"track-input\" placeholder=\"Please fill in Logistics tracking number\" type=\"text\" \/>\n                <button id=\"checkButton\" class=\"track-button\" type=\"button\">Track<\/button>\n            <\/div>\n        <\/div>\n\n        <div class=\"lang-switch\">\n            <span>Language: <\/span>\n            <a href=\"#\" data-language=\"english\">English<\/a> |\n            <a href=\"#\" data-language=\"deutsch\">Deutsch<\/a> |\n            <a href=\"#\" data-language=\"french\">Fran\u00e7ais<\/a> |\n            <a href=\"#\" data-language=\"spanish\">Espa\u00f1ol<\/a> |\n            <a href=\"#\" data-language=\"italian\">Italiano<\/a> |\n            <a href=\"#\" data-language=\"swedish\">Svenska<\/a> |\n            <a href=\"#\" data-language=\"dutch\">Nederlands<\/a> |\n            <a href=\"#\" data-language=\"chinese_simplified\">\u7b80\u4f53\u4e2d\u6587<\/a>\n        <\/div>\n\n        <div class=\"content-row\">\n            <div id=\"trackingResults\" class=\"track-result\"><\/div>\n\n            <div class=\"right-panel\">\n                <h3>\u2013 FAQS:<\/h3>\n                <ul class=\"faq-list\">\n                    <li>\n                        <strong>Why can\u2019t I check the logistics information?<\/strong>\n                        <p>The tracking number is wrong or the courier has just been sent out and the courier company hasn\u2019t updated it yet.<\/p>\n                    <\/li>\n                    <li>\n                        <strong>How long does shipping take?<\/strong>\n                        <p>This is usually 7\u201315 working days, and may take up to 20 working days during public holidays or inclement weather conditions.<\/p>\n                    <\/li>\n                    <li>\n                        <strong>Why does the state stay the same?<\/strong>\n                        <p>Please be patient as it may be due to public holidays, fewer flights, very high volume of cargo, or strict customs regulations.<\/p>\n                    <\/li>\n                    <li>\n                        <strong>Signed for, but not received?<\/strong>\n                        <p>Please contact our customer service.<\/p>\n                    <\/li>\n                <\/ul>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n    (function () {\n        'use strict';\n\n        const root = document.getElementById('bkv-logistics-tracking');\n        if (!root || root.dataset.initialized === '1') {\n            return;\n        }\n        root.dataset.initialized = '1';\n\n        const inputNo = root.querySelector('#inputNo');\n        const checkButton = root.querySelector('#checkButton');\n        const trackingResults = root.querySelector('#trackingResults');\n\n        let currentLanguage = localStorage.getItem('SelectedLanguage') || 'en';\n        let rawTrackingData = [];\n\n        function normalizeLangCode(lang) {\n            if (!lang) return 'en';\n            if (lang === 'zh-Hans') return 'zh-CN';\n            if (lang === 'zh-Hant') return 'zh-TW';\n            return lang;\n        }\n\n        function updateTrackingUrl(trackingNumber) {\n            const url = new URL(window.location.href);\n            url.searchParams.set('no', trackingNumber);\n            history.pushState({}, '', url.href);\n        }\n\n        function setTextWithLinks(element, text) {\n            if (!element) return;\n\n            element.textContent = '';\n            const value = String(text || '');\n            const regex = new RegExp('https?:\/\/[^\\\\s<]+', 'g');\n            let lastIndex = 0;\n            let match;\n\n            while ((match = regex.exec(value)) !== null) {\n                if (match.index > lastIndex) {\n                    element.appendChild(document.createTextNode(value.slice(lastIndex, match.index)));\n                }\n\n                const link = document.createElement('a');\n                link.style.color = 'blue';\n                link.href = match[0];\n                link.target = '_blank';\n                link.rel = 'noopener noreferrer';\n                link.textContent = match[0];\n                element.appendChild(link);\n\n                lastIndex = regex.lastIndex;\n            }\n\n            if (lastIndex < value.length) {\n                element.appendChild(document.createTextNode(value.slice(lastIndex)));\n            }\n        }\n\n        function getRandomEmail() {\n            const rand = Math.random().toString(36).substring(2, 10);\n            return 'user_' + rand + '@gmail.com';\n        }\n\n        async function translateWithGoogleBrowser(text, targetLang) {\n            const lang = normalizeLangCode(targetLang);\n            const url = 'https:\/\/translate.googleapis.com\/translate_a\/single?client=gtx&dt=t&sl=auto&tl=' +\n                encodeURIComponent(lang) + '&q=' + encodeURIComponent(text);\n\n            const response = await fetch(url);\n            if (!response.ok) {\n                throw new Error('Google Translate Error');\n            }\n\n            const data = await response.json();\n            if (Array.isArray(data) && Array.isArray(data[0])) {\n                return data[0].map(function (item) {\n                    return item[0] || '';\n                }).join('');\n            }\n\n            throw new Error('Google Response Error');\n        }\n\n        async function translateWithMyMemoryBrowser(text, targetLang) {\n            const lang = normalizeLangCode(targetLang);\n            const email = getRandomEmail();\n            const url = 'https:\/\/api.mymemory.translated.net\/get?q=' + encodeURIComponent(text) +\n                '&langpair=auto|' + encodeURIComponent(lang) +\n                '&de=' + encodeURIComponent(email);\n\n            const response = await fetch(url);\n            const data = await response.json();\n\n            if (\n                data &&\n                data.responseData &&\n                data.responseData.translatedText &&\n                data.responseStatus !== 429\n            ) {\n                return data.responseData.translatedText;\n            }\n\n            throw new Error('MyMemory Error');\n        }\n\n        async function translateTexts(texts) {\n            if (currentLanguage === 'en' || !texts || texts.length === 0) {\n                return texts;\n            }\n\n            try {\n                const source = texts.join('\\n');\n                let result = '';\n\n                try {\n                    result = await translateWithGoogleBrowser(source, currentLanguage);\n                } catch (error) {\n                    console.warn('Google failed, use MyMemory');\n                    result = await translateWithMyMemoryBrowser(source, currentLanguage);\n                }\n\n                const lines = result.split('\\n');\n                return texts.map(function (item, index) {\n                    return lines[index] || item;\n                });\n            } catch (error) {\n                console.error('Translation Error:', error);\n                return texts;\n            }\n        }\n\n        async function translateAndUpdateBatch(list) {\n            try {\n                const textsToTranslate = list.flatMap(function (item) {\n                    return [item.location || '---', item.detail || '---'];\n                });\n\n                const translatedTexts = await translateTexts(textsToTranslate);\n\n                list.forEach(function (item, index) {\n                    const locationEl = root.querySelector('#location-' + index);\n                    const detailEl = root.querySelector('#detail-' + index);\n\n                    if (locationEl) {\n                        locationEl.textContent = translatedTexts[index * 2] || '';\n                    }\n\n                    setTextWithLinks(detailEl, translatedTexts[index * 2 + 1] || '');\n                });\n            } catch (error) {\n                console.error(error);\n\n                list.forEach(function (item, index) {\n                    const locationEl = root.querySelector('#location-' + index);\n                    const detailEl = root.querySelector('#detail-' + index);\n\n                    if (locationEl) {\n                        locationEl.textContent = item.location || '';\n                    }\n\n                    setTextWithLinks(detailEl, item.detail || '');\n                });\n            }\n        }\n\n        function renderTrackingList(list) {\n            trackingResults.textContent = '';\n\n            const ul = document.createElement('ul');\n            ul.className = 'track-list';\n\n            list.forEach(function (item, index) {\n                const li = document.createElement('li');\n                li.id = 'track-item-' + index;\n\n                const time = document.createElement('span');\n                time.className = 'time';\n                time.textContent = item.time || '';\n\n                const location = document.createElement('span');\n                location.className = 'location';\n                location.id = 'location-' + index;\n                location.textContent = 'Translating...';\n\n                const detail = document.createElement('span');\n                detail.className = 'detail';\n                detail.id = 'detail-' + index;\n                detail.textContent = 'Translating...';\n\n                li.appendChild(time);\n                li.appendChild(location);\n                li.appendChild(detail);\n                ul.appendChild(li);\n            });\n\n            trackingResults.appendChild(ul);\n        }\n\n        async function performTrackingQuery(trackingNumber) {\n            trackingResults.innerHTML = '<p>Checking. Please wait....<\/p>';\n\n            let response;\n\n            try {\n                response = await fetch(\n                    '\/wp-json\/api\/v1\/tracking\/' + encodeURIComponent(trackingNumber),\n                    {\n                        method: 'GET',\n                        credentials: 'same-origin',\n                        headers: {\n                            'Accept': 'application\/json'\n                        }\n                    }\n                );\n\n                if (!response.ok) {\n                    throw new Error('Network Error');\n                }\n            } catch (error) {\n                console.error(error);\n                trackingResults.innerHTML = '<p>Network Error.<\/p>';\n                return;\n            }\n\n            try {\n                const data = await response.json();\n                const list = typeof data === 'string' ? JSON.parse(data) : data;\n\n                if (!Array.isArray(list)) {\n                    throw new Error('Data error');\n                }\n\n                rawTrackingData = list;\n                renderTrackingList(list);\n                await translateAndUpdateBatch(list);\n            } catch (error) {\n                console.error(error);\n                trackingResults.innerHTML = '<p>Data error.<\/p>';\n            }\n        }\n\n        function changeLanguage(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                chinese_simplified: 'zh-Hans'\n            };\n\n            currentLanguage = languageMap[language] || 'en';\n            localStorage.setItem('SelectedLanguage', currentLanguage);\n\n            if (rawTrackingData.length > 0) {\n                root.querySelectorAll('.location').forEach(function (el) {\n                    el.textContent = 'Translating...';\n                });\n\n                root.querySelectorAll('.detail').forEach(function (el) {\n                    el.textContent = 'Translating...';\n                });\n\n                translateAndUpdateBatch(rawTrackingData);\n            }\n        }\n\n        root.querySelectorAll('.lang-switch a[data-language]').forEach(function (link) {\n            link.addEventListener('click', function (event) {\n                event.preventDefault();\n                changeLanguage(link.dataset.language);\n            });\n        });\n\n        checkButton.addEventListener('click', function () {\n            const trackingNumber = inputNo.value.trim();\n\n            if (trackingNumber !== '') {\n                updateTrackingUrl(trackingNumber);\n                performTrackingQuery(trackingNumber);\n            } else {\n                alert('Please enter the tracking number!');\n            }\n        });\n\n        inputNo.addEventListener('keypress', function (event) {\n            if (event.key === 'Enter') {\n                event.preventDefault();\n                checkButton.click();\n            }\n        });\n\n        const urlParams = new URLSearchParams(window.location.search);\n        const trackingNumber = urlParams.get('no');\n\n        if (trackingNumber) {\n            inputNo.value = trackingNumber;\n            performTrackingQuery(trackingNumber);\n        }\n    })();\n    <\/script>\n\n    \n\n\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\n\n\n<style>\n#row-1668316631 > .col > .col-inner {\n  padding: 150px 0px 150px 0px;\n}\n<\/style>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\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":{"footnotes":""},"class_list":["post-3833","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/pages\/3833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/comments?post=3833"}],"version-history":[{"count":0,"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/pages\/3833\/revisions"}],"wp:attachment":[{"href":"https:\/\/bangkingvapes.com\/wp-json\/wp\/v2\/media?parent=3833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}