خطای کوپن تخفیف WooCommerce معمولاً در بدترین لحظه‌ی ممکن ظاهر می‌شود: مشتری محصول را انتخاب کرده، در آستانه‌ی تسویه‌حساب است، کد تخفیفی که از کمپین تبلیغاتی گرفته را وارد می‌کند و در عوض دیدن مبلغ جدید، پیامی مبهم درباره‌ی نامعتبر بودن کد می‌گیرد. در تجربه‌ی چند ساله‌ام روی فروشگاه‌های ووکامرسی، در بیشتر مواردی که با این خطا مواجه شده‌ام، مشکل در خود کد نیست؛ در تعامل پیچیده‌ی قواعد کوپن با منطق دیگری از فروشگاه است که کسی آن را کامل ندیده.

این مقاله را برای عیب‌یابی نظام‌مند نوشته‌ام، نه برای وصله‌کاری موقت. اگر کوپن‌ها گاهی کار می‌کنند و گاهی نه، اگر برای گروه خاصی از کاربران اعمال نمی‌شوند، اگر بعد از اعمال، مبلغ سبد به‌درستی به‌روز نمی‌شود یا اگر کوپن‌های تولید انبوه در فروشگاه شما بی‌سروصدا از کار افتاده‌اند، مسیری که در ادامه می‌آید همان ترتیبی است که در پروژه‌های واقعی اجرا می‌کنم.

چرا کوپن‌ها در لحظه‌ی تسویه‌حساب اعمال نمی‌شوند؟

کوپن در ووکامرس، یک قاعده‌ی ساده نیست؛ مجموعه‌ای از شروط پیچیده است که همگی باید در لحظه‌ی اعمال، برآورده شوند. این شروط در پنج محور تعریف می‌شوند: بازه‌ی زمانی، محدوده‌ی محصول (شامل یا حذف دسته، محصول یا واریاسیون)، شرایط کاربر (نقش، ایمیل، تاریخچه‌ی خرید)، سقف استفاده (تعداد کل، تعداد به‌ازای هر کاربر)، و نوع تخفیف (مبلغ ثابت، درصد، تخفیف خرید عمده). هر اختلال کوچک در هر یک از این پنج محور، به پیام عمومی «این کوپن معتبر نیست» ختم می‌شود که تقریباً همیشه گمراه‌کننده است.

نکته‌ی مهم این است که در ووکامرس مدرن، کوپن‌ها به‌صورت تراکنشی پردازش می‌شوند: همه‌ی شروط در لحظه‌ی اعمال، دوباره بازبینی می‌شوند. اگر بین لحظه‌ی وارد کردن کد و لحظه‌ی تسویه‌حساب، سبد کاربر تغییر کند (مثلاً کم شدن موجودی یک محصول یا انقضای کوپن)، کوپن بی‌سروصدا حذف می‌شود. این رفتار که در طراحی ووکامرس کاملاً منطقی است، در عمل باعث می‌شود بسیاری از کاربران فکر کنند کوپن کار نمی‌کند.

دومین دلیل رایج، تعامل کوپن با سایر قواعد تخفیف است. اگر فروشگاه شما در آن لحظه در حال حراج (Sale) باشد و کوپن روی محصولات حراج‌خورده اعمال نشود، طبیعی است که کاربر شاهد کاهش قیمت نباشد. منطق تعامل این دو، در تنظیمات کوپن قابل کنترل است؛ اما اگر این تنظیمات به‌درستی مدیریت نشود، کاربر هیچ بازخوردی درباره‌ی علت رد شدن کوپن نمی‌گیرد. توضیح کامل این منطق در تخفیف و کد تخفیف در ووکامرس آمده است.

سومین دلیل که در فروشگاه‌های بزرگ زیاد دیده‌ام، مسئله‌ی عملکرد است. اگر تعداد کوپن‌های فعال فروشگاه به هزاران عدد برسد و جدول کوپن‌ها ایندکس‌گذاری مناسبی نداشته باشد، هر اعمال کوپن به یک جستجوی کند در دیتابیس تبدیل می‌شود که در نهایت با timeout یا رد شدن کوپن پایان می‌یابد. این نوع خطاها در ساعات پیک بیشتر ظاهر می‌شوند و در ساعات خلوت شاید هرگز دیده نشوند.

کوپن در ووکامرس، یک قاعده‌ی ایستا نیست؛ یک محاسبه‌ی دوباره در هر لحظه است. هر چیزی که این محاسبه را به هم بزند، در چشم مشتری به یک کد نامعتبر تبدیل می‌شود.

چرخه‌ی حیات یک کوپن در WooCommerce

برای عیب‌یابی حرفه‌ای، باید بدانید ووکامرس در لحظه‌ی اعمال کوپن چه فرآیندی را طی می‌کند. این فرآیند شش مرحله دارد و خطا می‌تواند در هر مرحله رخ بدهد:

  1. دریافت کد: کد کوپن از فرم سبد خرید به سرور ارسال می‌شود.
  2. جستجو در دیتابیس: ووکامرس کد را در جدول wp_posts با نوع shop_coupon جستجو می‌کند.
  3. بازبینی محدودیت‌ها: تمام قواعد تعریف‌شده روی کوپن (محصول، دسته، کاربر، بازه‌ی زمانی، سقف استفاده) بازبینی می‌شوند.
  4. محاسبه‌ی تخفیف: مقدار تخفیف بر اساس نوع کوپن (درصد، مبلغ ثابت، خرید عمده) محاسبه می‌شود.
  5. به‌روزرسانی سبد: مبلغ کل سبد با در نظر گرفتن تخفیف، مالیات و هزینه‌ی ارسال، دوباره محاسبه می‌شود.
  6. ذخیره در سشن: کوپن اعمال‌شده در سشن کاربر ذخیره می‌شود تا در مرحله‌ی تسویه‌حساب قابل استفاده باشد.

