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


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
EXISTSNOT 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.