Orderby 및 meta_value_num을 사용하여 숫자를 먼저 주문한 다음 문자열


16

"2.50"또는 "5.00"과 같은 텍스트로 저장된 사용자 정의 필드에 가격이있는 제품 목록이 있고 가격별로 정렬 된 사용자 정의 쿼리와 함께 페이지에 제품을 표시하고 있습니다.

    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 ) );

이것은 가격에 대해 잘 작동하지만 일부 가격은 "POA"이며 마지막으로 표시하고 싶지만 위의 주문은 "POA"가 먼저 표시됩니다.

이것을 변경하는 방법이나 나중에 배열을 정렬하고 "POA"가격을 마지막으로 설정하는 데 사용할 수있는 빠른 해킹이 있습니까?


변경 시도 'orderby' => 'meta_value_num', 'orderby' => 'meta_value_num meta_value',
Bainternet

감사하지만 작동하지 않습니다 :(
Shaun

아하! 그러나 다른 방법은 효과가 있습니다 meta_value meta_value_num! 감사! 투표 할 수 있도록 답변을 작성 하시겠습니까?
Shaun

1
댓글을 읽지 않은 사람에 대한 답변으로 게시되었습니다.
Bainternet

POA는 "요청에 대한 가격"을 의미합니다. en.wikipedia.org/wiki/Price_on_application
sudip

답변:


23

그만큼 OrderBy솔루션은 변화했다, 그래서 인수는 두 개 이상의 매개 변수를 취할 수 있습니다 :

'orderby' => 'meta_value_num',

에:

'orderby' => 'meta_value meta_value_num',

3
두 번째 매개 변수가 작동하지 않기 때문에 알파벳순으로 정렬되며 동일한 필드에서 효과가 없습니다. 숫자를 숫자 순으로 정렬하고 알파벳을 알파벳순으로 정렬하려면 필터를 사용하여 일종의 SQL 케이싱을 사용하도록 순서를 사용자 지정해야합니다. 예 :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 감사합니다! 귀하의 솔루션은이 문제에 대한 완벽한 솔루션입니다. 다음은 쿼리가 배치되는 나머지 코드입니다. 새로운 방문자를위한 답변으로 게시하겠습니다.
Gangesh

2

@bonger의 코드를 결합 하여이 솔루션을 찾았습니다. /programming/18084199/wordpress-query-order-by-case-when의

그리고 잘 작동합니다.

함수

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;
}

쿼리 전

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.