[PHP/Woocommerce] Function sắp xếp sản phẩm hết hàng xuống cuối trong catalog

0
606
Coding
Coding 1200x630

Cách làm: Thêm đoạn code vào file functions.php trong thư mục theme hiện tại.

  • Đoạn code sẽ giữ nguyên các sắp xếp từ woocommerce trước đó (vd: sắp xếp theo giá, mới nhất…)
  • Chuyển những sản phẩm hết hàng xuống cuối cùng
//sắp xếp sản phẩm hết hàng xuống cuối cùng
function _nok_order_by_stock_status( $posts_clauses, $query ) {
    // only change query on WooCommerce loops
    if ( $query->is_main_query() && ( is_product_category() || is_product_tag() || is_product_taxonomy() || is_shop() ) ) {
        global $wpdb;
        $posts_clauses['join'] .= 
        " LEFT JOIN ( 
            SELECT post_id, meta_id, meta_value FROM $wpdb->postmeta 
            WHERE meta_key = '_stock_status' AND meta_value <> '' 
        ) istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";

        $posts_clauses['orderby'] = 
        " CASE istockstatus.meta_value WHEN 
            'outofstock' THEN 1 
            ELSE 0 
        END ASC, " . $posts_clauses['orderby'];
    }
    return $posts_clauses;
}
add_filter( 'posts_clauses', '_nok_order_by_stock_status', 2000, 2 );
//end sắp xếp sản phẩm hết hàng xuống cuối cùng

-cre: _nok_

P/S: Đoạn code tác động đến frontend shop, danh mục sản phẩm

Extra: Đây sản phẩm ko có giá khuyến mãi xuống cuối frontend shop, danh mục sản phẩm

//sắp xếp sản phẩm hết hàng xuống cuối cùng
function _nok_order_by_stock_status( $posts_clauses, $query ) {
    // only change query on WooCommerce loops
    if ( $query->is_main_query() && ( is_product_category() || is_product_tag() || is_product_taxonomy() || is_shop() ) ) {
        global $wpdb;
        $posts_clauses['join'] .= 
        " LEFT JOIN ( 
            SELECT post_id, meta_id, meta_value FROM $wpdb->postmeta 
            WHERE meta_key = '_sale_price' AND meta_value = '' 
        ) issaleprice ON ($wpdb->posts.ID = issaleprice.post_id) ";

        $posts_clauses['orderby'] = 
        " CASE issaleprice.meta_value WHEN 
            '' THEN 1 
            ELSE 0 
        END ASC, " . $posts_clauses['orderby'];
    }
    return $posts_clauses;
}
add_filter( 'posts_clauses', '_nok_order_by_stock_status', 2000, 2 );
//end sắp xếp sản phẩm hết hàng xuống cuối cùng