web-dev-qa-db-ja.com

メタキーが存在しないすべての投稿をクエリする

特定の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を試しましたが、運は良かったです。

誰かが私が必要としているもののようなクエリを作成する正しい方法に私を傾けることができるならば私はそれを高く評価するでしょう。

ありがとうございます。

45
JordanBel

私はこれでもう少しテストをしました、そして、それがうまくいかない理由を正直に見つけることができません(上のコードが単なる断片であり、本当のコードが以下の私の例に合わない限り)。しかし、私はあなたを正しい方向に導くかもしれないことをいくつか発見しました。

1)それ自体では、このメタクエリは "colors IS NULL"と同等です。つまり、postmetaテーブルにそのキーが設定されていない投稿を返します。これは上記の場合です、そしてそれはうまくいくはずです。

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

2)ただし、 '関係'インデックスを 'OR'に設定すると、この条件が変わります。それは逆を返します。なぜか聞かないでください。これは複数のメタクエリをするときに特に重要です。つまり、 'colors'キーが 'blue'(またはその他)に設定されている、またはまったく設定されていない投稿に対してクエリを実行することは、最初は不可能です。以下のクエリは最初の条件を無視し、2番目の条件に一致するものだけを返します。

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

3)しかし、 'value'を設定すれば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.5以降の事実です。意図的ではなく、将来のバージョンで修正される可能性がありますが、これがこのように動作する理由がある可能性があります。これは実行可能な回避策です。

69
Tomas Buteler

カスタムクエリを使用して、これは私のために働きました:

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
            ) 
10
i_a