web-dev-qa-db-ja.com

WP_Queryが添付ファイルおよびカスタムmeta_queryに対して期待どおりに機能しない

get_posts()をこのように使用すると、my_key meta_keyの値1を持つ結果が多数得られます。

$posts = get_posts( 
    array( 
        'post_type'  => 'attachment', 
        'meta_key'   => 'my_key', 
        'meta_value' => '1' 
    ) 
);

//this has a bunch of results as expected
print_r($posts);

ただし、WP_Queryを使用して同様のクエリを作成すると、空の結果配列が返されます。

$args = array(
   'post_type' => 'attachment',
   'meta_query' => array(
       array(
       'key'     => 'my_key',
       'value'   => '1',
       'compare' => '=',
       'type'    => 'BINARY'

      )
   )
);

$query = new WP_Query();
$results = $query->query($args);
//this is empty
print_r($results);

私はいくつかのmeta_query配列を試してみましたが、うまくいきませんでした。私はこれがバグかもしれないと思っています、しかし私が最初に何かを逃していなかったことを確かめたかったです。

2
Mike

まず、WP_Queryのコンストラクタに引数を渡します。これはどちらもよりクリーンで、クラスの Codexのドキュメント に従って行う方法です。

あなたはこのようなものを構築するべきです:

$my_key_query_args = array(
   'post_type'   => 'attachment',
   'post_status' => 'inherit',
   'meta_query'  => array(
       array(
           'key'     => 'my_key',
           'value'   => '1',
           'compare' => '=',
           'type'    => 'BINARY'

      )
   )
);

$my_key_query = new WP_Query( $my_key_query_args );

次に、私の配列に追加されたpost_statusパラメータに注目してください。デフォルトでは、添付ステータスは「継承」の投稿ステータスで追加されますが、WP_Queryは「公開」、「ドラフト」、または「保留中」のステータスの投稿を検索します。 (そのパラメーターの 資料 も参照してください)。

そのため、ここにはバグはありません。オブジェクトに渡されたすべてのパラメータのデフォルト値を確認するのを忘れただけです。

この要件を呼び出すpost_typeパラメーターの "attachment"オプションに関するメモがあります。

デフォルトのWP_Queryでは'post_status'=>'published'が設定されていますが、添付ファイルのデフォルトは'post_status'=>'inherit'であるため、ステータスを'inherit'または'any'に設定する必要があります。

12
EAMann

あなたの問題は、あなたがget_posts()のようにWP_Queryを使おうとしているということです。クエリが機能している可能性は十分にありますが、結果が表示されないだけです。 WP_Queryは、ループするクエリオブジェクトを次のように返します。

...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();

// do your thing

endwhile;

また、私は$ my_queryを使用しました。私はこれについて少しあいまいですが、$ queryはWordPressから予約された変数であると私は信じています、そしてどちらかの方法で、あなたがそのクエリをもう少し人間が読めるようにするなら良いでしょう.

0
mrwweb