هر یک از این شش مرحله، می‌تواند نقطه‌ی شکست باشد. مرحله‌ی سوم معمولاً بیش از همه پیچیده است، چون تمام شرط‌ها باید همگی برآورده شوند. مرحله‌ی پنجم هم زیاد خطا می‌دهد، مخصوصاً در فروشگاه‌هایی که منطق مالیات یا هزینه‌ی ارسال سفارشی دارند.

مرحله‌ی چهارم، به‌ظاهر ساده، ریشه‌ی خطاهای ظریف است. مثلاً اگر نوع کوپن تخفیف درصدی با سقف مبلغ باشد و سبد کاربر به آن سقف برسد، محاسبه می‌تواند به عددی غیرمنطقی (منفی یا بالاتر از مبلغ سبد) برسد که ووکامرس آن را نامعتبر می‌داند و در نتیجه کوپن را حذف می‌کند.

کوئری مفید برای بررسی کوپن‌های فعال

برای این‌که ببینید یک کوپن مشخص در دیتابیس چه وضعیتی دارد، می‌توانید این کوئری را در phpMyAdmin اجرا کنید:

SELECT p.ID, p.post_title, p.post_status, p.post_date, p.post_expiry_date
FROM wp_posts p
WHERE p.post_type = 'shop_coupon'
  AND p.post_title = 'SAVE20'
LIMIT 1;

اگر post_status روی publish نبود یا تاریخ انقضا در گذشته بود، کوپن به‌صورت خودکار رد می‌شود. این ساده‌ترین نوع خطاست و در عین حال، شایع‌ترین دلیلی است که در پشتیبانی با آن مواجه شده‌ام.

خطاهای رایج کوپن و ریشه‌ی واقعی آن‌ها

خطاهای کوپن تخفیف WooCommerce را می‌توان در هفت خانواده‌ی اصلی دسته‌بندی کرد. تشخیص درست این خانواده، نیمی از راه‌حل است:

خطای کوپن نامعتبر (Coupon Does Not Exist)

ساده‌ترین خطا و در عین حال، گمراه‌کننده‌ترین. ریشه‌های رایج:

  • اشتباه تایپی کاربر: حروف بزرگ و کوچک در کوپن‌های ووکامرس به‌صورت پیش‌فرض حساس هستند. اگر کوپن به‌صورت SAVE20 ذخیره شده و کاربر save20 وارد کرده باشد، کوپن رد می‌شود.
  • کوپن حذف‌شده یا منقضی: اگر کوپن در پنل حذف شده یا تاریخ انقضای آن گذشته باشد، دیتابیس آن را برنمی‌گرداند.
  • کوپن پیش‌نویس یا خصوصی: اگر وضعیت کوپن روی Draft یا Private باشد، در جستجوی عمومی پیدا نمی‌شود.
  • مشکل دیتابیس: در موارد نادر، اگر جدول کوپن‌ها خراب شده باشد، کوپن‌های سالم هم پیدا نمی‌شوند. علائم مشابه این نوع خرابی در رفع خطاهای رایج ووکامرس بررسی شده است.

خطای کوپن بدون شرایط اعمال (Coupon Not Applicable)

کوپن وجود دارد ولی روی سبد فعلی کاربر اعمال نمی‌شود. این خطا بیشترین تنوع را دارد و ریشه‌های زیر را شامل می‌شود:

  • حداقل مبلغ سفارش: اگر کوپن حداقل مبلغ سفارش داشته باشد و سبد کاربر کمتر از آن باشد، اعمال نمی‌شود.
  • حداکثر مبلغ سفارش: گاهی کوپن برای سفارش‌های بزرگ طراحی شده و روی سفارش‌های کوچک کار نمی‌کند.
  • محدودیت دسته یا محصول: اگر کوپن فقط برای محصولات مشخصی است و سبد کاربر شامل آن‌ها نیست، اعمال نمی‌شود.
  • حذف محصولات حراج‌خورده: اگر گزینه‌ی Exclude sale items فعال باشد و همه‌ی محصولات سبد در حال حراج باشند، کوپن بی‌اثر می‌شود.
  • محدودیت ایمیل: اگر کوپن به ایمیل خاصی محدود شده باشد و کاربر با ایمیل متفاوتی وارد شده باشد، رد می‌شود.

در این دسته، مهم‌ترین کار این است که دلیل دقیق رد شدن کوپن به کاربر نمایش داده شود. به‌صورت پیش‌فرض، ووکامرس همه‌ی موارد بالا را در یک پیام عمومی خلاصه می‌کند که برای کاربر گیج‌کننده است. راه‌حل، استفاده از پیام‌های سفارشی یا افزونه‌هایی است که دلیل دقیق را نمایش می‌دهند.

خطای مصرف شدن سقف کوپن (Usage Limit Reached)

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

