صفحه سبد خرید شما ۶ ثانیه لود میشود و مشتری رفته است
همین الان صفحه /cart سایت شما را باز کنید. اگر بین ۳ تا ۸ ثانیه طول میکشد تا سبد و دکمه تسویه کامل بیاید، مشتری همانجا صفحه را میبندد. این فقط یک شهود نیست؛ داده گوگل میگوید ۵۳٪ بازدیدهای موبایل با لود بالای ۳ ثانیه رها میشوند. برای فروشگاه ووکامرس این عدد یعنی چرخ خرید رها شده، نه فقط یک بازدید کم.
مشکل کجاست؟ ووکامرس بهصورت پیشفرض کل صفحه سبد را با هر تغییر کوچک (تغییر تعداد، حذف آیتم، انتخاب روش حمل) از نو رندر میکند. این یعنی چند درخواست AJAX سنگین به سرور، هر کدام با کلی کوئری به دیتابیس. راه حل، تنظیم درست cart fragments است.
cart fragments چیست و چرا سایت شما را میکشد
ووکامرس برای بهروزرسانی سبد بدون رفرش کامل صفحه، از تکههایی به نام fragments استفاده میکند. هر fragment یک بخش از HTML است که بعد از تغییر در سبد باید دوباره لود شود. مشکل وقتی شروع میشود که افزونههای دیگر (مثل افزونه حملونقل یا کدهای سفارشی) fragmentهای جدیدی ثبت میکنند و ووکامرس مجبور میشود کل آن بخشها را با هر تغییر، دوباره از دیتابیس بخواند.
نشانه این مشکل را میشناسید؟ اگر با کروم DevTools به تب Network نگاه کنید و یک آیتم به سبد اضافه کنید، چند درخواست ?wc-ajax=add_to_cart میبینید که هر کدام ۱ تا ۲ ثانیه زمان میبرند. اینجا اشتباه میکنند: مدیر سایت فکر میکند مشکل از هاست است و به سراغ ارتقای پلن میرود، در حالی که مشکل، تعداد و حجم fragmentهای غیرضروری است.
کد تشخیص مشکل
این کد را در فایل functions.php قالب فرزند اضافه کنید تا ببینید چه fragmentهایی ثبت شدهاند:
add_action('wp_footer', function() {
if (is_cart() || is_checkout()) {
$fragments = WC_AJAX::get_refreshed_fragments();
echo '<!-- Fragments: ' . count($fragments) . ' -->';
}
});
اگر تعداد fragmentها بالای ۱۰ باشد، سایت شما دارد بیش از حد لازم کار میکند. حالت عادی بین ۴ تا ۷ fragment است.
تنظیم صحیح fragments؛ سه قدم عملی
قدم اول: فقط fragmentهایی را نگه دارید که واقعاً استفاده میشوند. اگر قالب شما تعداد آیتمهای سبد را در هدر نشان میدهد، به این fragment نیاز دارید. اگر نه، حذفش کنید:
add_filter('woocommerce_add_to_cart_fragments', function($fragments) {
// حذف fragment آمار سبد در هدر اگر استفاده نمیشود
unset($fragments['a.cart-contents']);
return $fragments;
});
قدم دوم: کشکردن صفحه سبد برای کاربران لاگیننکرده. ووکامرس بهصورت پیشفرض صفحه سبد را برای کاربران لاگینکرده کش نمیکند، چون اطلاعات هر کاربر متفاوت است. اما برای کاربران مهمان که هنوز لاگین نکردهاند، میتوانید کش را فعال کنید. اگر از افزونه کش مثل WP Rocket یا LiteSpeed Cache استفاده میکنید، گزینه «کش برای کاربران مهمان» را فعال کنید. این تنها کاری است که میتواند زمان لود صفحه سبد را تا ۴۰٪ کاهش دهد.
قدم سوم: غیرفعالکردن اسکریپتهای غیرضروری در صفحه سبد. ووکامرس اسکریپتهای زیادی را در همه صفحات لود میکند، حتی جایی که لازم نیستند. این کد فقط اسکریپتهای موردنیاز سبد را در همان صفحه لود میکند:
add_action('wp_enqueue_scripts', function() {
if (is_cart()) {
wp_dequeue_script('wc-checkout');
wp_dequeue_script('wc-city-select');
}
}, 20);
کش کردن صفحات تسویه؛ جایی که همه خطا میکنند
صفحه تسویه (/checkout) را هرگز بهصورت کامل کش نکنید. این صفحه شامل فرمهای امنیتی، فیلدهای پرداخت و توکنهای CSRF است که برای هر کاربر یکتا هستند. کش کردن آن یعنی مشتری بعدی فرمی را میبیند که توکنش منقضی شده و پرداخت با خطای «توکن نامعتبر است» شکست میخورد.
اما میتوانید بخشهای استاتیک صفحه تسویه را کش کنید: لوگو، متنهای راهنما، آیکونها. این کار را با کشکردن assetهای استاتیک (CSS و JS) انجام دهید، نه کل HTML صفحه. افزونههای کش معمولاً گزینه «حذف صفحه تسویه از کش» را دارند. اگر چنین گزینهای نمیبینید، این کد را به wp-config.php اضافه کنید:
define('DONOTCACHEPAGE', true);
این ثابت به همه افزونههای کش معتبر میگوید این صفحه را کش نکنند. اما اگر میخواهید فقط صفحه تسویه از کش خارج شود و بقیه سایت کش بماند، از فیلتر زیر استفاده کنید:
add_filter('woocommerce_checkout_redirect_empty_cart', function() {
if (!is_user_logged_in()) {
// کاربر مهمان را به صفحه سبد هدایت کن
return true;
}
return false;
});
نقش دیتابیس در سرعت ووکامرس؛ چیزی که کسی نگاه نمیکند
بعد از تنظیم fragments، نوبت به دیتابیس میرسد. ووکامرس برای هر درخواست AJAX چندین کوئری به جداول wp_options و wp_postmeta میزند. اگر فروشگاه شما بیش از ۱۰ هزار سفارش دارد و هر سفارش ۲۰ متادیتا، جدول wp_postmeta شما بیش از ۲۰۰ هزار ردیف دارد. بدون ایندکس مناسب، هر کوئری روی این جدول چند صد میلیثانیه طول میکشد.
این کوئری را در phpMyAdmin اجرا کنید تا ببینید کدام جدولها سنگیناند:
SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'MB'
FROM information_schema.tables
WHERE table_schema = 'your_db_name'
ORDER BY (data_length + index_length) DESC LIMIT 10;
اگر wp_postmeta بالای ۵۰۰ مگابایت است، وقت پاکسازی است. افزونههایی مثل WP-Optimize میتوانند متادیتاهای اورفان (ردیفهایی که به هیچ پستی وصل نیستند) را حذف کنند. این کار معمولاً حجم دیتابیس را ۲۰ تا ۳۰٪ کم میکند و سرعت کوئریها را بهطور محسوس بالا میبرد.
اندازهگیری قبل و بعد؛ بدون عدد، هیچ بهینهسازیای معنا ندارد
قبل از هر تغییری، یک اندازهگیری پایه بگیرید. از ابزارهای تست سرعت استفاده کنید و عدد TTFB (زمان تا اولین بایت) را یادداشت کنید. اگر TTFB بالای ۸۰۰ میلیثانیه است، مشکل از سمت سرور است و تنظیم fragments کمکی نمیکند. اول باید هاست را بررسی کنید.
بعد از اعمال تغییرات، دوباره اندازه بگیرید. عددی که باید ببینید: TTFB زیر ۴۰۰ میلیثانیه و زمان لود کامل صفحه سبد زیر ۲ ثانیه. اگر به این عدد نرسیدید، دو احتمال وجود دارد: یا افزونه سنگینی دارید که درخواستهای خارجی (مثل تماس با APIهای شخص ثالث) میفرستد، یا قالب شما دارد اسکریپتهای غیرضروری لود میکند.
برای تشخیص، کروم DevTools را باز کنید، تب Performance را بزنید و صفحه سبد را رفرش کنید. دنبال درخواستهایی بگردید که بیش از ۵۰۰ میلیثانیه طول میکشند. معمولاً مقصر، درخواست به دامنههای خارجی است (مثل فونتهای گوگل یا CDNهای شخص ثالث). این درخواستها را میتوانید با افزونهای مثل Asset CleanUp غیرفعال کنید.
یک انتخاب صریح: کش صفحه کامل یا کش تکهای؟
اگر فروشگاه شما کمتر از ۵۰۰ محصول دارد و ترافیک روزانه زیر ۱۰ هزار بازدید است، کش صفحه کامل برای صفحات محصول و دستهبندی کافی است و fragments را دست نزنید. اما اگر فروشگاه بزرگ دارید و مشتریها مدام سبد را تغییر میدهند، کش تکهای با fragments جواب میدهد، نه کش کامل.
کش کامل صفحه سبد برای کاربر مهمان یک اشتباه رایج است. ووکامرس سبد را در سشن کاربر ذخیره میکند، نه در کوکی. اگر صفحه سبد را کش کنید، کاربر بعدی سبد کاربر قبلی را میبیند. این دقیقاً همان باگی است که مشتری زنگ میزند و میگوید «چرا سبد من پر از چیزهایی است که من نخریدهام؟»
راه امن: از کش تکهای استفاده کنید و فقط بخشهایی که بین همه کاربران یکسان است را کش کنید. ووکامرس خودش این کار را با fragments انجام میدهد، فقط باید تعدادشان را کم کنید.
زیرساخت؛ وقتی همه چیز درست است ولی سایت هنوز کند است
گاهی بعد از همه این تنظیمات، سایت هنوز کند است. اینجا باید به زیرساخت نگاه کنید. اگر از هاست اشتراکی استفاده میکنید و سایت شما بیش از ۵۰ هزار بازدید ماهانه دارد، وقت مهاجرت به هاست وردپرس با منابع اختصاصیتر است. ووکامرس روی هاست اشتراکی با محدودیت CPU و RAM، حتی با بهینهترین کدها هم نمیتواند زیر ۲ ثانیه لود شود.
قبل از مهاجرت، این تست را انجام دهید: در پنل هاست فعلی، مصرف CPU را در ساعات پیک ببینید. اگر بالای ۸۰٪ است، مشکل زیرساخت است. اگر زیر ۴۰٪ است، مشکل از کد شماست و مهاجرت کمکی نمیکند. این تمایز را جدی بگیرید؛ خیلیها هزینه مهاجرت میدهند و بعد میفهمند مشکل از یک افزونه بدکد بوده است.
برای پایش مداوم سرعت، یک ابزار آپتایمچک راه بیندازید که هر ۵ دقیقه صفحه سبد را چک کند و اگر لود بالای ۳ ثانیه شد به شما ایمیل بزند. این کار را میتوانید با ابزارهای رایگان پایش انجام دهید. راهنمای پایش آپتایم سایت را ببینید تا هشدار را بدون خطای کاذب تنظیم کنید.
پرسشهای پرتکرار
چرا صفحه سبد خرید ووکامرس من کند است؟
کندی صفحه سبد معمولاً سه دلیل دارد: تعداد زیاد cart fragments که با هر تغییر دوباره رندر میشوند، نبود کش برای کاربران مهمان، و سنگینی دیتابیس به خاطر ردیفهای اضافه در wp_postmeta. با دستورهای این مقاله هر سه مورد را بررسی کنید.
آیا کش کردن صفحه تسویه ووکامرس امن است؟
خیر. صفحه تسویه شامل توکنهای امنیتی یکبارمصرف است که برای هر کاربر تولید میشود. کش کردن آن باعث خطای «توکن نامعتبر» هنگام پرداخت میشود. فقط assetهای استاتیک این صفحه را کش کنید، نه کل HTML را.
چطور تعداد cart fragments را کم کنم؟
با افزودن فیلتر woocommerce_add_to_cart_fragments به functions.php قالب فرزند، میتوانید fragmentهای غیرضروری را حذف کنید. ابتدا با کد تشخیصی که در مقاله آمده، تعداد فعلی را ببینید و بعد فقط fragmentهایی را نگه دارید که قالب شما واقعاً استفاده میکند.
تفاوت TTFB و زمان لود کامل چیست؟
TTFB زمانی است که سرور برای ارسال اولین بایت پاسخ صرف میکند. زمان لود کامل، کل زمان تا نمایش همه عناصر صفحه است. اگر TTFB بالاست، مشکل از سرور یا دیتابیس است. اگر TTFB پایین است ولی لود کامل بالاست، مشکل از حجم اسکریپتها و تصاویر است.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!