مشتری محصول را به سبد اضافه می‌کند، به صفحه پرداخت می‌رود، فرم را پر می‌کند، روی دکمه «ثبت سفارش» کلیک می‌کند و — هیچ اتفاقی نمی‌افتد. یا لودینگ چرخ می‌زند و ناپدید می‌شود بدون هیچ پیامی. یا پیام «خطا در ثبت سفارش» ظاهر می‌شود بدون جزئیات. اگر با خطای عدم کارکرد صفحه پرداخت ووکامرس روبرو هستید، این مقاله همان مسیری را طی می‌کند که در سال‌ها کار روی صدها فروشگاه اینترنتی ووکامرس بارها پیموده‌ام. صفحه پرداخت، آخرین و حساس‌ترین نقطه در قیف فروش است: اگر از کار بیفتد، همه سرمایه‌گذاری بازاریابی شما در همان قدم آخر بی‌اثر می‌شود. در عمل این خطا همیشه در یکی از پنج لایه مشخص ریشه دارد: پیکربندی نادرست صفحه تسویه‌حساب و شورت‌کد، مشکل در درگاه پرداخت و تنظیمات آن، تعارض نشست و کوکی و کش، خطا در REST API و AJAX، و تعارض با افزونه یا قالب. اگر این پنج لایه را به ترتیب بررسی کنید، تقریباً همیشه به علت دقیق می‌رسید بدون آنکه ساعت‌ها وقت خود را صرف آزمون‌وخطا کنید.

صفحه پرداخت کار نمی‌کند — تفکیک نشانه‌ها

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

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

در عیب‌یابی صفحه پرداخت، اولین سؤال این نیست که «چرا دکمه کار نمی‌کند» بلکه این است «در کدام مرحله از چرخه پرداخت، فرآیند متوقف می‌شود؟» — در زمان نمایش فرم، در زمان کلیک روی دکمه، در زمان ثبت سفارش، در زمان انتقال به درگاه، یا در زمان بازگشت از درگاه. هر مرحله، لایه متفاوتی دارد.

فرآیند پرداخت در ووکامرس چطور کار می‌کند؟

فرآیند پرداخت در ووکامرس از پنج مرحله مستقل تشکیل شده که باید با هم هماهنگ باشند. مرحله اول: بارگذاری فرم تسویه‌حساب که شامل فیلدهای آدرس، روش ارسال، روش پرداخت، و خلاصه سفارش است. مرحله دوم: اعتبارسنجی سمت کلاینت که فیلدهای اجباری را بررسی می‌کند. مرحله سوم: ارسال درخواست به سرور برای ثبت سفارش که معمولاً از طریق wc-ajax=checkout یا REST API مسیر /wp-json/wc/store/v1/checkout انجام می‌شود. مرحله چهارم: پردازش پرداخت که بسته به درگاه، به‌صورت مستقیم یا با انتقال به سایت درگاه انجام می‌شود. مرحله پنجم: بازگشت از درگاه و تکمیل ثبت سفارش که با callback درگاه انجام می‌شود. اگر هر یک از این پنج مرحله شکست بخورد، تجربه مشتری ناقص می‌ماند. برای مرور معماری کلی ووکامرس، تنظیمات اولیه ووکامرس برای ساخت فروشگاه پیش‌زمینه خوبی می‌دهد.

نکته حساس که در پروژه‌های واقعی بارها دیده‌ام: ووکامرس از دو مکانیزم متفاوت برای پردازش استفاده می‌کند — سیستم کلاسیک که بر پایه AJAX و wc-ajax=checkout است، و سیستم مدرن که بر پایه REST API و Block Checkout است. اگر سایت شما از Block Checkout استفاده می‌کند ولی افزونه‌ای با آن سازگار نباشد، پرداخت شکست می‌خورد. مسئله ظریف دیگر: ووکامرس برای حفظ سبد در طول فرآیند پرداخت، به کوکی نشست وابسته است. اگر این کوکی در انتقال به درگاه یا بازگشت از آن از دست برود، سفارش ثبت نمی‌شود و مشتری با سبد خالی به سایت برمی‌گردد. مبانی مدیریت نشست و پرداخت در مقالات تخصصی ووکامرس آمده است.

