جستجوی هوشمند سفارشات ووکامرس با موبایل، ایمیل یا شماره سفارش

آیا مشتریان شما شماره سفارش خود را گم می‌کنند؟ با این کد حرفه‌دی، آن‌ها می‌توانند سفارش خود را فقط با موبایل، ایمیل یا شماره سفارش پیدا کنند.

✅ چرا این کد را نصب کنید؟

  • کاهش تماس پشتیبانی – مشتری خودش سفارش را می‌یابد

  • افزایش رضایت – پیدا کردن سفارش در چند ثانیه

  • طراحی مدرن و واکنش‌گرا – مناسب موبایل و دسکتاپ

  • امن و بهینه – با Nonce و بدون فایل اضافی

✨ قابلیت‌ها

قابلیت توضیح
جستجو با ۳ روش شماره سفارش / موبایل / ایمیل
پشتیبانی از چند سفارش نمایش لیست کشویی در صورت وجود چند سفارش
نرمالایز خودکار موبایل ۰۹۱۲ و ۹۱۲ و +۹۸۹۱۲ یکسان پردازش می‌شوند
نمایش جزئیات کامل محصولات، قیمت، جمع کل و وضعیت رنگی

نحوه استفاده

  1. کد را در functions.php قرار دهید

  2. شورتکد [tav_order_lookup] را در صفحه مورد نظر اضافه کنید

  3. تمام! مشتریان شما آماده جستجو هستند.

 

/*******************************************
* Author: TavTheme
* Website: https://tavtheme.com/
* Instagram: @tavtheme
* جستجوی هوشمند سفارشات ووکامرس با موبایل، ایمیل یا شماره سفارش
 *******************************************/


<?php
add_shortcode('tav_order_lookup', 'tav_order_lookup_shortcode');

