WooCommerce: Xếp sản phẩm mới nhất trước, hết hàng sau cùng

Vào một ngày đẹp trời anh nhận lời cấu hình lại một cái website dùng WooCommerce – thứ mà anh chưa bao giờ chính thức dùng. Khách hàng yêu cầu là phải sắp xếp sản phẩm mới nhất trước nhưng cái nào hết hàng rồi thì phải cho xuống dưới cùng. Tưởng là chỉ việc bấm chuột, ai dè WooCommerce không có tuỳ chọn kiểu như thế.

Anh thử cài đặt đủ thứ plugin nhưng chả có cái nào có chức năng như vậy. Vậy đành quay sang tìm code.

Vớ được một bài trên StackExchange nhưng nó chỉ xếp sản phẩm đã hết hàng ra sau cùng còn ngày tháng thì không đả động. Thế là lại phải mò vào WordPress.org xem lại cú pháp.

Kết quả là nó phải như này:

/* Show latest products first on the shop page */
add_action( 'pre_get_posts', function ( $q ) {
    if (   !is_admin()                // Target only front end
         && is_woocommerce()          // Target only WooCommerce
         && $q->is_main_query()       // Only target the main query
    ) {
        $q->set( 'meta_key', '_stock_status' );
        $q->set( 'orderby', array('meta_value' => 'ASC', 'date' => 'DESC') );
    }
}, PHP_INT_MAX );

Nhân tiện, anh đang rảnh nên sẽ nhận làm website mà không nhất thiết phải kèm theo dịch vụ chụp ảnh nhé 😀