مرحلهمسئولیتنشانه خطا
بارگذاری فرمشورت‌کد یا بلوک Checkoutصفحه باز نمی‌شود یا ناقص است
اعتبارسنجی کلاینتJavaScript فیلدهادکمه واکنش نمی‌دهد
ارسال به سرورwc-ajax=checkout یا REST APIلودینگ بدون پیام
پردازش پرداختدرگاه پرداختخطای درگاه یا ریدایرکت ناموفق
بازگشت از درگاهCallback درگاهسفارش ثبت نشده

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

لایه اول — پیکربندی صفحه تسویه‌حساب و شورت‌کد

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

پیکربندی صفحه تسویه‌حساب در تنظیمات ووکامرس

ووکامرس برای نمایش فرم پرداخت، به یک صفحه معتبر نیاز دارد که در آن شورت‌کد [woocommerce_checkout] یا بلوک Checkout قرار گرفته باشد. اگر این صفحه حذف شده باشد یا شورت‌کد در آن نباشد، فرم پرداخت نمایش داده نمی‌شود. راه‌حل: به «ووکامرس ← تنظیمات ← پیشرفته» بروید و در بخش «صفحات» بررسی کنید که صفحه تسویه‌حساب به یک صفحه معتبر اشاره می‌کند. اگر صفحه حذف شده، روی گزینه «نصب صفحات» کلیک کنید تا ووکامرس صفحات سیستمی را بازسازی کند. سپس در ویرایش همان صفحه، مطمئن شوید شورت‌کد [woocommerce_checkout] در محتوا وجود دارد. برای مرور کامل تنظیمات، تنظیمات اولیه ووکامرس برای ساخت فروشگاه را ببینید.

دسترسی به صفحه تسویه‌حساب با سبد خالی

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

فایل‌های template قالب و ووکامرس

ووکامرس فایل‌های template تسویه‌حساب را در مسیر plugins/woocommerce/templates/checkout/ نگه می‌دارد. قالب شما می‌تواند این فایل‌ها را در پوشه yourtheme/woocommerce/checkout/ override کند. اگر این فایل‌ها نسخه قدیمی باشند، ممکن است فرم پرداخت نمایش داده نشود یا خطای PHP در هنگام رندر رخ دهد. نشانه: در پیشخوان پیام Your theme contains outdated copies of some WooCommerce template files می‌بینید. راه‌حل: یا فایل‌های override قالب را حذف کنید و از نسخه پیش‌فرض ووکامرس استفاده کنید، یا آن‌ها را با نسخه جدید به‌روز کنید. برای مرور کامل این مسئله، رفع خطاهای رایج ووکامرس را ببینید. همچنین اگر با خطاهای template و قالب در بافت ووکامرس دست‌وپنجه نرم می‌کنید، خطای قالب در ووکامرس و راه حل آن به‌طور اختصاصی این موضوع را بررسی کرده است.

تعارض با صفحه‌سازها

اگر از صفحه‌ساز (Elementor، Divi یا WPBakery) برای طراحی صفحه تسویه‌حساب استفاده می‌کنید، ممکن است صفحه با صفحه‌ساز بازنویسی شده و شورت‌کد ووکامرس در آن نباشد. نشانه: صفحه تسویه‌حساب به‌جای نمایش فرم، بخش‌های طراحی‌شده صفحه‌ساز را نشان می‌دهد. راه‌حل: صفحه تسویه‌حساب باید حتماً از شورت‌کد [woocommerce_checkout] یا بلوک Checkout ووکامرس استفاده کند، نه از طراحی صفحه‌ساز. اگر با صفحه‌ساز طراحی کرده‌اید، در همان ویرایشگر، ویجت یا بلوک Checkout ووکامرس را اضافه کنید. برای مرور سازگاری صفحه‌سازها با ووکامرس، بررسی سازگاری قالب با افزونه‌ها را ببینید.

ریدایرکت HTTPS و Mixed Content

