부울 true / false 값을 가진 메타 쿼리


11

먼저 임대하지 않은 모든 속성과 현재 임대 된 모든 속성별로 모든 임대 속성을 표시하려고합니다. 대여 한 가격 (_price_rented)에 대한 사용자 정의 게시물 메타가있는 사용자 정의 게시물 유형 'rent'가 있습니다 (체크 된 경우 true 또는 false ...를 반환 함). 사용 가능한 (대여되지 않은) 속성이 먼저 표시되고 임대 된 속성이 표시되도록 모든 속성을 표시하도록 쿼리를 변경해야합니다.

내 쿼리는 다음과 같습니다.

$ts_properties = new WP_Query( 
    array( 
    'post_type' => 'rent', 
    'paged' => $paged, 
    'posts_per_page' => -1,
    'meta_key' => '_price_rented',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
        'key' => '_price_rented',
        'value' => false,
        'type' => 'BOOLEAN',
        ),
    ) 
) 
);

어떤 이유로이 쿼리는 임대 한 모든 속성을 보여줍니다. meta_query에서 값을 'false'에서 'true'로 전환하면 속성이 표시되지 않습니다.

따라서 반환 값이 false (임대 속성) 또는 NULL (임대 속성이 아닌 속성)이지만 NULL 결과를 쿼리하는 방법을 확실하지 않은 경우 (false가 아님) ' 인수를 meta_query와 비교하고 값을 '! ='로 설정했지만 작동하지 않았습니다.

편집 : var_dump는 임대 가능하지 않은 아파트 string(0) ""와 임대 가능하지 않은 아파트에 대해 다음을 반환합니다 .string(1) "1"


값 1과 0을 사용합니까?
reikyoushin

meta_query type => string입니다. 가능한 값은 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'입니다. 기본값은 'CHAR'입니다.
iEmanuele

@reikyoushin : '1'을 사용하면 임대 된 모든 속성이 반환되고 '0'은 속성이 반환되지 않습니다.
Kegan Quimby

1
@ iEmanuele : 그 변화는 효과가없는 것 같습니다 (나는 같은 것을 생각했습니다). 나는이 기사에서 그것을 보았다 : thethemefoundry.com/blog/…
Kegan Quimby

1
되어 _price_rented실제로 모두 설정 truefalse값 또는 만 설정되어 true? 데이터베이스를 확인하십시오. 체크되지 않은 확인란이 전혀 통과되지 않았기 때문에 물었으므로 POST그 경우 값이 전혀 설정되어 있지 않은지 궁금합니다.
s_ha_dum

답변:


4

WP_Meta_Query 코어에서 "안정적이지 않은"부분이며,주의를 기울이지 않으면 혼동되지 않습니다.

당신이 일을 new WP_Query()하고 meta_query => array()인수 또는 그에 해당하는 단일 키 / 값 쌍을 가질 때 new WP_Meta_Query()즉시 뛰어 들어 파싱합니다.

$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );

허용되는 값

메타 데이터를 쿼리 할 때 bool옵션이 있습니다. 그리고 그것을 사용하면 CHAR허용 된 값의 배열로 기본값은 다음과 같습니다.

'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'

NUMERIC으로 재설정됩니다 SIGNED.

디버깅

사후 저장 프로세스에 영향을 줄 수있는 수많은 필터가 있으므로 가장 먼저 할 일은 일부 루프 내에서 다른 값을 확인하는 것입니다.

var_dump( get_post_meta( get_the_ID(), '_price_rented', true ) );

그런 다음 반환 값에 따라 SIGNED결과가 0또는 1인 경우 "true"또는 "false"결과가 문자열 인 경우을 사용해야합니다. 실제로 부울 인 경우 문자열과 숫자 만 통과 할 수있는 패스 string인지 확인하는 것이 좋습니다 .$GLOBALS['wpdb']%s%d

추가 사항

난 그냥 업데이트로 에 대한 코덱스 항목WP_Meta_Query 오늘, 나는 다른 출력 거기 많이 (불필요한 수많은 양의 추가 것을보고 JOINS에서 논의, Trac에 여기여기밖으로 가능한 핵심으로 이동 한 패치). ( 여기서AND 부품에 대한 후속 티켓 ) 요점은 배열과 그 하위 배열과 함께 인수 의 조합을 사용할 수 있다는 것 입니다 . 당신은, 그래서 그것을 덤프하지 않는 한 결과는 거의 알려져 있지 않다 이럴 당신이 하나 하나 사용하는 것이 더 낫다 또는 입력을 추가하는 다른 방법. 특히 당신이있을 때 meta_*meta_query경우 meta_key에 따라 "키만 쿼리"가 발생하기 때문에를 사용합니다.

해결책

의견에서 지적했듯이 :