نکته‌ی ظریفی که در پروژه‌ها بارها دیده‌ام: شمارنده‌ی استفاده از کوپن در جدول wp_postmeta ذخیره می‌شود و اگر این جدول به‌دلیل بازیابی بکاپ قدیمی یا مهاجرت ناقص همگام‌سازی نشود، ممکن است شمارنده به‌اشتباه پر باشد. برای بررسی:

SELECT post_id, meta_key, meta_value
FROM wp_postmeta
WHERE meta_key IN ('_usage_count', '_usage_limit', '_usage_limit_per_user')
  AND post_id = 56789;

در مقایسه‌ی این سه مقدار، اگر _usage_count بزرگتر یا مساوی _usage_limit باشد، کوپن غیرفعال می‌شود. اگر مطمئن هستید که شمارنده به‌اشتباه پر شده، می‌توانید آن را به مقدار صحیح بازنشانی کنید؛ اما قبل از هر تغییری، بکاپ کامل بگیرید.

خطای عدم اعمال در لحظه‌ی تسویه‌حساب

یکی از آزاردهنده‌ترین سناریوها: کوپن در سبد خرید اعمال می‌شود، ولی در صفحه‌ی تسویه‌حساب ناپدید می‌شود یا مبلغ بدون تخفیف محاسبه می‌شود. ریشه‌های شایع:

  • مشکل سشن: اگر سشن کاربر بین سبد و تسویه‌حساب از دست برود، کوپن اعمال‌شده هم پاک می‌شود.
  • کش صفحه‌ی تسویه‌حساب: اگر افزونه‌ی کش، صفحه‌ی تسویه‌حساب را کش کند، کاربر نسخه‌ی قبلی (بدون کوپن) را می‌بیند.
  • تداخل با افزونه‌ی تخفیف: بعضی افزونه‌های شخصی‌سازی تخفیف، منطق کوپن را بازنویسی می‌کنند و در لحظه‌ی تسویه‌حساب، کوپن را نادیده می‌گیرند.
  • محاسبه‌ی مجدد مبلغ: اگر مبلغ نهایی سبد بین سبد خرید و تسویه‌حساب تغییر کند (مثلاً با اضافه شدن هزینه‌ی ارسال)، کوپن ممکن است به‌دلیل تغییر شرایط، دوباره بازبینی و رد شود.

مشکل اعمال نشدن کوپن در تسویه‌حساب، اغلب با سفارشی‌سازی نادرست صفحه‌ی تسویه‌حساب همراه است. راهنمای کامل این ناحیه در سفارشی‌سازی سبد خرید و تسویه‌حساب ووکامرس آمده است.

خطای محاسبه‌ی اشتباه تخفیف

کوپن اعمال می‌شود ولی مقدار تخفیف اشتباه است. سه ریشه‌ی عمده:

  1. تخفیف روی قیمت اصلی به‌جای قیمت حراج: اگر تنظیمات کوپن روی این حالت باشد و محصول در حال حراج باشد، تخفیف به‌صورت غیرمنطقی محاسبه می‌شود.
  2. تداخل با مالیات: اگر کوپن قبل از مالیات اعمال شود، نتیجه متفاوت از حالت بعد از مالیات است. این موضوع با دقت در مدیریت مالیات در ووکامرس توضیح داده شده است.
  3. ترکیب چند کوپن: به‌صورت پیش‌فرض، ووکامرس اجازه‌ی ترکیب چند کوپن را نمی‌دهد. اگر افزونه‌ای این قابلیت را اضافه کرده باشد، ترتیب اعمال کوپن‌ها می‌تواند نتیجه را تغییر دهد.

خطای کوپن برای محصولات متغیر

اگر کوپن به یک واریاسیون خاص از محصول متغیر محدود شده باشد، در پنل ووکامرس باید به‌درستی ذخیره شده باشد. ناهماهنگی در شناسه‌ی واریاسیون بین کوپن و محصول، باعث می‌شود کوپن به‌نظر معتبر باشد ولی در سبد اعمال نشود. مباحث مرتبط با محصولات متغیر در رفع خطای محصولات متغیر در ووکامرس پوشش داده شده است.

خطای ناپدید شدن کوپن بعد از اعمال

کوپن اعمال می‌شود، کاربر مبلغ جدید را می‌بیند، ولی چند ثانیه بعد کوپن حذف می‌شود. این رفتار معمولاً نتیجه‌ی اجرای مجدد قواعد کوپن در یک درخواست AJAX است که به دلیل کندی سرور یا خطای موقت، نتیجه‌ی متفاوتی برمی‌گرداند. راه‌حل، بررسی لاگ و پایش عملکرد سرور است.

نشانه در سبد خریداحتمال ریشهراه‌حل اولیه
پیام کوپن نامعتبراشتباه تایپی، انقضا یا وضعیت نامعتبربررسی دیتابیس و تنظیمات کوپن
کوپن اعمال نمی‌شودمحدودیت محصول، دسته یا کاربربازبینی دقیق شروط کوپن
مبلغ تخفیف صفر استمحصول حراج یا سقف تخفیفحذف گزینه‌ی Exclude sale items
کوپن در تسویه‌حساب ناپدید می‌شودمشکل سشن یا کشمستثنی کردن صفحه‌ی تسویه از کش
سقف استفاده پر استشمارنده اشتباه در wp_postmetaبازنشانی _usage_count