اگر سایت شما روی HTTPS است ولی صفحه تسویه‌حساب به‌دلیل تنظیمات نادرست URL، به نسخه HTTP ریدایرکت می‌شود یا فایل‌های آن با HTTP بارگذاری می‌شوند، مرورگر بخشی از فرم را بلاک می‌کند. نشانه: در کنسول مرورگر، پیام Mixed Content: The page was loaded over HTTPS but requested an insecure resource. راه‌حل: در wp-config.php، مقادیر WP_HOME و WP_SITEURL را با https:// تنظیم کنید، سپس در دیتابیس تمام URLهای http:// را با ابزار safe search-replace به https:// تبدیل کنید. اصول HTTPS وردپرس در HTTPS چیست و چه تفاوتی با HTTP دارد آمده است.

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

لایه دوم — درگاه پرداخت و تنظیمات آن

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

پیکربندی درگاه پرداخت در ووکامرس

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

افزونه درگاه پرداخت ایرانی

اگر از یک درگاه پرداخت ایرانی (زرین‌پال، آیدی‌پی، پی‌پینگ، سامان و…) استفاده می‌کنید، احتمال تعارض با نسخه فعلی ووکامرس یا وردپرس بیشتر است. نشانه: هنگام انتخاب درگاه و کلیک روی «ثبت سفارش»، صفحه به درگاه منتقل نمی‌شود یا با خطای ۵۰۰ برمی‌گردد. راه‌حل: افزونه درگاه را به آخرین نسخه به‌روز کنید. اگر نسخه جدید مشکل داشت، با نسخه قبلی تست کنید. برخی افزونه‌های درگاه ایرانی، سازگاری با Block Checkout ندارند و باید از Checkout سنتی استفاده کنید. مسیر کامل در اتصال ووکامرس به درگاه‌های پرداخت آمده است.

تنظیمات callback و return URL

پس از پرداخت در درگاه، مشتری باید به سایت شما بازگردد و سفارش ثبت شود. اگر URL بازگشت (callback) در تنظیمات درگاه نادرست باشد، مشتری به صفحه‌ای می‌رود که نمی‌شناسد و سفارش ثبت نمی‌شود. نشانه: پرداخت در درگاه موفق است ولی در سایت، سفارش در وضعیت «در انتظار پرداخت» می‌ماند. راه‌حل: در تنظیمات افزونه درگاه، URL بازگشت را بررسی کنید. برخی درگاه‌ها URL بازگشت را از خود ووکامرس می‌خوانند و برخی نیاز به تنظیم دستی دارند. اگر سایت شما فایروال یا WAF دارد، مطمئن شوید که IP درگاه پرداخت در لیست سفید است.

روش‌های ارسال و محاسبه هزینه

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

محاسبه مالیات و قوانین آن

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

لایه سوم — نشست، کوکی، کش و CDN

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

کش صفحه تسویه‌حساب

اگر افزونه کش صفحه، صفحه تسویه‌حساب را کش کند، مشتری ممکن است نسخه کش‌شده بدون نشست را دریافت کند و فرم پرداخت به‌درستی کار نکند. راه‌حل: صفحه تسویه‌حساب، صفحه سبد، و صفحه حساب کاربری باید حتماً از کش صفحه مستثنا شوند. در افزونه‌های کش محبوب مثل WP Rocket و LiteSpeed، این تنظیمات در بخش «ووکامرس» به‌طور پیش‌فرض فعال است. برای مرور دقیق این تنظیمات، بهترین افزونه‌های کش وردپرس را ببینید.

کوکی SameSite و مرورگرهای مدرن

از سال ۲۰۲۰، مرورگرها کوکی‌ها را با SameSite=Lax ذخیره می‌کنند که در بافت ووکامرس می‌تواند باعث شود کوکی نشست در انتقال به درگاه یا بازگشت از آن از دست برود و سفارش ثبت نشود. این مسئله در فروشگاه‌هایی که روی زیر‌دامنه یا با ریدایرکت HTTPS کار می‌کنند شایع‌تر است. راه‌حل: در فایل functions.php قالب فرزند، فیلتر مربوط به SameSite را تنظیم کنید. اگر فروشگاه شما روی HTTPS کار می‌کند و انتقال به درگاه بین دامنه‌های مختلف انجام می‌شود، ممکن است لازم باشد مقدار را روی None و secure = true تنظیم کنید.

