web-dev-qa-db-ja.com

すべての投稿と、メタフィールドを持つ特定のカスタム投稿タイプのみを表示する

ホームページにすべての投稿と特定のカスタム投稿のみを表示しようとしています。

基本的に(post_type = post) OR (post_type = exhibition AND featured = 1)

私は実際の実装にこだわっています。

pre_get_posts$query->set(...);post_type上のロジックを許可していないようです、(post OR exhibition) AND (featured=1)しか設定できないようです。

投稿ごとにfeatured=1を設定する必要はありません。

任意の助けをいただければ幸いです。

任意のWP_Query引数にORまたはANDを指定することはできません。メタクエリとタクソノミークエリを使用すると、これらのクエリにORまたはANDを指定できますが、他の引数はすべて結合されます(post_typeは投稿ではなく、メタのプロパティであるため、メタクエリでは役に立ちません)。考えられる引数とその使い方については ドキュメント を参照してください。

post_typeのように、いくつかの引数がArrayを値としてサポートしていることがわかるでしょう。そのため、'post_type' => ['post', 'exhibition']を渡すことができ、それはexhibitionpostの両方の投稿を取得します。

ただし、これを行っているときは、別の引数またはメタクエリがいずれかの投稿タイプにのみ適用されるように指定することはできません。

投稿が別々に表示される場合は、2つのクエリを実行するだけで済みます。それ以外の場合は、 wpdb を使用してデータベースに直接問い合わせる必要があります。それは次のようになります。

global $wpdb;

$results = $wpdb->get_results(
    "SELECT 
        posts.* 
    FROM 
        $wpdb->posts posts 
    LEFT JOIN 
        $wpdb->postmeta ON 
            ( posts.ID = postmeta.post_id AND postmeta.meta_key = 'featured' )
    WHERE
        posts.post_type = 'post' OR
        ( posts.post_type = 'exhibition' AND postmeta.meta_value = '1' )
    "
);

まだテストしていませんが、それは大体の考えです。投稿数とその順序についてもSQLを追加する必要があります。

modifyに使用できる posts_where および posts_join フィルターもあります。もう少し手間がかかりますが、メインのクエリを変更する必要がある場合、または他のWP_Query引数に依存していて、それらのSQLを書き換える必要がない場合は、それらのファイラを使用する必要があります。

1
Jacob Peattie

カスタム投稿を返そうとしている場合は、これを使用してください。

$args = array(
          'numberposts'=> -1,
          'post_type' => 'custom post type name'
        );
$results = get_posts( $args ); //get all post data results

foreach ($results as $rel){//sift through data and find relevant meta data
  $ret = get_post_meta($rel->ID,'meta_field',true);
  if(!empty($ret)){
      //do something with this post data
  }

}

これにより、その投稿タイプに該当するすべての投稿が取得されます。うまくいけば、これはあなたが始めるのを助ける。

0
Cam