عیب‌یابی گام‌به‌گام خطای کوپن

مسیری که در ادامه می‌آید، همان ترتیبی است که در پروژه‌های واقعی روی فروشگاه‌های در حال فروش اجرا می‌کنم. هدف، جدا کردن مقصر در کمترین زمان و بدون ایجاد وقفه در فروش است.

گام اول: بازتولید دقیق خطا

قبل از هر تغییری، باید خطا را به‌طور دقیق بازتولید کنید. پنج سؤال را از خودتان بپرسید:

  1. خطا در همه‌ی مرورگرها رخ می‌دهد یا فقط در یکی؟
  2. خطا با همه‌ی کوپن‌ها رخ می‌دهد یا فقط با کوپن خاصی؟
  3. خطا با همه‌ی کاربران رخ می‌دهد یا فقط با کاربران خاصی؟
  4. خطا با همه‌ی سبدها رخ می‌دهد یا فقط با سبد شامل محصولات خاص؟
  5. خطا در همه‌ی ساعات شبانه‌روز رخ می‌دهد یا فقط در ساعات پیک؟

پاسخ به این پنج سؤال، محدوده‌ی جستجو را از کل فروشگاه به یک ناحیه‌ی کوچک کاهش می‌دهد. اگر خطا فقط با یک کوپن خاص رخ می‌دهد، مشکل در تنظیمات همان کوپن است. اگر خطا فقط با یک کاربر خاص رخ می‌دهد، مشکل در نقش یا تاریخچه‌ی آن کاربر است.

گام دوم: فعال‌سازی لاگ و بررسی دقیق

ووکامرس یک سیستم لاگ داخلی دارد که به‌صورت پیش‌فرض لاگ نمی‌گیرد. در wp-config.php، مقادیر WP_DEBUG، WP_DEBUG_LOG و WP_DEBUG_DISPLAY را تنظیم کنید. سپس لاگ‌های ووکامرس را در مسیر WooCommerce > Status > Logs بررسی کنید. حتی اگر پیام خطای روی صفحه مبهم باشد، لاگ معمولاً دقیق است و نام افزونه یا خطای PHP مشخص می‌کند.

در اکثر پروژه‌هایی که با آن‌ها مواجه شده‌ام، لاگ ووکامرس مستقیماً به یک افزونه‌ی مشخص یا یک درخواست AJAX مشکل‌دار اشاره می‌کند.

گام سوم: بررسی تنظیمات کوپن

تنظیمات کوپن را در پنل ووکامرس با دقت بازبینی کنید. مهم‌ترین موارد:

  • وضعیت کوپن روی Publish است.
  • تاریخ انقضا در آینده است یا خالی.
  • حداقل و حداکثر مبلغ سفارش با سبد کاربر همخوانی دارد.
  • محدودیت محصول یا دسته، با سبد کاربر تطابق دارد.
  • گزینه‌ی Exclude sale items تنها در صورت نیاز فعال است.
  • سقف استفاده‌ی کل و سقف به‌ازای هر کاربر پر نشده است.

در تجربه‌ی من، بیشترین اشتباه در این مرحله به دو چیز برمی‌گردد: تاریخ انقضای گذشته که در پنل به‌درستی دیده نمی‌شود، و تنظیم اشتباه محدودیت محصول که با اسلاگ دسته‌بندی یا شناسه‌ی محصول اشتباه ذخیره شده است.

گام چهارم: تست در حالت کاربر ناشناس

اگر مشکل فقط برای کاربران ناشناس رخ می‌دهد، احتمالاً نقش کاربری یا سبد مهمان در فرآیند اعمال کوپن اثر می‌گذارد. یک پنجره‌ی Incognito باز کنید، یک محصول به سبد اضافه کنید و کوپن را امتحان کنید. اگر در حالت ناشناس کوپن اعمال شد ولی در حالت لاگین‌شده نشد، مشکل در نقش کاربری است.

گام پنجم: بررسی کنسول مرورگر و تب Network

هنگام اعمال کوپن، درخواست AJAX به سرور ارسال می‌شود. در تب Network، سه چیز را بررسی کنید:

  1. کد وضعیت پاسخ: اگر ۲۰۰ نبود، ریشه سمت سرور است.
  2. زمان پاسخ: اگر بیش از ۳ ثانیه طول کشید، مسئله‌ی عملکرد است.
  3. محتوای پاسخ: اگر پاسخ JSON شامل پیام خطا بود، دلیل دقیق رد شدن کوپن را می‌بینید.

گام ششم: تست با قالب پیش‌فرض

بعضی قالب‌ها، تمپلیت‌های سبد خرید و تسویه‌حساب را بازنویسی می‌کنند و ممکن است کوپن را در محل نامناسبی رندر کنند یا اسکریپت‌های لازم را enqueue نکنند. برای تست سریع، قالب را موقتاً به Twenty Twenty-Four تغییر دهید. اگر مشکل رفع شد، مقصر قالب است.

گام هفتم: غیرفعال‌سازی افزونه‌ها به روش تدریجی

روش حذف تدریجی، دقیق‌ترین روش پیدا کردن مقصر است. در محیط استیجینگ:

  1. تمام افزونه‌ها را غیرفعال کنید، به‌جز ووکامرس.
  2. کوپن را تست کنید.
  3. افزونه‌ها را یکی‌یکی فعال کنید و بعد از هر فعال‌سازی، تست کنید.