افزونه‌های امنیتی و مسدودسازی callback درگاه

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

مدت اعتبار نشست و رفتار کاربر

ووکامرس به‌طور پیش‌فرض نشست کاربران مهمان را برای ۴۸ ساعت نگه می‌دارد. اگر این مقدار کم باشد یا PHP Session پاک شود، سبد مشتری در میانه فرآیند پرداخت خالی می‌شود. راه‌حل: در «ووکامرس ← تنظیمات ← محصولات»، گزینه «مدت اعتبار سبد خرید» را بررسی کنید. همچنین در فایل php.ini سرور، مقدار session.gc_maxlifetime باید با این تنظیم هم‌خوانی داشته باشد.

CDN و کوکی‌های ووکامرس

اگر از CDN استفاده می‌کنید، ممکن است CDN کوکی‌های ووکامرس را در خودش ذخیره یا نادیده بگیرد. نتیجه: مشتری پس از بازگشت از درگاه، سبدش خالی به نظر می‌رسد. راه‌حل: در تنظیمات CDN، مسیرهای /checkout/، /cart/ و /my-account/ را از کش مستثنا کنید و مطمئن شوید کوکی‌های نشست به مبدأ اصلی forward می‌شوند. برای مرور دقیق نقش CDN، CDN چگونه سرعت سایت را بهبود می‌دهد را ببینید.

لایه چهارم — REST API، AJAX و Block Checkout

لایه چهارم جایی است که صفحه پرداخت ظاهراً درست بارگذاری می‌شود ولی هنگام کلیک روی دکمه «ثبت سفارش»، درخواست به سرور نمی‌رسد یا پاسخ نادرست دریافت می‌شود. این لایه در فروشگاه‌هایی که از Block Checkout ووکامرس مدرن استفاده می‌کنند شایع‌تر است.

فراخوانی wc-ajax=checkout

ووکامرس کلاسیک از یک مکانیزم به نام wc-ajax=checkout برای ثبت سفارش استفاده می‌کند. این درخواست به مسیر /?wc-ajax=checkout می‌رود و اگر مسدود شود یا پاسخ نادرست بدهد، دکمه «ثبت سفارش» واکنش نشان نمی‌دهد. راه تشخیص: در تب Network مرورگر، فیلتر wc-ajax را اعمال کنید و روی دکمه کلیک کنید. ببینید آیا درخواست با کد ۲۰۰ پاسخ می‌گیرد و پاسخش JSON دارد یا نه. اگر کد ۴۰۳ یا ۴۰۴ دیدید، مسئله در مسیر یا احراز است. اگر پاسخ خالی یا خطای ۵۰۰ دیدید، مسئله در کد سمت سرور است.

REST API ووکامرس و Block Checkout

از ووکامرس ۷.۰ به بعد، Block Checkout به‌طور پیش‌فرض ارائه می‌شود که بر پایه React و REST API کار می‌کند. اگر سایت شما از Block Checkout استفاده می‌کند، درخواست‌ها به مسیر /wp-json/wc/store/v1/checkout می‌رود. اگر این مسیر توسط افزونه امنیتی یا فایل .htaccess مسدود شده باشد، پرداخت کار نمی‌کند. نشانه: در کنسول مرورگر، خطای Failed to fetch یا 403 Forbidden برای درخواست‌های REST API. راه‌حل: مسیر /wp-json/wc/store/ را در تنظیمات افزونه امنیتی استثنا کنید. برای مرور معماری REST API ووکامرس، اتصال ووکامرس به سرویس‌های خارجی با API را ببینید.

nonce و امنیت پرداخت

