انتقال محصولات ناموجود به انتهای لیست در طبقه بندی محصولات ووکامرس
در فروشگاههای اینترنتی که با ووکامرس راهاندازی شدهاند، چیدمان محصولات در صفحات دستهبندی و برچسبها معمولاً بدون توجه به موجودی محصولات انجام میشود. این موضوع باعث میشود محصولات ناموجود در میان محصولات موجود یا حتی در ابتدای لیست قرار بگیرند و کاربران سایت متوجه محصولات موجود شما نشوند. این مسئله به شدت میتواند تأثیر منفی بر فروش سایت شما داشته باشد و تجربه کاربری را برای بازدیدکنندگان کاهش دهد. در این مقاله از مجموعه مقالات آموزشی وردپرس، یک راهکار ساده و استاندارد برای انتقال محصولات ناموجود در ووکامرس به انتهای لیست ارائه میدهیم تا ابتدا محصولات موجود به کاربران نمایش داده شوند و پس از آن، محصولات ناموجود در انتهای صفحه قرار گیرند. این تغییر کوچک اما تأثیرگذار، میتواند نرخ تبدیل فروشگاه شما را به طور چشمگیری افزایش دهد.
چالش نمایش محصولات ناموجود در ابتدای لیست و تأثیر آن بر فروش
در ووکامرس، ترتیب نمایش محصولات در آرشیوهای محصولات (مانند صفحات دستهبندی، برچسب و فروشگاه) به صورت پیشفرض بر اساس فاکتورهایی مانند تاریخ انتشار، محبوبیت یا قیمت است و وضعیت موجودی در این ترتیب لحاظ نمیشود. این یعنی محصولات ناموجود ممکن است در همان ابتدای لیست نمایش داده شوند و کاربرانی که به دنبال خرید فوری هستند، ابتدا با محصولاتی مواجه شوند که قابل خرید نیستند. این موضوع باعث میشود:
- کاهش تجربه کاربری: کاربران مجبور میشوند بین محصولات ناموجود جستجو کنند تا محصولات موجود را پیدا کنند.
- افزایش نرخ پرش: بازدیدکنندگان ممکن است فروشگاه شما را ترک کنند و به سراغ رقبا بروند.
- کاهش فروش: نمایش محصولات ناموجود در ابتدای لیست، شانس دیده شدن و خرید محصولات موجود را کاهش میدهد.
برای حل این مشکل، باید کوئریهای نمایش محصولات را به گونهای اصلاح کنیم که محصولات موجود در ابتدا و محصولات ناموجود در انتهای لیست قرار گیرند. این کار با استفاده از یک کد اختصاصی در فایل functions.php قالب وردپرس امکانپذیر است.
راهکار انتقال محصولات ناموجود به انتهای لیست در ووکامرس
برای انتقال محصولات ناموجود در ووکامرس به انتهای لیست، از فیلتر posts_clauses در وردپرس استفاده میکنیم. این فیلتر به ما اجازه میدهد تا قبل از اجرای کوئری پایگاه داده برای دریافت محصولات، بخشهای مختلف آن را (مانند JOIN، WHERE و ORDERBY) تغییر دهیم. با افزودن یک JOIN به جدول postmeta و اضافه کردن یک شرط ORDER BY بر اساس _stock_status، میتوانیم محصولات را بر اساس موجود بودن مرتب کنیم. کد ارائه شده در این مقاله، علاوه بر انتقال محصولات ناموجود به انتهای لیست، ترتیببندی موجود (مانند مرتبسازی بر اساس تاریخ یا محبوبیت) را نیز حفظ میکند و فقط جایگاه محصولات ناموجود را تغییر میدهد.
کد کامل انتقال محصولات ناموجود به انتهای لیست در ووکامرس
در زیر کد کامل و استاندارد برای انتقال محصولات ناموجود در ووکامرس به انتهای لیست آورده شده است. این کد را در انتهای فایل functions.php قالب فرزند خود قرار دهید.
/*
* Move Out of Stock Products to End in WooCommerce
* Sorts WooCommerce archive queries to push out-of-stock products to the end
* Mahdi Jafarzadeh
* https://www.wpwm.ir/
*/
add_filter('posts_clauses', 'order_by_stock_status', 9999, 2);
function order_by_stock_status($posts_clauses, $query) {
global $wpdb;
// Only modify the main query on WooCommerce archive pages
if (!is_admin() && $query->is_main_query() && (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy()))) {
// Join with postmeta to get stock status
$posts_clauses['join'] .= " INNER JOIN {$wpdb->postmeta} istockstatus ON ({$wpdb->posts}.ID = istockstatus.post_id) ";
// Order by stock status (instock first) then existing orderby
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
// Ensure we only get products with stock status and avoid duplicates
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
}
return $posts_clauses;
}نحوه عملکرد کد به صورت گام به گام
در این بخش، هر بخش از کد را به صورت دقیق بررسی میکنیم و نحوه عملکرد آن را توضیح میدهیم:
- خط ۶ – افزودن فیلتر با اولویت بالا: با استفاده از
add_filter('posts_clauses', 'order_by_stock_status', 9999, 2)، فیلتر را با اولویت ۹۹۹۹ (عدد بسیار بالا) اضافه میکنیم تا مطمئن شویم تغییرات ما در انتهای زنجیره اعمال میشود و با سایر فیلترها تداخل ندارد. همچنین با تعیین2به عنوان تعداد آرگومان، شیء$queryرا نیز دریافت میکنیم. - خط ۷ – تعریف تابع: تابع
order_by_stock_statusدو پارامتر$posts_clauses(آرایهای شامل بخشهای مختلف کوئری) و$query(شیء استعلام فعلی) را دریافت میکند. - خطوط ۱۰ تا ۱۲ – اعتبارسنجی: با استفاده از
!is_admin()از اعمال تغییرات در بخش مدیریت جلوگیری میکنیم. با$query->is_main_query()مطمئن میشویم فقط استعلام اصلی صفحه را تغییر میدهیم و سایر استعلامها (مانند ویجتها) تحت تأثیر قرار نمیگیرند. همچنین باis_woocommerce()و بررسیis_shop()،is_product_category()،is_product_tag()وis_product_taxonomy()اطمینان حاصل میکنیم که فقط در صفحات آرشیو ووکامرس تغییرات اعمال شوند. - خط ۱۴ – افزودن JOIN: با
$posts_clauses['join'] .= " INNER JOIN {$wpdb->postmeta} istockstatus ON ({$wpdb->posts}.ID = istockstatus.post_id) "، جدولpostmetaرا با نام مستعارistockstatusبه کوئری اضافه میکنیم تا بتوانیم به وضعیت موجودی محصولات دسترسی داشته باشیم. - خط ۱۷ – تغییر ترتیب: با
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby']، مرتبسازی را بر اساس وضعیت موجودی (مقدارinstockقبل ازoutofstock) و سپس سایر معیارهای مرتبسازی موجود (مانند تاریخ یا محبوبیت) تنظیم میکنیم. - خط ۲۰ – فیلتر کردن: با
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where']، اطمینان حاصل میکنیم که فقط رکوردهای مربوط به وضعیت موجودی در نظر گرفته شوند و رکوردهای خالی نادیده گرفته شوند.
نکات مهم
در این بخش به نکات کلیدی برای استفاده صحیح از این کد اشاره میکنیم:
- استفاده از قالب فرزند: کد را در فایل
functions.phpقالب فرزند قرار دهید تا با بروزرسانی قالب اصلی، تغییرات شما از بین نرود. - اولویت فیلتر: استفاده از اولویت ۹۹۹۹ (یا اعداد بالا مانند ۲۰۰۰) تضمین میکند که این فیلتر پس از سایر فیلترها اعمال شود و تغییرات شما به درستی اعمال گردد.
- بررسی تداخل با سایر افزونهها: اگر از افزونههای صفحهساز مانند Elementor یا Visual Composer استفاده میکنید و کد روی تمام بخشها اعمال نمیشود، ممکن است نیاز به تنظیمات اضافی داشته باشید.
- تست پس از اعمال کد: پس از افزودن کد، حتماً صفحات مختلف دستهبندی، برچسب و فروشگاه را بررسی کنید تا از عملکرد صحیح آن اطمینان حاصل کنید.
- تأثیر بر سایر استعلامها: با استفاده از
$query->is_main_query()، از اعمال تغییرات بر روی استعلامهای فرعی مانند ویجتها، محصولات مرتبط و … جلوگیری میکنیم. - هشدار درباره کدهای مشابه: متأسفانه برخی از سایتها این قطعه کد را به صورت افزونه یا آموزش پولی با قیمتهای بالا به فروش میرسانند، در حالی که این کد کاملاً رایگان و در دسترس است.
جمعبندی
در این مقاله از سری مقالات آموزشی وردپرس، به بررسی روش انتقال محصولات ناموجود به انتهای لیست در ووکامرس پرداختیم. با استفاده از کد ارائه شده، میتوانید چیدمان محصولات را در صفحات آرشیو به گونهای تغییر دهید که محصولات موجود در ابتدا و محصولات ناموجود در انتهای لیست نمایش داده شوند. این تغییر ساده اما تأثیرگذار، تجربه کاربری را بهبود میبخشد، نرخ پرش را کاهش میدهد و به افزایش فروش فروشگاه شما کمک میکند. این راهکار کاملاً استاندارد و بدون نیاز به نصب افزونه است.
امیدواریم این آموزش برای شما مفید بوده باشد. اگر سوالی درباره انتقال محصولات ناموجود در ووکامرس، نحوه استفاده از کد یا هر بخش دیگری از این آموزش دارید، لطفاً در بخش نظرات مطرح کنید. همچنین اگر تجربهای در بهبود چیدمان محصولات یا افزایش فروش در ووکامرس دارید، خوشحال میشویم آن را با ما و سایر کاربران به اشتراک بگذارید.