سه دسته افزونه بیشترین احتمال تضاد با کوپن را دارند: افزونه‌های تخفیف و کوپن سفارشی، افزونه‌های کش، و افزونه‌های امنیتی. افزونه‌های تخفیف افزوده، ممکن است منطق کوپن ووکامرس را بازنویسی کنند. افزونه‌های کش، پاسخ AJAX کوپن را کش می‌کنند. افزونه‌های امنیتی، درخواست کوپن را به‌عنوان اسپم مسدود می‌کنند.

وقتی کوپن با افزونه‌ی کش روی هم بیفتند، مشکل تقریباً همیشه از افزونه‌ی کش است؛ چون کش به‌طور پیش‌فرض برای پاسخ‌های ایستا طراحی شده، نه برای پاسخ‌های متغیر-محور مثل کوپن.

گام هشتم: بررسی دیتابیس و جدول‌های ووکامرس

اگر تا اینجا مقصر پیدا نشد، ریشه در دیتابیس است. سه چیز را بررسی کنید:

  • وجود کوپن در دیتابیس: با کوئری قبلی که آوردیم، وضعیت کوپن را بررسی کنید.
  • سلامت جدول wp_postmeta: اگر این جدول سنگین یا خراب باشد، کوپن‌ها کندتر و ناقص‌تر بازبینی می‌شوند.
  • همگام‌سازی جدول lookup ووکامرس: جدول wp_wc_order_stats و مشابه آن، در سرعت پردازش کوپن اثرگذارند.

محدودیت‌های کوپن و تداخل قواعد

ووکامرس در تنظیمات کوپن، انعطاف زیادی می‌دهد. همین انعطاف، منبع بسیاری از خطاهاست. اگر یک کوپن با چند محدودیت همزمان تعریف شود، احتمال بروز تداخل بالا می‌رود. محدودیت‌ها را می‌توان در پنج دسته بررسی کرد:

محدودیت محصول

می‌توانید کوپن را به محصولات خاصی محدود کنید یا محصولات خاصی را از تخفیف حذف کنید. نکته‌ی مهم این است که هر دو محدودیت می‌توانند به‌طور همزمان فعال باشند و نتیجه، اجتماع منطقی آن‌ها است. اگر همزمان محصول A در لیست شامل و همان محصول A در لیست حذف باشد، کوپن روی A اعمال نمی‌شود.

محدودیت دسته‌بندی

مشابه محدودیت محصول، می‌توانید کوپن را به دسته‌بندی خاصی محدود کنید. اگر محصول در چند دسته‌بندی باشد، کوپن روی آن اعمال می‌شود. اما اگر آن دسته‌بندی در لیست حذف باشد، نتیجه معکوس می‌شود.

محدودیت کاربر

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

نکته‌ای که در پروژه‌ها بارها دیده‌ام: بعضی افزونه‌های ارسال ایمیل، ایمیل کاربر را قبل از اعمال کوپن تغییر می‌دهند یا نرمال‌سازی می‌کنند (مثلاً حذف نقطه از بخش محلی ایمیل)، که باعث می‌شود مقایسه‌ی ایمیل شکست بخورد.

محدودیت زمانی

کوپن می‌تواند بازه‌ی زمانی داشته باشد. اگر تاریخ انقضا در پنل ست شده ولی بازه‌ی شروع هنوز نرسیده باشد، کوپن فعال نیست. نکته‌ی مهم: تاریخ‌ها بر اساس منطقه‌ی زمانی سایت محاسبه می‌شوند، نه منطقه‌ی زمانی کاربر. اگر منطقه‌ی زمانی سایت اشتباه تنظیم شده باشد، کوپن ممکن است یک روز زودتر یا دیرتر از کار بیفتد.

محدودیت سقف استفاده

سقف استفاده از کوپن می‌تواند به‌صورت کلی (تعداد کل استفاده) یا به‌ازای هر کاربر محدود شود. اگر این سقف پر شود، کوپن از کار می‌افتد. مکانیزم دقیق این شمارنده‌ها در مدیریت سفارش‌ها در ووکامرس و لایه‌های مرتبط با آن بررسی شده است.

کوپن، مالیات و هزینه‌ی ارسال

کوپن در ووکامرس به‌صورت پیش‌فرض قبل از مالیات اعمال می‌شود. این تصمیم منطقی است (چون مالیات بر اساس قیمت خالص بعد از تخفیف محاسبه می‌شود)، ولی در برخی فروشگاه‌ها که با تنظیمات مالیات متفاوتی کار می‌کنند، باعث تفاوت در مبلغ نهایی می‌شود. اگر بعد از اعمال کوپن، مبلغ نهایی سبد اشتباه بود، اولین جایی که باید بررسی شود، لایه‌ی مالیات است.

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

نکته‌ی عملی: اگر فروشگاه شما به‌طور منظم کوپن‌های درصدی می‌دهد، توصیه می‌کنم ابتدا در محیط استیجینگ با یک سفارش نمونه، مبلغ نهایی را در سه سناریو تست کنید: با مالیات، بدون مالیات، و با هزینه‌ی ارسال سفارشی. اکثر خطاهای محاسبه‌ی کوپن در همین تست‌های سه‌گانه رخ می‌دهد.