Block Checkout ووکامرس از nonce برای امنیت درخواست‌ها استفاده می‌کند. اگر nonce منقضی شود یا با سشن مشتری هم‌خوانی نداشته باشد، درخواست پرداخت رد می‌شود. نشانه: پیام Invalid nonce یا Security check failed. راه‌حل: صفحه تسویه‌حساب را از کش مستثنا کنید، سپس بررسی کنید که افزونه امنیتی، nonce را مسدود نمی‌کند. اگر از CDN استفاده می‌کنید، مطمئن شوید که nonce در پاسخ سرو شده از CDN با سشن مشتری هم‌خوانی دارد.

خطاهای JavaScript در کنسول

اولین گام در تشخیص این لایه، باز کردن کنسول مرورگر است. روی دکمه «ثبت سفارش» کلیک کنید و خطاهای قرمز را بررسی کنید. خطاهای رایج شامل Uncaught TypeError: Cannot read property 'ajax_url' of undefined، Uncaught ReferenceError: wc_checkout_params is not defined و Uncaught TypeError: fetch is not a function است. هرکدام از این خطاها به یک نقطه شکست متفاوت اشاره دارد. اگر در بافت بزرگ‌تر با خطاهای JS ووکامرس دست‌وپنجه نرم می‌کنید، خطای عدم بارگذاری JS افزونه راهنمای کاملی است.

بارگذاری نادرست اسکریپت‌های ووکامرس

ووکامرس برای پرداخت، به اسکریپت‌های wc-checkout، wc-cart-fragments و wc-order-attribution وابسته است. اگر این اسکریپت‌ها به‌دلیل تنظیمات نادرست افزونه بهینه‌ساز بارگذاری نشوند یا defer شوند، فرآیند پرداخت کار نمی‌کند. راه‌حل: در تنظیمات افزونه بهینه‌ساز، این اسکریپت‌ها را از فرآیند minify، combine و defer استثنا کنید.

لایه پنجم — تعارض افزونه، قالب و template override

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

تعارض با افزونه‌های دیگر

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

تعارض قالب و فایل‌های template override

اگر قالب شما فایل‌های تسویه‌حساب ووکامرس (مثل checkout/form-checkout.php، checkout/review-order.php، checkout/payment.php) را override کرده و این فایل‌ها با نسخه جدید ووکامرس هم‌خوانی نداشته باشند، ممکن است فرم پرداخت رندر نشود یا خطای PHP رخ دهد. نشانه: در پیشخوان پیام Your theme contains outdated copies of some WooCommerce template files می‌بینید. راه‌حل: فایل‌های override را با نسخه جدید به‌روز کنید یا آن‌ها را حذف کنید. مرور کامل در رفع خطاهای رایج ووکامرس و خطای قالب در ووکامرس و راه حل آن آمده است.

سفارشی‌سازی نادرست صفحه تسویه‌حساب

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

تعارض با افزونه‌های عضویت و اشتراک

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

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

