{"id":1241,"date":"2025-01-14T21:16:17","date_gmt":"2025-01-14T13:16:17","guid":{"rendered":"https:\/\/wadevape.com\/?page_id=1241"},"modified":"2026-09-17T16:13:53","modified_gmt":"2026-09-17T08:13:53","slug":"package-tracking","status":"publish","type":"page","link":"https:\/\/wadevape.com\/package-tracking\/","title":{"rendered":"Package Tracking"},"content":{"rendered":"\n\n\t<section class=\"section\" id=\"section_1907395379\">\n\t\t<div class=\"section-bg fill\" >\n\t\t\t\t\t\t\t\t\t<div class=\"effect-sparkle bg-effect fill no-click\"><\/div>\n\t\t\t\n\n\t\t<\/div>\n\n\t\t\n\n\t\t<div class=\"section-content relative\">\n\t\t\t\n\n<div class=\"row\"  id=\"row-1382755990\">\n\n\n\t<div id=\"col-502454234\" class=\"col medium-6 small-12 large-6\"  >\n\t\t\t\t<div class=\"col-inner\"  >\n\t\t\t\n\t\t\t\n\n<h2><strong>Logistics tracking number:<\/strong><\/h2>\n\n\n\n    <div class=\"logistics-tracking\">\n\n        <div class=\"track-main\">\n            <div class=\"track-form\">\n                <input\n                    type=\"text\"\n                    class=\"track-input\"\n                    placeholder=\"Please fill in Logistics tracking number\"\n                \/>\n                <span class=\"track-button\">Track<\/span>\n            <\/div>\n        <\/div>\n\n        <div class=\"tracking-results track-result\"><\/div>\n\n        <div class=\"lang-switch\">\n            <span>Language: <\/span>\n            <a href=\"#\" data-lang=\"english\">English<\/a> |\n            <a href=\"#\" data-lang=\"deutsch\">Deutsch<\/a> |\n            <a href=\"#\" data-lang=\"french\">Fran\u00e7ais<\/a> |\n            <a href=\"#\" data-lang=\"spanish\">Espa\u00f1ol<\/a> |\n            <a href=\"#\" data-lang=\"italian\">Italiano<\/a> |\n            <a href=\"#\" data-lang=\"swedish\">Svenska<\/a> |\n            <a href=\"#\" data-lang=\"dutch\">Nederlands<\/a> |\n            <a href=\"#\" data-lang=\"japanese\">\u65e5\u672c\u8a9e<\/a> |\n            <a href=\"#\" data-lang=\"chinese_simplified\">\u7b80\u4f53\u4e2d\u6587<\/a>\n        <\/div>\n\n    <\/div>\n\n    <script>\n    (function () {\n\n        function initTracking(container) {\n\n            if (!container || container.dataset.initialized === '1') {\n                return;\n            }\n\n            container.dataset.initialized = '1';\n\n            const input = container.querySelector('.track-input');\n            const button = container.querySelector('.track-button');\n            const results = container.querySelector('.tracking-results');\n\n            let rawTrackingData = [];\n\n            \/*\n             * \u8bed\u8a00\u4ee3\u7801\u89c4\u8303\u5316\n             *\/\n            function normalizeLangCode(lang) {\n                if (!lang) return 'en';\n\n                if (lang === 'zh-Hans') return 'zh-CN';\n                if (lang === 'zh-Hant') return 'zh-TW';\n\n                return lang;\n            }\n\n            \/*\n             * \u968f\u673a\u90ae\u7bb1\n             *\/\n            function getRandomEmail() {\n                const rand = Math.random()\n                    .toString(36)\n                    .substring(2, 10);\n\n                return `user_${rand}@gmail.com`;\n            }\n\n            \/*\n             * \u83b7\u53d6\u521d\u59cb\u8bed\u8a00\n             *\n             * LocalStorage > HTML lang > \u4e2d\u6587\n             *\/\n            function getInitialLang() {\n\n                const savedLang =\n                    localStorage.getItem('SelectedLanguage');\n\n                if (savedLang) {\n                    return savedLang;\n                }\n\n                const htmlLang =\n                    document.documentElement.lang.toLowerCase();\n\n                if (htmlLang.startsWith('zh')) {\n                    return 'zh-Hans';\n                }\n\n                if (htmlLang.startsWith('en')) {\n                    return 'en';\n                }\n\n                return htmlLang.split('-')[0] || 'zh-Hans';\n            }\n\n            let currentLanguage = getInitialLang();\n\n            \/*\n             * Google GTX\n             *\/\n            async function translateWithGoogleBrowser(text, targetLang) {\n\n                const gLang = normalizeLangCode(targetLang);\n\n                const url =\n                    `https:\/\/translate.googleapis.com\/translate_a\/single?client=gtx&dt=t&sl=auto&tl=${gLang}&q=${encodeURIComponent(text)}`;\n\n                const response = await fetch(url);\n\n                if (!response.ok) {\n                    throw new Error(\n                        `Google GTX status: ${response.status}`\n                    );\n                }\n\n                const data = await response.json();\n\n                if (\n                    Array.isArray(data) &&\n                    Array.isArray(data[0])\n                ) {\n                    return data[0]\n                        .map(item => item[0] || '')\n                        .join('');\n                }\n\n                throw new Error('Invalid Google GTX response');\n            }\n\n            \/*\n             * MyMemory\n             *\/\n            async function translateWithMyMemoryBrowser(\n                text,\n                targetLang\n            ) {\n\n                const mLang = normalizeLangCode(targetLang);\n\n                const email = getRandomEmail();\n\n                const url =\n                    `https:\/\/api.mymemory.translated.net\/get?q=${encodeURIComponent(text)}&langpair=auto|${mLang}&de=${encodeURIComponent(email)}`;\n\n                const response = await fetch(url);\n\n                if (!response.ok) {\n                    throw new Error(\n                        `MyMemory status: ${response.status}`\n                    );\n                }\n\n                const data = await response.json();\n\n                if (\n                    data &&\n                    data.responseData &&\n                    typeof data.responseData.translatedText === 'string' &&\n                    data.responseStatus !== 429\n                ) {\n                    return data.responseData.translatedText;\n                }\n\n                throw new Error(\n                    `MyMemory error: ${\n                        data?.responseStatus || response.status\n                    }`\n                );\n            }\n\n            \/*\n             * \u7ffb\u8bd1\n             *\/\n            async function translateTexts(texts) {\n\n                if (\n                    currentLanguage === 'zh-Hans' ||\n                    !texts ||\n                    !texts.length\n                ) {\n                    return texts;\n                }\n\n                try {\n\n                    const textToTranslate =\n                        texts.join('\\n');\n\n                    let translatedText = '';\n\n                    \/*\n                     * Google \u4f18\u5148\n                     *\/\n                    try {\n\n                        translatedText =\n                            await translateWithGoogleBrowser(\n                                textToTranslate,\n                                currentLanguage\n                            );\n\n                    } catch (googleErr) {\n\n                        console.warn(\n                            'Google translation failed, using MyMemory:',\n                            googleErr\n                        );\n\n                        \/*\n                         * MyMemory \u5907\u7528\n                         *\/\n                        try {\n\n                            translatedText =\n                                await translateWithMyMemoryBrowser(\n                                    textToTranslate,\n                                    currentLanguage\n                                );\n\n                        } catch (myMemoryErr) {\n\n                            console.warn(\n                                'MyMemory translation failed:',\n                                myMemoryErr\n                            );\n\n                            translatedText = textToTranslate;\n                        }\n                    }\n\n                    const translatedLines =\n                        translatedText.split('\\n');\n\n                    return texts.map(\n                        (original, idx) =>\n                            translatedLines[idx] || original\n                    );\n\n                } catch (e) {\n\n                    console.error(\n                        'Translation error:',\n                        e\n                    );\n\n                    return texts;\n                }\n            }\n\n            \/*\n             * URL \u94fe\u63a5\u8bc6\u522b\n             *\/\n            function addLinks(text) {\n\n                if (!text) {\n                    return '';\n                }\n\n                const regex =\n                    \/(https?:\\\/\\\/[^\\s]+)\/g;\n\n                return text.replace(\n                    regex,\n                    function (match) {\n\n                        return `\n                            <a\n                                style=\"color:#17EF97;\"\n                                href=\"${match}\"\n                                target=\"_blank\"\n                                rel=\"noopener noreferrer\"\n                            >${match}<\/a>\n                        `;\n                    }\n                );\n            }\n\n            \/*\n             * HTML \u8f6c\u4e49\n             *\/\n            function escapeHtml(value) {\n\n                if (value === null || value === undefined) {\n                    return '';\n                }\n\n                return String(value)\n                    .replace(\/&\/g, '&amp;')\n                    .replace(\/<\/g, '&lt;')\n                    .replace(\/>\/g, '&gt;')\n                    .replace(\/\"\/g, '&quot;')\n                    .replace(\/'\/g, '&#039;');\n            }\n\n            \/*\n             * \u6e32\u67d3\u7269\u6d41\u8bb0\u5f55\n             *\/\n            async function renderAndTranslate(list) {\n\n                results.classList.add('has-data');\n\n                let html =\n                    '<ul class=\"track-list\">';\n\n                list.forEach(function (item, index) {\n\n                    html += `\n                        <li class=\"track-item\">\n\n                            <div class=\"track-dot\"><\/div>\n\n                            <span class=\"track-time\">\n                                ${escapeHtml(item.time || '')}\n                            <\/span>\n\n                            <span\n                                class=\"track-location\"\n                                data-location-index=\"${index}\"\n                            >\n                                ${currentLanguage === 'zh-Hans'\n                                    ? ''\n                                    : '...'}\n                            <\/span>\n\n                            <span\n                                class=\"track-detail\"\n                                data-detail-index=\"${index}\"\n                            >\n                                ${currentLanguage === 'zh-Hans'\n                                    ? ''\n                                    : 'Translating...'}\n                            <\/span>\n\n                        <\/li>\n                    `;\n                });\n\n                html += '<\/ul>';\n\n                results.innerHTML = html;\n\n                \/*\n                 * \u63d0\u53d6\u9700\u8981\u7ffb\u8bd1\u7684\u6570\u636e\n                 *\/\n                const textsToTranslate =\n                    list.flatMap(function (item) {\n\n                        return [\n                            item.location || '',\n                            item.detail || ''\n                        ];\n\n                    });\n\n                const translatedResults =\n                    await translateTexts(\n                        textsToTranslate\n                    );\n\n                \/*\n                 * \u56de\u586b\u7ffb\u8bd1\n                 *\/\n                list.forEach(function (_, index) {\n\n                    const locIdx = index * 2;\n                    const detIdx = index * 2 + 1;\n\n                    const location =\n                        results.querySelector(\n                            `[data-location-index=\"${index}\"]`\n                        );\n\n                    const detail =\n                        results.querySelector(\n                            `[data-detail-index=\"${index}\"]`\n                        );\n\n                    if (location) {\n                        location.textContent =\n                            translatedResults[locIdx] || '';\n                    }\n\n                    if (detail) {\n                        detail.innerHTML =\n                            addLinks(\n                                translatedResults[detIdx] || ''\n                            );\n                    }\n\n                });\n            }\n\n            \/*\n             * \u67e5\u8be2\u7269\u6d41\n             *\/\n            function performTrackingQuery(no) {\n\n                if (!no) {\n                    return;\n                }\n\n                results.classList.add('is-loading');\n\n                results.innerHTML = `\n                    <div class=\"skeleton-container\">\n                        <div class=\"skeleton-item\"><\/div>\n                        <div class=\"skeleton-item\"><\/div>\n                        <div class=\"skeleton-item\"><\/div>\n                    <\/div>\n                `;\n\n                button.classList.add('disabled');\n                button.textContent = '...';\n\n                fetch(\n                    '\/wp-json\/api\/v1\/tracking\/' +\n                    encodeURIComponent(no),\n                    {\n                        method: 'GET',\n                        headers: {\n                            'Accept': 'application\/json'\n                        }\n                    }\n                )\n                .then(function (response) {\n\n                    if (!response.ok) {\n                        throw new Error(\n                            'HTTP ' + response.status\n                        );\n                    }\n\n                    return response.json();\n                })\n                .then(function (response) {\n\n                    setTimeout(function () {\n\n                        button.classList.remove('disabled');\n                        button.textContent = 'Track';\n\n                        try {\n\n                            const list =\n                                typeof response === 'string'\n                                    ? JSON.parse(response)\n                                    : response;\n\n                            rawTrackingData = list;\n\n                            results.classList.remove(\n                                'is-loading'\n                            );\n\n                            if (\n                                !Array.isArray(list) ||\n                                list.length === 0\n                            ) {\n\n                                results.innerHTML = `\n                                    <p>\n                                        No records found.\n                                    <\/p>\n                                `;\n\n                            } else {\n\n                                renderAndTranslate(list);\n                            }\n\n                        } catch (e) {\n\n                            console.error(e);\n\n                            results.innerHTML = `\n                                <p>\n                                    Data format error.\n                                <\/p>\n                            `;\n                        }\n\n                    }, 300);\n                })\n                .catch(function (error) {\n\n                    console.error(\n                        'Tracking request failed:',\n                        error\n                    );\n\n                    button.classList.remove('disabled');\n                    button.textContent = 'Track';\n\n                    results.classList.remove(\n                        'is-loading'\n                    );\n\n                    results.innerHTML = `\n                        <p>\n                            Network Error.\n                        <\/p>\n                    `;\n                });\n            }\n\n            \/*\n             * \u67e5\u8be2\u6309\u94ae\n             *\/\n            button.addEventListener(\n                'click',\n                function () {\n\n                    const no =\n                        input.value.trim();\n\n                    if (no) {\n                        performTrackingQuery(no);\n                    }\n                }\n            );\n\n            \/*\n             * Enter \u67e5\u8be2\n             *\/\n            input.addEventListener(\n                'keypress',\n                function (e) {\n\n                    if (e.key === 'Enter') {\n\n                        e.preventDefault();\n\n                        button.click();\n                    }\n                }\n            );\n\n            \/*\n             * \u8bed\u8a00\u5207\u6362\n             *\/\n            container\n                .querySelectorAll('.lang-switch a')\n                .forEach(function (link) {\n\n                    link.addEventListener(\n                        'click',\n                        function (e) {\n\n                            e.preventDefault();\n\n                            const langKey =\n                                this.dataset.lang;\n\n                            const languageMap = {\n\n                                chinese_simplified:\n                                    'zh-Hans',\n\n                                english:\n                                    'en',\n\n                                deutsch:\n                                    'de',\n\n                                french:\n                                    'fr',\n\n                                spanish:\n                                    'es',\n\n                                italian:\n                                    'it',\n\n                                swedish:\n                                    'sv',\n\n                                dutch:\n                                    'nl',\n\n                                japanese:\n                                    'ja'\n                            };\n\n                            currentLanguage =\n                                languageMap[langKey] || 'en';\n\n                            localStorage.setItem(\n                                'SelectedLanguage',\n                                currentLanguage\n                            );\n\n                            \/*\n                             * \u5982\u679c\u5df2\u7ecf\u67e5\u8be2\u8fc7\uff0c\n                             * \u76f4\u63a5\u91cd\u65b0\u7ffb\u8bd1\n                             *\/\n                            if (\n                                rawTrackingData.length > 0\n                            ) {\n\n                                renderAndTranslate(\n                                    rawTrackingData\n                                );\n                            }\n                        }\n                    );\n                });\n\n            \/*\n             * \u81ea\u52a8\u8bfb\u53d6 URL \u53c2\u6570\n             *\n             * ?no=123456\n             *\/\n            const params =\n                new URLSearchParams(\n                    window.location.search\n                );\n\n            const sn =\n                params.get('no');\n\n            if (sn) {\n\n                input.value = sn;\n\n                performTrackingQuery(sn);\n            }\n        }\n\n        \/*\n         * \u521d\u59cb\u5316\u5f53\u524d Shortcode\n         *\/\n        function initAllTracking() {\n\n            document\n                .querySelectorAll('.logistics-tracking')\n                .forEach(initTracking);\n        }\n\n        if (\n            document.readyState === 'loading'\n        ) {\n\n            document.addEventListener(\n                'DOMContentLoaded',\n                initAllTracking\n            );\n\n        } else {\n\n            initAllTracking();\n        }\n\n    })();\n    <\/script>\n\n    <style>\n        .logistics-tracking .lang-switch a {\n            color: #2196F3 !important;\n        }\n\n        .logistics-tracking .lang-switch {\n            margin: 10px 0;\n        }\n\n        .logistics-tracking .track-form {\n            display: flex;\n            width: 100%;\n        }\n\n        .logistics-tracking .track-input {\n            width: 100%;\n            height: 50px;\n            margin: 0;\n            border: 1px solid #f4f4f4;\n            padding: 0 15px;\n            font-size: 16px;\n            outline: none;\n            box-sizing: border-box;\n        }\n\n        .logistics-tracking .track-button {\n            background: #17ef97;\n            height: 50px;\n            padding: 0 50px;\n            color: #000;\n            font-weight: 500;\n            line-height: 50px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            white-space: nowrap;\n            transition: .2s;\n            user-select: none;\n        }\n\n        .logistics-tracking .track-button:hover {\n            opacity: .85;\n        }\n\n        .logistics-tracking .track-button.disabled {\n            opacity: .5;\n            pointer-events: none;\n        }\n\n        .logistics-tracking .track-list {\n            padding: 0;\n            margin: 20px 0 0;\n            list-style: none;\n        }\n\n        .logistics-tracking .track-list li {\n            padding: 12px 15px 12px 45px;\n            border-bottom: 1px solid #EBEAEB;\n            font-size: 16px;\n            position: relative;\n            line-height: 1.6;\n        }\n\n        .logistics-tracking .track-list li::before {\n            content: \"\";\n            width: 10px;\n            height: 10px;\n            border-radius: 50%;\n            background: #a4a4a4;\n            position: absolute;\n            left: 5px;\n            top: 20px;\n        }\n\n        .logistics-tracking .track-list li:first-child::before {\n            background: #17ef97;\n            animation: logisticsGlowGreen 1.5s ease-in-out infinite;\n        }\n\n        .logistics-tracking .track-list li:not(:last-child)::after {\n            content: \"\";\n            position: absolute;\n            width: 1px;\n            background: #ddd;\n            left: 9px;\n            top: 30px;\n            bottom: -12px;\n        }\n\n        .logistics-tracking .track-list .track-time {\n            display: block;\n            font-weight: bold;\n            color: #333;\n        }\n\n        .logistics-tracking .track-list .track-location {\n            display: block;\n            color: #555;\n            margin-top: 2px;\n        }\n\n        .logistics-tracking .track-list .track-detail {\n            display: block;\n            margin-top: 5px;\n            word-break: break-word;\n            white-space: pre-wrap;\n        }\n\n        .logistics-tracking .track-list .track-detail a {\n            color: #00c7ff !important;\n            text-decoration: none;\n        }\n\n        .logistics-tracking .track-result p {\n            padding: 15px;\n        }\n\n        .logistics-tracking .skeleton-container {\n            margin-top: 20px;\n        }\n\n        .logistics-tracking .skeleton-item {\n            height: 60px;\n            margin-bottom: 10px;\n            background: linear-gradient(\n                90deg,\n                #f4f4f4 25%,\n                #e9e9e9 37%,\n                #f4f4f4 63%\n            );\n            background-size: 400% 100%;\n            animation: logisticsSkeleton 1.4s ease infinite;\n        }\n\n        @keyframes logisticsSkeleton {\n            0% {\n                background-position: 100% 0;\n            }\n\n            100% {\n                background-position: -100% 0;\n            }\n        }\n\n        @keyframes logisticsGlowGreen {\n\n            0% {\n                box-shadow:\n                    0 0 5px #17ef97,\n                    0 0 15px #17ef97;\n            }\n\n            50% {\n                box-shadow:\n                    0 0 10px #17ef97,\n                    0 0 25px #17ef97,\n                    0 0 35px #17ef97;\n            }\n\n            100% {\n                box-shadow:\n                    0 0 5px #17ef97,\n                    0 0 15px #17ef97;\n            }\n        }\n\n        @media (max-width: 768px) {\n\n            .logistics-tracking .track-form {\n                flex-direction: row;\n            }\n\n            .logistics-tracking .track-input {\n                font-size: 14px;\n            }\n\n            .logistics-tracking .track-button {\n                padding: 0 25px;\n                font-size: 14px;\n            }\n\n            .logistics-tracking .track-list li {\n                font-size: 14px;\n                padding-left: 35px;\n            }\n\n            .logistics-tracking .track-list li::before {\n                left: 3px;\n            }\n        }\n    <\/style>\n\n    \n\n\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\n\n\t<div id=\"col-1489793009\" class=\"col medium-6 small-12 large-6\"  >\n\t\t\t\t<div class=\"col-inner\"  >\n\t\t\t\n\t\t\t\n\n<h2 class=\"text-lg mb-2\"><strong>&#8211; FAQ:<\/strong><\/h2>\n<ul>\n<li class=\"mb-4\"><b>Why can&#8217;t I check the logistics information?<\/b>\n<p class=\"opacity-80\">The tracking number is wrong or the courier has just been sent out and the courier company hasn&#8217;t updated it yet.<\/p>\n<\/li>\n<li class=\"mb-4\"><b>How long does shipping take?<\/b>\n<p class=\"opacity-80\">This is usually 7-15 working days, and may take up to 20 working days during public holidays or inclement weather conditions.<\/p>\n<\/li>\n<li class=\"mb-4\"><b>Why does the state stay the same?<\/b>\n<p class=\"opacity-80\">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><b>Signed for, but not received?<\/b>\n<p class=\"opacity-80\">Please contact our customer service.<\/p>\n<\/li>\n<\/ul>\n\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\n\n\n<style>\n#row-1382755990 > .col > .col-inner {\n  padding: 0px 0px 600px 0px;\n}\n<\/style>\n<\/div>\n\n\t\t<\/div>\n\n\t\t\n<style>\n#section_1907395379 {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  background-color: rgb(200, 230, 250);\n}\n<\/style>\n\t<\/section>\n\t\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":{"footnotes":""},"class_list":["post-1241","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/pages\/1241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/comments?post=1241"}],"version-history":[{"count":58,"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/pages\/1241\/revisions"}],"predecessor-version":[{"id":10360,"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/pages\/1241\/revisions\/10360"}],"wp:attachment":[{"href":"https:\/\/wadevape.com\/wp-json\/wp\/v2\/media?parent=1241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}