ホームページにすべての投稿と特定のカスタム投稿のみを表示しようとしています。
基本的に(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']
を渡すことができ、それはexhibition
とpost
の両方の投稿を取得します。
ただし、これを行っているときは、別の引数またはメタクエリがいずれかの投稿タイプにのみ適用されるように指定することはできません。
投稿が別々に表示される場合は、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を書き換える必要がない場合は、それらのファイラを使用する必要があります。
カスタム投稿を返そうとしている場合は、これを使用してください。
$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
}
}
これにより、その投稿タイプに該当するすべての投稿が取得されます。うまくいけば、これはあなたが始めるのを助ける。