function tav_order_lookup_shortcode() {
    ob_start();

    $current_user_id = get_current_user_id();
    $found_orders = [];
    $error_message = '';
    $success_message = '';
    
    // مقادیر ورودی
    $order_number_value = '';
    $phone_value = '';
    $email_value = '';
    $selected_order_id = isset($_POST['selected_order']) ? intval($_POST['selected_order']) : 0;

    // --- پردازش فرم ---
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['tav_order_lookup_nonce'])) {
        if (!wp_verify_nonce($_POST['tav_order_lookup_nonce'], 'tav_order_lookup_action')) {
            $error_message = '⛔ خطای امنیتی. لطفا دوباره تلاش کنید.';
        } else {
            $order_number_value = sanitize_text_field($_POST['tav_order_number'] ?? '');
            $phone_value = sanitize_text_field($_POST['tav_order_phone'] ?? '');
            $email_value = sanitize_email($_POST['tav_order_email'] ?? '');

            // اعتبارسنجی: حداقل یکی وارد شده باشد
            if (empty($order_number_value) && empty($phone_value) && empty($email_value)) {
                $error_message = '❌ لطفاً حداقل یکی از فیلدهای شماره سفارش، شماره موبایل یا ایمیل را وارد کنید.';
            } else {
                // نرمالایز کردن موبایل و ایمیل
                if (!empty($phone_value)) {
                    $phone_value = tav_normalize_iran_mobile($phone_value);
                }
                if (!empty($email_value)) {
                    $email_value = strtolower(trim($email_value));
                }

                // ساخت آرگومان‌های جستجو
                $args = [
                    'limit'   => -1,
                    'status'  => array_keys(wc_get_order_statuses()),
                    'orderby' => 'date',
                    'order'   => 'DESC',
                    'return'  => 'objects',
                ];

                if ($current_user_id) {
                    $args['customer_id'] = $current_user_id;
                }

                $orders = wc_get_orders($args);
                $found_orders = [];

                // جستجوی هوشمند با منطق OR (اولویت: شماره سفارش > موبایل > ایمیل)
                foreach ($orders as $order) {
                    $order_id_matches = (!empty($order_number_value) && $order->get_order_number() == $order_number_value);
                    $phone_matches = (!empty($phone_value) && tav_normalize_iran_mobile($order->get_billing_phone()) === $phone_value);
                    $email_matches = (!empty($email_value) && strtolower(trim($order->get_billing_email())) === $email_value);

                    if ($order_id_matches || $phone_matches || $email_matches) {
                        $found_orders[] = $order;
                    }
                }

                if (empty($found_orders)) {
                    $error_message = '🔍 سفارشی با اطلاعات وارد شده یافت نشد. لطفاً اطلاعات را بررسی کنید.';
                } else {
                    $success_message = '✅ ' . count($found_orders) . ' سفارش یافت شد.';
                }
            }
        }
    }

    // تعیین سفارش انتخاب شده
    $display_order = null;
    if (!empty($found_orders)) {
        if (count($found_orders) === 1) {
            $display_order = $found_orders[0];
        } elseif ($selected_order_id > 0) {
            foreach ($found_orders as $order) {
                if ($order->get_id() == $selected_order_id) {
                    $display_order = $order;
                    break;
                }
            }
        }
    }
    ?>

    <div class="tav-order-lookup-container" dir="rtl">
        <style>
            .tav-order-lookup-container {
                font-family: inherit;
                max-width: 1000px;
                margin: 2rem auto;
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 28px;
                padding: 3px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            .tav-inner {
                background: #fff;
                border-radius: 26px;
                padding: 2rem 2rem;
            }
            .tav-title {
                text-align: center;
                font-size: 1.8rem;
                font-weight: 800;
                margin-bottom: 0.5rem;
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                -webkit-background-clip: text;
                -webkit-text-fill-color: transparent;
                background-clip: text;
            }
            .tav-subtitle {
                text-align: center;
                color: #64748b;
                margin-bottom: 2rem;
                font-size: 0.9rem;
            }
            .tav-search-methods {
                display: flex;
                gap: 1rem;
                margin-bottom: 2rem;
                border-bottom: 2px solid #f1f5f9;
                padding-bottom: 1rem;
            }
            .tav-method-tab {
                flex: 1;
                text-align: center;
                padding: 0.75rem;
                background: #f8fafc;
                border-radius: 16px;
                color: #64748b;
                font-weight: 600;
                font-size: 0.85rem;
                cursor: pointer;
                transition: all 0.3s;
            }
            .tav-method-tab.active {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                box-shadow: 0 4px 12px rgba(102,126,234,0.3);
            }
            .tav-form-row {
                display: flex;
                flex-wrap: wrap;
                gap: 1.5rem;
                margin-bottom: 1.5rem;
            }
            .tav-form-group {
                flex: 1;
                min-width: 200px;
            }
            .tav-form-group label {
                display: block;
                font-weight: 700;
                margin-bottom: 0.5rem;
                color: #1e293b;
                font-size: 0.85rem;
                text-transform: uppercase;
                letter-spacing: 0.5px;
            }
            .tav-form-group input,
            .tav-form-group select {
                width: 100%;
                padding: 0.85rem 1rem;
                font-size: 0.95rem;
                border: 2px solid #e2e8f0;
                border-radius: 18px;
                background-color: #fff;
                transition: all 0.3s;
                font-family: inherit;
                outline: none;
            }
            .tav-form-group input:focus,
            .tav-form-group select:focus {
                border-color: #667eea;
                box-shadow: 0 0 0 4px rgba(102,126,234,0.1);
            }
            .tav-hint {
                display: block;
                color: #94a3b8;
                font-size: 0.7rem;
                margin-top: 0.25rem;
            }
            .tav-submit-btn {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                border: none;
                padding: 1rem 2rem;
                font-size: 1rem;
                font-weight: 700;
                border-radius: 40px;
                cursor: pointer;
                transition: all 0.3s;
                width: 100%;
                font-family: inherit;
                box-shadow: 0 4px 12px rgba(102,126,234,0.3);
            }
            .tav-submit-btn:hover {
                transform: translateY(-2px);
                box-shadow: 0 8px 20px rgba(102,126,234,0.4);
            }
            .tav-submit-btn:active {
                transform: translateY(1px);
            }
            .tav-message {
                padding: 1rem;
                border-radius: 18px;
                margin-bottom: 1.5rem;
                font-weight: 500;
            }
            .tav-error {
                background: #fef2f2;
                border-right: 4px solid #ef4444;
                color: #b91c1c;
            }
            .tav-success {
                background: #f0fdf4;
                border-right: 4px solid #22c55e;
                color: #15803d;
            }
            .tav-order-list {
                background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
                padding: 1.5rem;
                border-radius: 24px;
                margin: 1.5rem 0;
            }
            .tav-order-list select {
                margin-top: 0.75rem;
                background: white;
                font-weight: 500;
            }
            .tav-order-header {
                display: flex;
                justify-content: space-between;
                align-items: center;
                flex-wrap: wrap;
                margin-bottom: 1.5rem;
                padding-bottom: 1rem;
                border-bottom: 3px solid #f1f5f9;
            }
            .tav-order-header h3 {
                margin: 0;
                font-size: 1.5rem;
                font-weight: 800;
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                -webkit-background-clip: text;
                -webkit-text-fill-color: transparent;
                background-clip: text;
            }
            .tav-badge {
                background: #f1f5f9;
                padding: 0.4rem 1rem;
                border-radius: 40px;
                font-size: 0.75rem;
                font-weight: 600;
                color: #475569;
            }
            .tav-order-table {
                width: 100%;
                border-collapse: collapse;
                margin: 1.5rem 0;
                border-radius: 20px;
                overflow: hidden;
            }
            .tav-order-table th {
                background: #f8fafc;
                color: #1e293b;
                font-weight: 800;
                padding: 14px 12px;
                text-align: right;
                border-bottom: 2px solid #e2e8f0;
            }
            .tav-order-table td {
                padding: 12px;
                border-bottom: 1px solid #f1f5f9;
                color: #334155;
            }
            .tav-summary {
                background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%);
                padding: 1.2rem 1.5rem;
                border-radius: 20px;
                margin-top: 1rem;
                display: flex;
                justify-content: space-between;
                flex-wrap: wrap;
                gap: 1rem;
                border: 1px solid #e2e8f0;
            }
            .tav-status {
                display: inline-block;
                padding: 0.3rem 1rem;
                border-radius: 40px;
                font-size: 0.75rem;
                font-weight: 700;
            }
            .status-completed { background: #dcfce7; color: #15803d; }
            .status-processing { background: #fef9c3; color: #854d0e; }
            .status-pending { background: #ffe4e2; color: #b91c1c; }
            .status-on-hold { background: #fff3e3; color: #b45309; }
            @media (max-width: 768px) {
                .tav-inner { padding: 1.5rem; }
                .tav-form-row { flex-direction: column; gap: 1rem; }
                .tav-search-methods { flex-direction: column; gap: 0.5rem; }
                .tav-order-header h3 { font-size: 1.2rem; }
            }
        </style>

        <div class="tav-inner">
            <div class="tav-title">
                🔍 استعلام سفارشات
            </div>
            <div class="tav-subtitle">
                برای مشاهده وضعیت سفارش، یکی از گزینه‌های زیر را وارد کنید
            </div>

            <form method="POST" id="tavOrderLookupForm">
                <?php wp_nonce_field('tav_order_lookup_action', 'tav_order_lookup_nonce'); ?>
                
                <div class="tav-search-methods">
                    <div class="tav-method-tab active">📝 هر کدام از فیلدها کافیست</div>
                </div>

                <div class="tav-form-row">
                    <div class="tav-form-group">
                        <label for="tav_order_number">🔢 شماره سفارش</label>
                        <input type="text" id="tav_order_number" name="tav_order_number" 
                               placeholder="مثال: 1258" value="<?php echo esc_attr($order_number_value); ?>">
                        <span class="tav-hint">📌 اگر شماره سفارش دارید، فقط همین کافیست</span>
                    </div>
                </div>

                <div class="tav-form-row">
                    <div class="tav-form-group">
                        <label for="tav_order_phone">📱 شماره موبایل</label>
                        <input type="tel" id="tav_order_phone" name="tav_order_phone" 
                               placeholder="مثال: 09123456789" value="<?php echo esc_attr($_POST['tav_order_phone'] ?? ''); ?>">
                        <span class="tav-hint">📌 شماره موبایل ثبت‌شده در زمان خرید</span>
                    </div>
                    
                    <div class="tav-form-group">
                        <label for="tav_order_email">✉️ ایمیل</label>
                        <input type="email" id="tav_order_email" name="tav_order_email" 
                               placeholder="مثال: info@example.com" value="<?php echo esc_attr($_POST['tav_order_email'] ?? ''); ?>">
                        <span class="tav-hint">📌 ایمیل ثبت‌شده در زمان خرید</span>
                    </div>
                </div>

                <button type="submit" class="tav-submit-btn" id="tavLookupBtn">
                    <span id="btnText">🚀 جستجوی سفارشات</span>
                    <span id="btnLoader" style="display:none;">⏳ در حال جستجو...</span>
                </button>
            </form>

            <div id="tavResultArea">
                <?php if (!empty($error_message)) : ?>
                    <div class="tav-message tav-error"><?php echo esc_html($error_message); ?></div>
                <?php endif; ?>

                <?php if (!empty($success_message)) : ?>
                    <div class="tav-message tav-success"><?php echo esc_html($success_message); ?></div>
                <?php endif; ?>

                <?php if (!empty($found_orders)) : ?>
                    <?php if (count($found_orders) > 1 && empty($order_number_value)) : ?>
                        <div class="tav-order-list">
                            <label for="order_select" style="font-weight:800; display:block; margin-bottom:0.5rem;">
                                📋 <?php echo count($found_orders); ?> سفارش برای اطلاعات وارد شده یافت شد:
                            </label>
                            <form method="POST" id="orderSelectForm">
                                <?php wp_nonce_field('tav_order_lookup_action', 'tav_order_lookup_nonce'); ?>
                                <input type="hidden" name="tav_order_number" value="<?php echo esc_attr($order_number_value); ?>">
                                <input type="hidden" name="tav_order_phone" value="<?php echo esc_attr($_POST['tav_order_phone'] ?? ''); ?>">
                                <input type="hidden" name="tav_order_email" value="<?php echo esc_attr($_POST['tav_order_email'] ?? ''); ?>">
                                <select name="selected_order" id="order_select" onchange="this.form.submit()">
                                    <option value="">-- انتخاب کنید --</option>
                                    <?php foreach ($found_orders as $order) : ?>
                                        <option value="<?php echo $order->get_id(); ?>" <?php echo ($display_order && $display_order->get_id() == $order->get_id()) ? 'selected' : ''; ?>>
                                            سفارش #<?php echo $order->get_order_number(); ?> - 
                                            <?php echo $order->get_date_created()->date_i18n('Y/m/d'); ?> - 
                                            <?php echo wc_price($order->get_total()); ?>
                                        </option>
                                    <?php endforeach; ?>
                                </select>
                            </form>
                        </div>
                    <?php endif; ?>

                    <?php if ($display_order) : 
                        $order = $display_order;
                        $status_name = wc_get_order_status_name($order->get_status());
                        $status_class = '';
                        switch ($order->get_status()) {
                            case 'completed': $status_class = 'status-completed'; break;
                            case 'processing': $status_class = 'status-processing'; break;
                            case 'pending': $status_class = 'status-pending'; break;
                            case 'on-hold': $status_class = 'status-on-hold'; break;
                            default: $status_class = 'status-pending';
                        }
                    ?>
                        <div class="tav-order-header">
                            <h3>🧾 جزئیات سفارش #<?php echo esc_html($order->get_order_number()); ?></h3>
                            <span class="tav-badge">
                                📅 <?php echo $order->get_date_created()->date_i18n('Y/m/d H:i'); ?>
                            </span>
                        </div>

                        <table class="tav-order-table">
                            <thead>
                                <tr><th>نام محصول</th><th>تعداد</th><th>قیمت</th></tr>
                            </thead>
                            <tbody>
                            <?php foreach ($order->get_items() as $item): ?>
                                <tr>
                                    <td><?php echo esc_html($item->get_name()); ?></td>
                                    <td><?php echo esc_html($item->get_quantity()); ?></td>
                                    <td><?php echo wc_price($item->get_total()); ?></td>
                                </tr>
                            <?php endforeach; ?>
                            </tbody>
                        </table>

                        <div class="tav-summary">
                            <div><strong>💰 مبلغ کل:</strong> <?php echo wc_price($order->get_total()); ?></div>
                            <div><strong>💳 روش پرداخت:</strong> <?php echo esc_html($order->get_payment_method_title()); ?></div>
                            <div><strong>📦 وضعیت:</strong> 
                                <span class="tav-status <?php echo $status_class; ?>"><?php echo esc_html($status_name); ?></span>
                            </div>
                        </div>
                    <?php endif; ?>
                <?php endif; ?>
            </div>
        </div>
    </div>

    <script>
        (function(){
            const form = document.getElementById('tavOrderLookupForm');
            const btn = document.getElementById('tavLookupBtn');
            const btnText = document.getElementById('btnText');
            const btnLoader = document.getElementById('btnLoader');
            
            if(form) {
                form.addEventListener('submit', function(e) {
                    if(btn) {
                        btn.disabled = true;
                        if(btnText) btnText.style.display = 'none';
                        if(btnLoader) btnLoader.style.display = 'inline';
                    }
                });
            }
        })();
    </script>
    <?php
    return ob_get_clean();
}

function tav_normalize_iran_mobile($phone) {
    $phone = preg_replace('/\D+/', '', $phone);
    if (substr($phone, 0, 4) === '0098') {
        return '+98' . substr($phone, 4);
    }
    if (substr($phone, 0, 2) === '98') {
        return '+' . $phone;
    }
    if (substr($phone, 0, 1) === '0') {
        return '+98' . substr($phone, 1);
    }
    return '+98' . $phone;
}
?>

 

اشتراک گذاری

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

بقیه مقالات
فرم جستجوی پیشرفته سفارشات ووکامرس با قابلیت جستجو بر اساس شماره سفارش، شماره موبایل و ایمیل – طراحی مدرن، واکنش‌گرا و بهینه برای سئو
اگر در وردپرس با Polylang فقط اولین پست یک Post Type قابل ترجمه است و بقیه گزینه Language ندارند، در این مقاله راه‌حل قطعی و سریع آن را یاد بگیرید.
ثبت مشاوره یا پلاگین
تماس با ما
واتساپ تلگرام اینستاگرام ارسال تیکت