نویسنده:
بازدید: 85 بازدید
انتقال محصولات ناموجود به انتهای لیست در ووکامرس بدون افزونه
5/5 - (2 امتیاز)

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

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

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

  • محصولات ناموجود فروشگاه را به انتهای لیست دسته بندی ها یا کلا به انتهای لیست فرستاده
  • کلا محصولات ناموجود را نمایش ندهند

اگر تنوع محصولات یا تعداد محصولات یک فروشگاه یا یک دسته بندی محصول کم است شاید شما این تصمیم را بگیرید که محصولات را حذف کنید ( البته حذف محصولات برای سئو وب سایت شما اصلا خوب نیست ) و با حذف محصولات ناموجود دسته محصولات بسیار خالی می شود پس ترجیح این است که استراتژی درست برای نمایش محصولات ناموجود در انتهای لیست انتخاب شود.

مشکلی که در خیلی از سایتها هست این است که فقط اولیت را برای ناموجود بودن کالا میزارن اما تاریخ هم مهم است

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

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

این کد را در فایل functions.php قالب خودتون اضافه کنید 

البته پیشنهاد میکنیم این کد را حتما در نسخه child  قالب خودتون اضافه کنید تا مشکلی برای نسخه آپدیت قالبتونن پیش نیاد . 

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

				
					<?php
// کوئری برای نمایش پست‌ها (مثلاً محصولات ووکامرس)
$args = array(
    'post_type'      => 'product', // نوع پست (محصولات ووکامرس)
    'posts_per_page' => -1,        // تعداد پست‌ها
    'meta_query'     => array(
        'relation' => 'OR',
        array(
            'key'     => '_stock_status',
            'value'   => 'instock', // فقط موجود
            'compare' => '='
        ),
        array(
            'key'     => '_stock_status',
            'value'   => 'outofstock', // فقط ناموجود
            'compare' => '='
        )
    ),
    'orderby' => array(
        'meta_value' => 'ASC', // مرتب‌سازی بر اساس موجودی
        'date'       => 'DESC' // سپس مرتب‌سازی بر اساس تاریخ
    )
);

$query = new WP_Query($args);

if ($query->have_posts()) : 
    while ($query->have_posts()) : 
        $query->the_post(); 
        // نمایش محصول
        wc_get_template_part('content', 'product'); 
    endwhile; 
    wp_reset_postdata(); 
else : 
    echo '<p>محصولی یافت نشد.</p>';
endif;
?>

				
			

توضیحات:

  1. post_type: مشخص می‌کند که نوع پست موردنظر شما چیست. اگر از ووکامرس استفاده می‌کنید، این مقدار باید product باشد.
  2. meta_query: وضعیت موجودی محصول را بررسی می‌کند و آن را به دو گروه “موجود” و “ناموجود” تقسیم می‌کند.
  3. orderby: ترتیب بر اساس موجودی (_stock_status) و سپس بر اساس تاریخ پست.
این کد را می‌توانید در فایل قالب (مثل archive-product.php) یا به‌عنوان بخشی از یک افزونه سفارشی استفاده کنید.
کد اختصاصی قالب وودمارت برای انتقال محصولات ناموجود به انتهای لیست در ووکامرس بدون افزونه

کد اختصاصی قالب وودمارت برای انتقال محصولات ناموجود به انتهای لیست در ووکامرس بدون افزونه

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

دقت کنید که تمام کدهای داخل فایل function.php  در نسخه child وودمارت  قالبتون رو باید پاک کنید و این کد را قرار دهید

				
					<?php
// وودمارت -  فراخوانی استایل‌های قالب فرزند
add_action( 'wp_enqueue_scripts', 'woodmart_child_enqueue_styles', 1000 );

function woodmart_child_enqueue_styles() {
    wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array( 'woodmart-style' ), woodmart_get_theme_info( 'Version' ) );
}

// سفارشی‌سازی مرتب‌سازی محصولات ووکامرس
add_action( 'woocommerce_product_query', 'custom_woocommerce_product_sorting' );

function custom_woocommerce_product_sorting( $query ) {
    // فقط در صفحه فروشگاه و آرشیو محصولات اجرا شود
    if ( is_shop() || is_product_category() || is_product_tag() ) {
        // مرتب‌سازی بر اساس موجودی و تاریخ
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key'     => '_stock_status',
                'value'   => 'instock', // محصولات موجود
                'compare' => '='
            ),
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock', // محصولات ناموجود
                'compare' => '='
            )
        ));

        // مرتب‌سازی با اولویت موجودی، سپس تاریخ
        $query->set( 'orderby', array(
            'meta_value' => 'ASC', // ابتدا محصولات موجود
            'date'       => 'DESC' // سپس مرتب‌سازی بر اساس تاریخ
        ));
    }
}

				
			

توضیحات کامل و تکمیلی برای انتقال محصولات ناموجود به انتهای لیست در ووکامرس بدون افزونه :


اکشن جدید:


به جای استفاده از pre_get_posts که ممکن است با سایر کوئری‌ها تداخل داشته باشد، از woocommerce_product_query استفاده کردیم. این اکشن اختصاصاً برای محصولات ووکامرس طراحی شده است.

بررسی صفحه‌ها:


از is_shop()، is_product_category() و is_product_tag() استفاده کردیم تا اطمینان حاصل شود که کد فقط در صفحات مرتبط با محصولات اجرا می‌شود.

مرتب‌سازی:


مرتب‌سازی بر اساس موجودی (_stock_status) و سپس تاریخ اعمال شده است.

عملکرد بدون تداخل:


این روش تضمین می‌کند که با سایر کوئری‌ها یا صفحات غیر مرتبط در وردپرس تداخلی ایجاد نشود.

نحوه بررسی و رفع خطا:


فعال‌بودن ووکامرس:


افزونه ووکامرس باید فعال باشد و فایل functions.php متعلق به قالبی (قالب وودمارت )  باشد که در حال استفاده است.

خطاها در مرورگر:


اگر خطا در سمت کاربر نمایش داده می‌شود، بخش Debugging وردپرس را فعال کنید:

بررسی کنید در فایل config.php  حتما حالت دیباگ فعال باشد 
define( ‘WP_DEBUG’, true );
define( ‘WP_DEBUG_LOG’, true );


سپس فایل wp-content/debug.log را بررسی کنید.

تست نهایی:


پس از افزودن کد، صفحه فروشگاه را بازسازی کنید (Clear Cache) و بررسی کنید که آیا محصولات “موجود” در ابتدا و “ناموجود” در انتها نمایش داده می‌شوند.

در صورت بروز مشکل:


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

مطالعه بیشتر