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()) {
?>
is_in_stock()) {
$classes[] = 'outofstock';
}
}
return $classes;
}
add_filter('post_class', 'add_stock_status_class', 10, 3);
?>