(...) var_dump는 임대 가능하지 않은 아파트 string(0) ""와 임대 가능하지 않은 아파트에 대해 다음을 반환합니다 .string(1) "1"

지금은 meta_query사용하는

'meta_query' => array( 'relation' => 'OR', array(
    'meta_key'     => '_price_rented',
    'meta_value'   => '1',
    'meta_compare' => '='
) );

"사용할 수없는 임대 아파트"를 받거나 '!='"임대되지 않은"아파트를 검색하는 데 사용하려는 경우 .

참고 : 가능한 값 meta_compare'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'또는 'RLIKE'입니다. 기본값은 '='입니다.


3

나는 같은 문제에 직면했고 한 시간의 검색 후에 "NOT EXISTS"and "EXISTS"value을 발견했다 ( only in WP >= 3.5 ). 따라서 meta_key가 존재하는지 확인하기 위해 메타 값을 요청할 필요가 없습니다.

'meta_key'     =>   '_price_rented'  ,
'meta_compare' =>   'NOT EXISTS'     ,

그것은 나를 위해 완벽하게 작동합니다.


3

TL; DR : 이 문제는 대부분 부울 필드가 선택 사항으로 작성 될 때 발생합니다. 필요한 경우 또는보다 복잡한 쿼리를 사용하여 기본 사례를 검색하여 문제를 해결할 수 있습니다.

자세한 내용은:

여기에는 두 가지 데이터 표현 문제가 있습니다. 하나는 데이터 값이 true / false를 나타내는 데 사용되고 다른 하나는 필드가 기본값 (일반적으로 false) 인 경우 필드가 전혀 저장되는지 여부입니다.

1 부 : 나는 WP_Meta_Querytrue와 false를 비교하기 위해 생성 된 SQL을 살펴 보았고 true는 '1'과 false``(빈 문자열)을 대체한다는 것을 알았습니다. 따라서 데이터베이스에 쓰는 모든 것은 실제 true 및 false 값과 비교하여 쿼리를 수행하려는 경우 동의해야합니다. 특히, 거짓으로 '0'을 쓰고 싶지 않습니다. 대신 0과 1을 작성하고 테스트하는 것이 더 어려울 수 있습니다 (그리고 많은 양식 빌더가 그렇게합니다). 그러나 데이터베이스에 쓰여지는 내용을 확인하고 쿼리를 작성할 때이를 명심하십시오.

2 부 : false가 기본값이라고 가정하면 값이 true 인 레코드를 쉽게 찾을 수 있습니다.

... 'meta_key' => 'my_key', 'meta_value' => 1 (또는 사실)

그러나 반대편은 도전입니다. 잘못된 값이 있거나 전혀 값이 없을 수 있습니다. 이것은 값이 --- 형식으로 옵션으로 나열되면 사용자가 명시 적으로 설정하거나 변경하지 않는 한 데이터베이스에 추가되지 않는 경우에 발생할 수 있습니다. 사용하는 경우에만 다음과 같이 get_post_meta작동합니다. 잘못된 값을 반환하고 아무 값도 반환하지 않으면 동일한 결과를 얻을 수 있습니다.

그러나를 사용할 때는 WP_Query쉽지 않습니다. (또는 그렇다면 아직 아직 알지 못했습니다).

두 가지 (또는 세 가지) 옵션이 있습니다.

  1. 필드가 항상 명시 적으로 실제 값으로 초기화되어 있는지 확인하십시오. 일부 양식 빌더에서는 필수 필드를 작성하고 기본값을 지정하여이를 수행합니다. 그런 다음 ...'meta_value' => 0 안정적으로 테스트 할 수 있습니다 .

  2. 첫 번째는 잘못된 값을 테스트하고 두 번째는 값을 테스트하지 않는 두 가지 쿼리를 수행하십시오. 이들은 다음과 같이 단일 WP_Query로 결합 될 수 있습니다.

    meta_query => {
        relation => 'OR'
        array(
            'key'     => 'my_key',
            'value'   => 0,
            'compare' => '='
        ),
        array(
            'key'     => 'my_key',
            'compare' => 'NOT EXISTS',
        ),
    )
    

이것은 아마도 효율적인 쿼리가 아닙니다. 많은 요인에 따라 모든 객체를 반환하고 자신의 코드로 필터링하는 것이 좋습니다.

  1. '값 없음'을 사용하여 false를 의미 할 수 있습니다. 이렇게하려면 값을 false로 설정해야 할 때마다 메타 값업데이트 하는 대신 삭제해야 합니다.

이 경우 단일 'NOT EXISTS'쿼리가 올바른 개체를 안정적으로 반환합니다. (많은 양식 작성기 또는 플러그인 이이 동작을 지원하지 않는다고 생각하므로 순전히 사용자 정의 코드에서만 사용합니다.)

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