Sử dụng Orderby và meta_value_num để đặt hàng số trước sau đó là chuỗi


16

Tôi có một danh sách các sản phẩm, mỗi sản phẩm có một mức giá trong trường tùy chỉnh được lưu dưới dạng văn bản như "2.50" hoặc "5,00" và tôi đang hiển thị chúng trên trang với một truy vấn tùy chỉnh sắp xếp theo giá:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

Điều này hoạt động tốt với giá, nhưng một số giá là "POA" và tôi muốn hiển thị chúng lần cuối, tuy nhiên các đơn đặt hàng ở trên theo cách "POA" được hiển thị đầu tiên.

Có cách nào để thay đổi điều này hay một cách hack nhanh mà tôi có thể sử dụng để sắp xếp mảng sau đó và đặt bất kỳ giá "POA" nào không?


hãy thử thay đổi 'orderby' => 'meta_value_num', thành'orderby' => 'meta_value_num meta_value',
BaiNET

Cảm ơn nhưng điều đó không hiệu quả :(
Shaun

Aha! Nhưng cách khác xung quanh không hoạt động , meta_value meta_value_num! Cảm ơn! Bạn có muốn viết lên một câu trả lời để tôi có thể bỏ phiếu không?
Shaun

1
đăng dưới dạng câu trả lời cho những người không đọc bình luận.
Bai Internet

POA có nghĩa là "giá khi hỏi" en.wikipedia.org/wiki/price_on_application
sudip

Câu trả lời:


23

Đối OrderBysố có thể mất nhiều hơn một tham số để giải pháp thay đổi:

'orderby' => 'meta_value_num',

đến:

'orderby' => 'meta_value meta_value_num',

3
Điều này chỉ sắp xếp theo thứ tự abc, vì tham số thứ hai là không có, sắp xếp trên cùng một trường không có hiệu lực. Để làm điều này để các số loại số lượng và các bản alpha thứ tự abc bạn sẽ phải sử dụng một bộ lọc để tùy chỉnh orderby sử dụng một số loại SQL vỏ, ví dụORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
bonger

@bonger Cảm ơn bạn! Giải pháp của bạn là giải pháp hoàn chỉnh cho vấn đề này. Và đây là phần còn lại của mã nơi truy vấn của bạn được đặt. Tôi sẽ đăng nó như là câu trả lời cho khách truy cập mới.
Gangesh

2

Tôi đã tìm thấy giải pháp này bằng cách kết hợp mã bởi @bonger và /programming/18084199/wordpress-query-order-by-case-when

Và nó hoạt động tốt.

Chức năng

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

Trước khi truy vấn

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.