메타 키가 존재하지 않는 모든 게시물 쿼리


50

특정 meta_key이 존재하지 않는 모든 게시물을 검색하여 작성한 쿼리를 얻으려고 합니다.

테스트중인 쿼리가 작동하지 않아서 해당 게시물을 찾는 데 문제가 있습니다.

해당 게시물을 얻는 데 사용하는 코드는 다음과 같습니다.

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

키가있는 게시물이 없으면 아무것도 반환하지 colors않지만 ids키가 colors있을 때마다 (필요한 것과 반대 되는) 게시물이있는 게시물을 반환합니다 . 나는 EXIST대신 노력 했지만 운이 없다.

누군가 내가 쿼리와 같은 쿼리를 작성하는 올바른 방법을 알려 줄 수 있다면 감사하겠습니다.

감사!


어떤 버전의 WordPress를 사용하고 있습니까?
— s_ha_dum

안녕, 미안합니다. v3.5를 사용하고 있습니다
— JordanBel

해당 쿼리 유형 (비교가 NOT EXISTS로 설정 됨)이 3.5에 추가 된 것처럼 보이므로 가능한 한 제대로 작동해야합니다. 하지만 맞춤 SELECT 쿼리를 통해 쉽게 수행 할 수 있습니다.
— Tomas Buteler

감사합니다. select를 사용해보십시오. 쿼리 할 테이블과 쿼리를 준수하는 방법을 배우기 전에 반드시 알아야합니다. (
— JordanBel

아주 이상한. 해당 코드에서 문제를 발견 할 수 없으며 3.5 이상을 사용하고 있습니다. 실제로 데이터가 생각한대로 삽입되는지 확인하기 위해 데이터베이스를 살펴 봤습니까?
— s_ha_dum

답변:


73

나는 이것으로 더 많은 테스트를했고, 솔직히 그것이 작동하지 않는 이유를 찾을 수 없다 (위의 코드가 단지 스 니펫이고 실제 코드가 아래 예제에 적합하지 않다면). 그러나 올바른 방향으로 이끌 수있는 몇 가지 사실을 발견했습니다.

1)이 메타 쿼리 자체는 "colors IS NULL"과 같습니다. 즉 postmeta 테이블에 해당 키가 설정되지 않은 게시물을 반환합니다. 이것은 위에 표시된 경우이며 작동해야합니다.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) WordPress 3.9 이전에는 '관계'색인을 'OR'로 설정하면이 조건이 변경됩니다. 반대를 돌려줍니다. 이유를 묻지 마십시오. 이것은 여러 메타 쿼리를 수행 할 때 특히 중요합니다. 즉, 'colors'키가 'blue'(또는 무엇이든)로 설정되었거나 전혀 설정되지 않은 게시물에 대해 처음에는 쿼리를 수행 할 수 없습니다. 아래 쿼리는 첫 번째 조건을 무시하고 두 번째 조건과 일치하는 조건 만 반환합니다.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) 그러나 '값'을 설정하면 첫 번째 조건을 사용하여 WordPress를 속일 수 있습니다. 이는 (내가 알기로는 지금까지, 무시됩니다) 관련 값을 필요로하지 않지만, 설정해야 위해서는 NOT EXISTS어떤 영향을 미칠 조건.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

이것은 WordPress 3.9까지 적용되었습니다. 여전히 이전 버전을 사용중인 경우이 방법은 실행 가능한 해결 방법입니다.


감사! 그리고 미안 해요. 나는 쿼리를 사용하여 끝났지 만 다음 시간에 솔루션을 테스트 할 것이므로 다시 전환 할 수 있으며이 작업이 가능하면 다른 것을 도울 수 있습니다. 확인할 수있는대로 알려 드리겠습니다. 다시 감사합니다
— JordanBel

빈 값을 추가하면 예상 결과가 반환된다는 것을 잘 작성하고 확인했습니다. 나는 그것이 의도하지 않은 것이라고 말하고 싶습니다. trac.wordpress.org에서 이미 티켓이 있는지 확인하십시오. 그렇지 않으면 재현 가능합니다.
— Taylor Dewey

여기까지 약간의 시간이 걸릴나요 :) WP 트릭 위대한 설명 및 솔루션을 주셔서 감사합니다 -하지만 지금은 적어도 10 번 upvote에 클릭합니다 (있는 경우 만 내가 할 수있는))
— 가 lorem 원숭이

비교 EXISTS를 사용하면 불행히도 새로운 버전의 WP (4.2.2에서 테스트 됨)에서 값이 무시되지 않습니다.
— Igor Jerosimić

10
EXISTS과 NOT EXISTS값을 지정할 필요 "버그", WP 3.9에서 수정되었습니다
— trex005

11

사용자 정의 쿼리를 사용하면 다음과 같이 작동했습니다.

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.