چک‌لیست دیباگ گام‌به‌گام صفحه پرداخت

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

  1. بررسی پیکربندی صفحه تسویه‌حساب: در «ووکامرس ← تنظیمات ← پیشرفته»، بررسی کنید که صفحه تسویه‌حساب به صفحه معتبر با شورت‌کد [woocommerce_checkout] اشاره می‌کند.
  2. تست با محصول ساده: یک محصول ساده و رایگان بسازید و با آن تست کنید. اگر پرداخت با محصول رایگان کار می‌کند ولی با محصول پرداختی نه، مسئله در درگاه پرداخت است.
  3. تست در پنجره ناشناس: با مرورگر Incognito تست کنید. اگر در پنجره ناشناس کار کرد، مسئله کش مرورگر یا کوکی است.
  4. بررسی تب Network: فیلتر wc-ajax یا /wp-json/wc/store را اعمال کنید و روی دکمه «ثبت سفارش» کلیک کنید. ببینید درخواست‌ها با کد ۲۰۰ پاسخ می‌گیرند یا نه.
  5. بررسی کنسول مرورگر: خطاهای JavaScript را بررسی کنید. خطاهای مربوط به wc_checkout_params یا fetch سرنخ اصلی هستند.
  6. فعال‌سازی WP_DEBUG: در wp-config.php مقادیر WP_DEBUG، WP_DEBUG_LOG و WP_DEBUG_DISPLAY را تنظیم کنید و لاگ را در wp-content/debug.log بررسی کنید.
  7. غیرفعال کردن افزونه‌های امنیتی و کش: افزونه‌های امنیتی و کش را موقتاً غیرفعال کنید و تست بگیرید. اگر پرداخت کار کرد، در تنظیمات همان افزونه، مسیرهای /?wc-ajax= و /wp-json/wc/store/ را استثنا کنید.
  8. تست با قالب پیش‌فرض: قالب Twenty Twenty-Five را موقتاً فعال کنید (با ووکامرس). اگر پرداخت کار کرد، مسئله در قالب است.
  9. بررسی template override: پوشه yourtheme/woocommerce/checkout/ را بررسی کنید و اگر فایل‌های قدیمی دارد، آن‌ها را حذف یا به‌روز کنید.
  10. غیرفعال کردن افزونه‌های دیگر: همه افزونه‌ها را غیرفعال کنید، فقط ووکامرس را فعال کنید، و تست بگیرید. سپس یکی‌یکی فعال کنید تا مقصر پیدا شود. الگوی کامل در چگونه افزونه مشکل‌ساز وردپرس را پیدا کنیم آمده است.
  11. تست درگاه در حالت تست: اگر افزونه درگاه حالت تست دارد، در حالت تست با کلیدهای تستی کار کنید و ببینید پرداخت کامل می‌شود یا نه.
  12. تست روی محیط استجینگ: اگر روی محیط محلی کار می‌کند ولی روی سرور نه، تفاوت‌های محیطی را بررسی کنید. ساخت محیط استجینگ در توسعه وردپرس با محیط لوکال توصیه می‌شود.

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

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

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

چرا دکمه «ثبت سفارش» در ووکامرس واکنش نمی‌دهد؟

چهار علت رایج. اول، اسکریپت ووکامرس wc-checkout بارگذاری نمی‌شود — معمولاً به‌دلیل تنظیمات افزونه بهینه‌ساز. دوم، خطای JavaScript در کنسول مرورگر وجود دارد که فرآیند را متوقف می‌کند. سوم، درخواست به مسیر /?wc-ajax=checkout یا /wp-json/wc/store/v1/checkout توسط افزونه امنیتی مسدود شده. چهارم، فیلدهای اجباری فرم ناقص پر شده ولی پیام خطا نمایش داده نمی‌شود. راه‌حل: کنسول مرورگر را باز کنید و تب Network را بررسی کنید.

چرا پس از پرداخت در درگاه، سفارش ثبت نمی‌شود؟

سه علت اصلی. اول، URL بازگشت از درگاه (callback) نادرست تنظیم شده یا توسط فایروال بلاک می‌شود. دوم، کوکی نشست مشتری در انتقال به درگاه و بازگشت از آن از دست می‌رود، معمولاً به‌دلیل SameSite یا ITP مرورگر. سوم، IP درگاه پرداخت در لیست سیاه افزونه امنیتی قرار گرفته و درخواست callback مسدود می‌شود. راه‌حل: در تنظیمات درگاه پرداخت، URL بازگشت را بررسی کنید و در افزونه امنیتی، IP درگاه را در لیست سفید قرار دهید.

چرا صفحه تسویه‌حساب با خطای ۵۰۰ برمی‌گردد؟

خطای ۵۰۰ معمولاً به‌دلیل خطای PHP در کد سفارشی یا افزونه‌ای که با نسخه فعلی ووکامرس سازگاری ندارد رخ می‌دهد. راه‌حل: WP_DEBUG را فعال کنید و لاگ wp-content/debug.log را بررسی کنید. خطای دقیق در لاگ نوشته شده و مسیر تشخیص را کوتاه می‌کند. اگر خطا از افزونه درگاه پرداخت است، نسخه افزونه را به‌روز یا به نسخه قبلی برگردانید.