کوپن با محصولات متغیر و حراج‌ها

سه حالت خاص، بیشترین احتمال تداخل را در کوپن‌ها ایجاد می‌کنند:

کوپن روی واریاسیون خاص محصول متغیر

اگر کوپن به یک واریاسیون خاص محدود شده باشد، شناسه‌ی دقیق واریاسیون در تنظیمات کوپن ذخیره می‌شود. اگر واریاسیون بعداً حذف و بازسازی شود، شناسه تغییر می‌کند و کوپن دیگر کار نمی‌کند. راه‌حل: به‌جای محدود کردن کوپن به یک واریاسیون خاص، از محدودیت محصول والد با ویژگی‌های قابل‌اعمال استفاده کنید.

کوپن روی محصولات حراج‌خورده

ووکامرس به‌صورت پیش‌فرض گزینه‌ی Exclude sale items را دارد. اگر این گزینه فعال باشد و محصول در حال حراج باشد، کوپن روی آن اعمال نمی‌شود. راه‌حل: اگر قصد ترکیب حراج و کوپن را دارید، این گزینه را غیرفعال کنید. اما توجه داشته باشید که این تصمیم، حاشیه‌ی سود شما را کاهش می‌دهد و باید آگاهانه گرفته شود.

کوپن روی سبد حاوی چند محصول حراج و غیرحراج

در این حالت، کوپن فقط روی محصولات غیرحراج اعمال می‌شود. اگر همه‌ی محصولات سبد در حال حراج باشند، کوپن بی‌اثر می‌شود. این رفتار برای ووکامرس منطقی است، ولی برای کاربر غیرمنتظره و گیج‌کننده. راه‌حل توصیه‌شده: در توضیحات کوپن بنویسید که تخفیف شامل محصولات حراج نمی‌شود. برای درک دقیق‌تر این تعامل، مقاله‌ی رفع خطای نمایش قیمت در ووکامرس را نیز ببینید.

تداخل افزونه‌ها و نقش کش

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

افزونه‌های تخفیف و کوپن سفارشی

افزونه‌هایی که امکانات بیشتری به کوپن اضافه می‌کنند، ممکن است منطق کوپن پیش‌فرض ووکامرس را بازنویسی کنند و در نتیجه کوپن‌های پایه هم از کار بیفتند. اگر این نوع افزونه نصب دارید، ابتدا آن را غیرفعال کنید و با کوپن پیش‌فرض تست بگیرید.

افزونه‌های کش

این افزونه‌ها، پاسخ‌های AJAX مربوط به کوپن را هم کش می‌کنند. نتیجه: کاربری که کوپن را اعمال می‌کند، کاربر بعدی هم همان پاسخ را می‌بیند، حتی اگر سبد کاملاً متفاوتی داشته باشد. راه‌حل: درخواست‌های admin-ajax.php و صفحات سبد و تسویه‌حساب را از کش مستثنی کنید.

افزونه‌های امنیتی

بعضی افزونه‌های امنیتی، درخواست کوپن بدون nonce معتبر را به‌عنوان حمله تلقی می‌کنند. اگر در لاگ افزونه‌ی امنیتی، مسدودسازی درخواست‌های مربوط به کوپن را دیدید، این احتمال جدی است. راه‌حل: کوپن را از فهرست درخواست‌های مشکوک حذف کنید. امنیت فروشگاه موضوعی است که نباید فدای رفع خطا شود؛ در افزایش امنیت فروشگاه ووکامرس راه‌حل‌های جایگزین امن بررسی شده است.

روش حذف تدریجی که قبلاً توضیح دادم، سریع‌ترین راه پیدا کردن مقصر است. در تجربه‌ی من، فروشگاه‌هایی که همزمان چند افزونه‌ی تخفیف و کش دارند، بیشترین احتمال بروز این نوع خطا را دارند.

کوپن‌های تولید انبوه و خطاهای CSV

کوپن‌ها یکی از رایج‌ترین انواع داده‌ای هستند که به‌صورت انبوه تولید می‌شوند. مثلاً کمپین‌های تبلیغاتی که برای هزاران کاربر کوپن اختصاصی صادر می‌کنند. در این حالت، مسائل خاصی بروز می‌کند:

ناهماهنگی ستون‌ها در CSV

اگر فایل CSV با ساختار نمونه‌ی صادرات ووکامرس مطابقت نداشته باشد، کوپن‌ها ناقص ساخته می‌شوند. بعضی فیلدها ممکن است در CSV وجود داشته باشند ولی ووکامرس آن‌ها را نادیده بگیرد.

مشکل رمزگذاری

اگر فایل CSV با UTF-8 بدون BOM ذخیره شود، کاراکترهای فارسی در نام کوپن‌ها به‌هم می‌ریزند. توصیه: همیشه CSV را با UTF-8 با BOM ذخیره کنید.

تکرار کد کوپن

اگر دو کوپن با یک کد یکتا در دیتابیس ثبت شوند، ووکامرس اولی را ذخیره می‌کند و دومی را با خطا رد می‌کند. سیستم تولید کوپن باید کدها را به‌صورت تصادفی و بدون تکرار بسازد.

ناهماهنگی سقف استفاده

