انتقال محصولات ناموجود به انتها لیست در وردپرس

انتقال محصولات ناموجود به انتها لیست در وردپرس

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

				
					<?php
// انتقال محصولات ناموجود به انتهای لیست با اولویت بالا
function move_out_of_stock_products_to_end($q) {
    // فقط برای کوئری‌های اصلی و در فرانت‌اند اعمال شود
    if (!is_admin() && $q->is_main_query()) {
        // بررسی اینکه کوئری مربوط به محصولات WooCommerce است
        if (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy()) {
            // اضافه کردن متا کوئری برای ترتیب‌دهی بر اساس موجودی
            $q->set('meta_key', '_stock_status');
            $q->set('orderby', array(
                'meta_value' => 'ASC',  // ابتدا محصولات موجود
                'menu_order' => 'ASC',  // سپس ترتیب منو
                'date' => 'DESC'        // و در نهایت تاریخ
            ));
            
            // اضافه کردن متا کوئری برای فیلتر کردن بر اساس وضعیت موجودی
            $meta_query = $q->get('meta_query');
            if (!is_array($meta_query)) {
                $meta_query = array();
            }
            
            $meta_query['stock_status_clause'] = array(
                'key' => '_stock_status',
                'compare' => 'EXISTS'
            );
            
            $q->set('meta_query', $meta_query);
        }
    }
}

// اعمال فیلتر با اولویت بالا (5) تا قبل از بقیه فیلترها اجرا شود
add_action('pre_get_posts', 'move_out_of_stock_products_to_end', 5);

// تابع کمکی برای Elementor و JetEngine
function custom_jetengine_query_args($query_args, $settings) {
    // بررسی اینکه کوئری مربوط به محصولات است
    if (isset($query_args['post_type']) && $query_args['post_type'] === 'product') {
        // تنظیم ترتیب‌دهی با اولویت موجودی
        $query_args['meta_key'] = '_stock_status';
        $query_args['orderby'] = array(
            'meta_value' => 'ASC',
            'menu_order' => 'ASC',
            'date' => 'DESC'
        );
        
        // اضافه کردن متا کوئری برای موجودی
        if (!isset($query_args['meta_query'])) {
            $query_args['meta_query'] = array();
        }
        
        $query_args['meta_query']['stock_status_clause'] = array(
            'key' => '_stock_status',
            'compare' => 'EXISTS'
        );
    }
    
    return $query_args;
}

// اعمال فیلتر برای JetEngine با اولویت بالا
add_filter('jet-engine/listing/grid/query-args', 'custom_jetengine_query_args', 5, 2);

// تابع برای تغییر ترتیب محصولات در حلقه WooCommerce
function custom_woocommerce_product_query($q) {
    if (!is_admin() && is_woocommerce()) {
        // تنظیم کلید متا برای موجودی
        $q->set('meta_key', '_stock_status');
        
        // ترتیب‌دهی: ابتدا محصولات موجود، سپس ناموجود
        $q->set('orderby', array(
            'meta_value' => 'ASC',
            'menu_order' => 'ASC',
            'title' => 'ASC'
        ));
        
        // اضافه کردن متا کوئری
        $meta_query = array(
            'stock_status_clause' => array(
                'key' => '_stock_status',
                'compare' => 'EXISTS'
            )
        );
        
        $existing_meta_query = $q->get('meta_query');
        if (is_array($existing_meta_query)) {
            $meta_query = array_merge($existing_meta_query, $meta_query);
        }
        
        $q->set('meta_query', $meta_query);
    }
}

// اعمال برای کوئری‌های WooCommerce
add_action('woocommerce_product_query', 'custom_woocommerce_product_query', 5);

// تابع کمکی برای غیرفعال کردن موقت سایر فیلترها
function override_other_sorting_filters() {
    // غیرفعال کردن موقت فیلترهای مرتب‌سازی پیش‌فرض
    remove_action('woocommerce_product_query', 'woocommerce_product_query_orderby');
}

// اعمال با اولویت خیلی بالا
add_action('init', 'override_other_sorting_filters', 1);

// اضافه کردن CSS برای بهتر نمایش دادن محصولات ناموجود
function add_out_of_stock_styles() {
    if (is_woocommerce() || is_shop() || is_product_category()) {
        ?>
        <style>
        /* استایل برای محصولات ناموجود */
        .woocommerce ul.products li.product.outofstock {
            opacity: 0.6;
            order: 9999; /* انتقال به انتها در فلکس باکس */
        }
        
        /* برای JetEngine Grid */
        .jet-listing-grid__item[data-stock-status="outofstock"] {
            opacity: 0.6;
            order: 9999;
        }
        </style>
        <?php
    }
}
add_action('wp_head', 'add_out_of_stock_styles');

// تابع برای اضافه کردن کلاس CSS به محصولات ناموجود
function add_stock_status_class($classes, $class, $product_id) {
    if (is_woocommerce()) {
        $product = wc_get_product($product_id);
        if ($product && !$product->is_in_stock()) {
            $classes[] = 'outofstock';
        }
    }
    return $classes;
}
add_filter('post_class', 'add_stock_status_class', 10, 3);
?></script>
				
			

ویژگی‌های کلیدی کد انتقال محصولات ناموجود به انتها لیست در وردپرس :

  1. اولویت بالا: همه فیلترها با اولویت ۵ یا کمتر اجرا می‌شوند تا قبل از سایر فیلترها عمل کنند
  2. پوشش کامل: کد برای موارد زیر کار می‌کند:
    • صفحات فروشگاه WooCommerce
    • دسته‌بندی محصولات
    • JetEngine Grid
    • حلقه‌های سفارشی محصولات
  3. حفظ فیلترهای موجود: کد فیلترهای موجود را حذف نمی‌کند، بلکه اولویت‌بندی جدید اضافه می‌کند

نحوه استفاده:

  1. کد را در فایل functions.php تم فعال خود کپی کنید
  2. فایل را ذخیره کنید
  3. کش سایت و مرورگر را پاک کنید

نکات مهم:

  • محصولات موجود (instock) ابتدا نمایش داده می‌شوند
  • محصولات ناموجود (outofstock) به انتها منتقل می‌شوند
  • ترتیب‌دهی‌های دیگر (قیمت، تاریخ و غیره) همچنان کار می‌کنند
  • استایل CSS برای تمایز بصری محصولات ناموجود اضافه شده

نظرات شما