چرا صفحه پرداخت در Block Checkout کار می‌کند ولی در Checkout سنتی نه؟

Block Checkout از REST API ووکامرس استفاده می‌کند و مسیر /wp-json/wc/store/v1/checkout را می‌بیند. Checkout سنتی از /?wc-ajax=checkout استفاده می‌کند. اگر مسیر wp-json مسدود باشد ولی wc-ajax نه، نتیجه همین تفاوت است. راه‌حل: هر دو مسیر را در تنظیمات افزونه امنیتی و فایل .htaccess بررسی کنید.

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

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

چرا صفحه پرداخت فقط در موبایل کار نمی‌کند؟

سه علت اصلی. اول، قالب شما در موبایل، فرم تسویه‌حساب را به‌دلیل تنظیمات CSS ناقص نمایش می‌دهد. دوم، افزونه کش نسخه موبایل و دسکتاپ را متفاوت سرو می‌کند و نسخه موبایل خالی است. سوم، اسکریپت ووکامرس در موبایل به‌دلیل تنظیمات بهینه‌ساز بارگذاری نمی‌شود. راه تشخیص: با Chrome DevTools به حالت موبایل بروید و تب Network را بررسی کنید.

چرا خطای «Invalid payment method» می‌گیرم؟

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

چرا پس از زدن دکمه «ثبت سفارش»، صفحه رفرش می‌شود ولی سفارش ثبت نمی‌شود؟

این نشانه معمولاً به خطای AJAX یا REST API برمی‌گردد. اگر درخواست به سرور نرسد یا پاسخ نادرست بگیرد، صفحه رفتار پیش‌فرض مرورگر (ارسال فرم) را انجام می‌دهد که نتیجه‌اش رفرش بدون ثبت سفارش است. راه‌حل: در تب Network مرورگر، درخواست AJAX یا REST را بررسی کنید و خطای دقیق را ببینید. اگر خطای CORS یا ۴۰۳ دیدید، مسئله در تنظیمات سرور یا افزونه امنیتی است.

آیا افزونه‌های نال می‌توانند باعث خرابی صفحه پرداخت شوند؟

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

آیا می‌توانم صفحه پرداخت را از کش مستثنا کنم؟

بله و این کار ضروری است. در همه افزونه‌های کش محبوب، امکان استثنا کردن مسیرهای خاص وجود دارد. مسیرهای /checkout/، /cart/ و /my-account/ را در تنظیمات کش وارد کنید. اگر افزونه کش شما این قابلیت را ندارد، افزونه را با نسخه جدیدتر جایگزین کنید. برای مرور دقیق، بهترین افزونه‌های کش وردپرس را ببینید.

آیا مشکل صفحه پرداخت می‌تواند به نسخه PHP مربوط باشد؟

بله. ووکامرس مدرن به PHP 7.4 یا بالاتر نیاز دارد. اگر سرور شما روی PHP 7.2 یا پایین‌تر اجرا می‌شود، ممکن است فرآیند پرداخت به‌دلیل ناسازگاری با کد ووکامرس کار نکند. همچنین در PHP 8.x، برخی افزونه‌های درگاه پرداخت قدیمی با تغییرات syntax سازگار نیستند و خطای فاتال می‌دهند. راه‌حل: نسخه PHP را به 8.0 یا بالاتر ارتقا دهید و افزونه‌های درگاه را به آخرین نسخه به‌روز کنید. پیش از ارتقا، از سایت بکاپ بگیرید و روی محیط استجینگ تست کنید.