در کوپن‌های اختصاصی، معمولاً سقف استفاده به‌ازای هر کاربر یک است. اگر این تنظیم به‌درستی اعمال نشود، کاربران می‌توانند چند بار از کوپن استفاده کنند که از نظر مالی برای فروشگاه زیان‌آور است.

نکته‌ی میدانی: برای کوپن‌های انبوه، توصیه می‌کنم ابتدا یک نسخه‌ی کوچک (مثلاً ۱۰ کوپن) را در محیط استیجینگ بسازید و بعد از تأیید، نسخه‌ی کامل را اعمال کنید. این کار از بروز خطاهای انبوه جلوگیری می‌کند.

عملکرد فروشگاه‌های با کوپن زیاد

وقتی تعداد کوپن‌های فروشگاه به چند هزار عدد برسد، هر اعمال کوپن به یک جستجوی کند در دیتابیس تبدیل می‌شود. سه نکته‌ی عملکردی که در پروژه‌ها رعایت می‌کنم:

  1. پاک‌سازی کوپن‌های منقضی: کوپن‌های منقضی و بی‌استفاده را به‌صورت دوره‌ای از دیتابیس حذف کنید. این کار باعث می‌شود جدول کوپن‌ها سبک‌تر و سریع‌تر شود.
  2. ایندکس‌گذاری درست: در دیتابیس‌های بزرگ، بررسی کنید که ستون‌های post_type و post_status در جدول wp_posts ایندکس داشته باشند.
  3. کش مؤثر: صفحه‌های سبد و تسویه‌حساب را از کش مستثنی کنید، ولی پاسخ‌های ایستا را کش نگه دارید.

راهبردهای کامل‌تر در افزایش سرعت فروشگاه ووکامرس آمده است. اگر زمان اعمال کوپن در فروشگاه شما به‌طور محسوس افزایش یافته، ورود به این لایه اجتناب‌ناپذیر است.

کوئری برای بررسی تعداد کوپن‌های فعال

برای این‌که ببینید فروشگاه شما چقدر کوپن فعال دارد، می‌توانید این کوئری را اجرا کنید:

SELECT COUNT(*) AS active_coupons
FROM wp_posts
WHERE post_type = 'shop_coupon'
  AND post_status = 'publish';

اگر عدد از هزار بیشتر شد، بهینه‌سازی جدول کوپن‌ها را در برنامه‌ی نگهداری دوره‌ای قرار دهید.

تست و پایش مستمر کوپن‌ها

بعد از رفع خطا، مهم‌تر از رفع، پیشگیری از تکرار است. سه سطح پایش توصیه می‌کنم:

سطح اول: تست دوره‌ای کوپن‌ها

هفته‌ای یک‌بار، سه کوپن مختلف (یکی عمومی، یکی محصول-محور، یکی دسته-محور) را در یک سبد تستی امتحان کنید. این تست چند دقیقه‌ای می‌تواند از بروز خطا در کمپین بعدی جلوگیری کند.

سطح دوم: پایش لاگ کوپن‌ها

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

سطح سوم: پایش نرخ استفاده از کوپن

اگر نرخ استفاده از یک کوپن به‌طور ناگهانی صفر شد، احتمالاً کوپن از کار افتاده است. این نوع پایش نیاز به تحلیل داده دارد ولی به‌سرعت مشکل را پیدا می‌کند. توصیه می‌کنم کوپن‌های کمپین‌های حساس (مثل کمپین‌های فروش فصلی) را با دقت بیشتری پایش کنید.

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

چرا کوپن من در سبد خرید اعمال نمی‌شود ولی در پنل معتبر است؟

این الگو معمولاً به یکی از سه عامل برمی‌گردد: ناهماهنگی محدودیت محصول با سبد کاربر، فعال بودن گزینه‌ی Exclude sale items روی محصولات حراج، یا مشکل کش که پاسخ کوپن را قدیمی نگه داشته. بررسی لاگ و تست در حالت Incognito سریع‌ترین راه تشخیص است.

آیا حساسیت به حروف بزرگ و کوچک در کوپن‌ها قابل غیرفعال کردن است؟

به‌صورت پیش‌فرض، کوپن‌های ووکامرس به حروف بزرگ و کوچک حساس هستند. برای غیرفعال کردن این حساسیت، به یک اسنیپت سفارشی یا افزونه نیاز دارید. اما در عمل، توصیه می‌کنم همیشه کدها را با حروف بزرگ ذخیره کنید و کاربران را در توضیحات راهنما کنید.

چرا کوپن با تخفیف درصدی، مقدار بیشتری از مبلغ سبد کسر می‌کند؟

این مشکل معمولاً در کوپن‌های درصدی با سقف مبلغ رخ می‌دهد. اگر سقف تخفیف اشتباه تنظیم شده باشد یا سبد شامل محصولات حراج باشد، محاسبه می‌تواند به نتیجه‌ی غیرمنطقی برسد. راه‌حل: سقف تخفیف را به‌درستی تنظیم کنید و گزینه‌ی Exclude sale items را بررسی کنید.

چرا برخی کوپن‌ها فقط برای کاربران لاگین‌شده کار می‌کنند؟

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

چگونه بفهمم خطای کوپن از کدام افزونه است؟

