メタキーが存在しないすべての投稿を照会する


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

そのタイプのクエリ(compareを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'(または何でも)に設定されているか、まったく設定されていない投稿に対してクエリを最初に実行することはできません。以下のクエリは、最初の条件を無視し、2番目の条件に一致するもののみを返します。

'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を見る価値があるかもしれません。そうでない場合、これは再現可能です。
テイラーデューイ

); - WP :)をだますための素晴らしい説明と解決のためのおかげでここまで来るには時間がかかりましたが、今、私は少なくとも10回upvoteクリックします(唯一の私ができる場合)
Loremの猿

EXISTSの比較を使用すると、残念ながら新しいバージョンのWPでは値が無視されません(4.2.2でテスト済み)
イゴールジェロシミッチ

10
値を指定するように必要な「バグ」、WP 3.9で修正されましたEXISTSNOT EXISTS
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.