معماری پایدار برای صفحه پرداخت مطمئن

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

  1. صفحات پرداخت را از کش مستثنا کنید: صفحات تسویه‌حساب، سبد و حساب کاربری باید همیشه از کش صفحه مستثنا باشند. این تنظیم در همه افزونه‌های کش محبوب به‌طور پیش‌فرض فعال است؛ اگر غیرفعال است، فعالش کنید.
  2. اسکریپت‌های ووکامرس را از بهینه‌سازی تهاجمی مستثنا کنید: فایل‌های wc-checkout.js، wc-cart-fragments.js و checkout-block.js باید از minify، combine و defer استثنا شوند.
  3. کوکی SameSite را درست تنظیم کنید: مقدار SameSite=Lax برای اکثر فروشگاه‌ها کافی است. اگر درگاه پرداخت روی دامنه متفاوتی است و انتقال بین دامنه‌ها انجام می‌شود، مقدار None با HTTPS الزامی است.
  4. افزونه‌های امنیتی را برای ووکامرس تنظیم کنید: مسیر /?wc-ajax= و /wp-json/wc/store/ و IP درگاه پرداخت باید در تنظیمات افزونه امنیتی استثنا شوند.
  5. فایل‌های template override را به‌روز نگه دارید: در قالب فرزند، فایل‌های override ووکامرس را دوره‌ای بازبینی کنید و با نسخه جدید هم‌راستا کنید.
  6. پایش خودکار صفحه پرداخت: یک اسکریپت ساده بنویسید که هر ساعت یک سفارش آزمایشی در حالت تست ثبت کند و بررسی کند که فرآیند پرداخت تا آخر کار می‌کند یا نه. این کار جلوی «ماه‌ها فروش صفر» را می‌گیرد.
  7. پشتیبان‌گیری منظم از دیتابیس: اگر فروشگاه شما به مشکل خورد، بکاپ تازه بازگردانی سریع را ممکن می‌کند. اصول پشتیبان‌گیری در بکاپ‌گیری از فروشگاه ووکامرس آمده است.
  8. تست روی مرورگرهای مختلف: صفحه پرداخت را در Chrome، Safari، Firefox و حالت موبایل تست کنید. تفاوت‌های مرورگرها می‌تواند مشکلات را زودتر آشکار کند.
  9. تست روی محیط استجینگ: پیش از هر تغییر در افزونه کش، امنیتی یا درگاه پرداخت، روی محیط استجینگ با همان پیکربندی سرور تست کنید. مراحل ساخت و استفاده از استجینگ در تست و دیباگ پروژه‌های توسعه وردپرس آمده است.
  10. رعایت استانداردهای کدنویسی: اگر کد سفارشی روی فرآیند پرداخت می‌نویسید، اصول استاندارد را رعایت کنید. مرور اصول در استانداردهای کدنویسی وردپرس چیست و کاربرد عملی در استفاده از WordPress Coding Standards در پروژه‌ها آمده است.

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

سخن پایانی

خطای عدم کارکرد صفحه پرداخت ووکامرس، در نگاه اول یکی از پرهزینه‌ترین انواع خطا در فروشگاه‌های اینترنتی است چون مستقیماً جلوی نهایی‌شدن فروش را می‌گیرد. این خطا در عمل همیشه در یکی از پنج لایه‌ای که در این مقاله بررسی کردیم ریشه دارد: پیکربندی نادرست صفحه تسویه‌حساب و شورت‌کد، مشکل در درگاه پرداخت و تنظیمات آن، تعارض نشست و کوکی و کش، خطا در REST API و AJAX و Block Checkout، و تعارض با افزونه یا قالب. ابزار اصلی عیب‌یابی در این بافت، ترکیب سه چیز است: تب Network مرورگر برای بررسی درخواست‌های AJAX و REST، کنسول مرورگر برای دیدن خطاهای JavaScript، و لاگ WP_DEBUG برای خطاهای PHP. مسیر عیب‌یابی که در چک‌لیست ارائه کردم، همان ترتیبی است که در پروژه‌های واقعی مرا سریع به علت رسانده؛ نکته کلیدی این است که از ارزان‌ترین گام شروع کنید و به گران‌ترین برسید. در بلندمدت، انضباط در استثنا کردن صفحه پرداخت از کش، تنظیم درست کوکی SameSite، استثنای اسکریپت‌های ووکامرس از بهینه‌سازی تهاجمی، و پایش خودکار فرآیند پرداخت، مهم‌تر از هر راه‌حل لحظه‌ای است — چون این انضباط است که اجازه نمی‌دهد آخرین قدم مشتری در قیف فروش، به بن‌بست تبدیل شود.

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