روش حذف تدریجی، دقیق‌ترین راه است: ابتدا تمام افزونه‌ها را غیرفعال کنید، فقط ووکامرس را نگه دارید، تست بگیرید و سپس افزونه‌ها را یکی‌یکی فعال کنید. در لاگ ووکامرس و کنسول مرورگر هم نام فایل اسکریپت مقصر غالباً دیده می‌شود.

آیا کوپن روی هزینه‌ی ارسال اعمال می‌شود؟

به‌صورت پیش‌فرض، کوپن روی هزینه‌ی ارسال اعمال نمی‌شود؛ فقط روی قیمت محصولات. اگر می‌خواهید تخفیف شامل هزینه‌ی ارسال هم بشود، به افزونه‌ی سفارشی یا کد اختصاصی نیاز دارید. توجه کنید که این کار ممکن است با منطق محاسبه‌ی مالیات تداخل داشته باشد.

چرا کوپن‌های انبوه من پس از واردات CSV کار نمی‌کنند؟

سه دلیل رایج: ناهماهنگی ساختار CSV با نمونه‌ی صادرات ووکامرس، رمزگذاری نادرست فایل، و تکرار کد کوپن در فایل. پیش از واردات کامل، همیشه یک نسخه‌ی کوچک (مثلاً ۱۰ کوپن) را در محیط استیجینگ تست کنید.

چگونه کوپن‌های منقضی را از دیتابیس حذف کنیم؟

پاک‌سازی کوپن‌های منقضی به‌صورت دستی باید با احتیاط انجام شود. حذف کوپن‌ها از جدول wp_posts نیاز به حذف همزمان متادیتای مرتبط در wp_postmeta و روابط در wp_term_relationships دارد. توصیه می‌کنم قبل از هر پاک‌سازی، بکاپ کامل بگیرید و از اسکریپت‌های استاندارد استفاده کنید. مباحث مرتبط با نگهداری دیتابیس در رفع خطاهای رایج ووکامرس پوشش داده شده است.

آیا افزونه‌ی کش می‌تواند باعث خطای کوپن شود؟

بله. اگر افزونه‌ی کش، پاسخ AJAX مربوط به کوپن را کش کند، کاربر همیشه پاسخ اول را می‌بیند و به‌نظر می‌رسد که کوپن‌های جدید کار نمی‌کنند. راه‌حل: درخواست‌های admin-ajax.php مربوط به کوپن را از کش مستثنی کنید.

چرا کوپن در موبایل اعمال می‌شود ولی در دسکتاپ نه؟

این الگو معمولاً به سه دلیل است: اول، کوکی‌های سشن در موبایل مسدود هستند و سبد با کوپن از دست می‌رود. دوم، قالب موبایل، فرم کوپن را با ساختار متفاوتی رندر می‌کند. سوم، افزونه‌ی کش برای موبایل رفتار متفاوتی دارد. تست با قالب پیش‌فرض و بررسی لاگ، سریع‌ترین راه تشخیص است.

آنچه سال‌ها رفع خطای کوپن به من آموخته

در پایان این مقاله، سه نکته‌ای را می‌گویم که در مستندات رسمی ووکامرس کم‌تر به آن‌ها اشاره می‌شود ولی در پروژه‌های واقعی بارها به کارم آمده:

نخست: قبل از هر تغییری در تنظیمات کوپن‌های فعال، همیشه یک کوپن تستی بسازید و رفتار آن را در سه سناریو بسنجید — سبد با یک محصول، سبد با چند محصول، و سبد با محصول حراج. این تست سه‌گانه، نیمی از خطاهای احتمالی را پیش از اثرگذاری روی کمپین اصلی پیدا می‌کند.

دوم: برای کوپن‌های کمپین‌های حساس، همیشه یک کوپن پشتیبان (fallback) بسازید که در صورت بروز مشکل، به‌سرعت جایگزین شود. تفاوت یک کمپین موفق و یک کمپین شکست‌خورده، غالباً در همین آمادگی پیش از بحران است.

سوم: کوپن‌ها را به‌عنوان بخشی از زیرساخت فروشگاه در نظر بگیرید، نه به‌عنوان یک ویژگی جانبی. ابزارهای پایش، بکاپ منظم، و مستندسازی قواعد کوپن، به‌مرور زمان از بروز خطاهای پرهزینه جلوگیری می‌کنند. راهنمای بکاپ فروشگاه در بکاپ‌گیری از فروشگاه ووکامرس آمده است.

در تجربه‌ی چند ساله‌ام روی فروشگاه‌های ووکامرسی، الگویی که بارها تکرار شده این است که خطاهای کوپن، به‌ندرت تک‌علتی هستند. غالباً ترکیبی از یک محدودیت محصول، یک تنظیم مالیات نادرست و یک افزونه‌ی کش نادرست پشت یک پیام عمومی پنهان شده‌اند. تشخیص دقیق، همیشه سریع‌تر از وصل کردن راه‌حل‌های آماده است.

اگر روی فروشگاه‌تان با نوعی از خطای کوپن مواجه شده‌اید که در این مقاله پوشش داده نشده، یا اگر راه‌حل متفاوتی پیدا کرده‌اید، تجربه‌تان را در دیدگاه‌ها بنویسید. مشخصاً اگر پیام خطا، تنظیمات کوپن و روش تشخیصی که به‌کارتان آمده را با جزئیات یادداشت کنید، برای صاحب فروشگاه بعدی ساعت‌ها زمان صرفه‌جویی خواهد کرد. 🎟️