2つの異なる投稿タイプを1つのループにマージし、それらをランダムに表示するサイトにセクションを作成しています。問題は、投稿数を制限する方法を見つけるのに苦労しているper type。
私が試したものは次のとおりです。
配列を使用すると、複数の投稿タイプを持つ1つのクエリを実現できます。
$args = array( 'post_type' => array( 'photos', 'quotes' ), ...
...ただし、タイプごとに一定数の投稿に制限することはできません。
WP_Queryを実行する前に2つのクエリ引数配列をマージします。
$photos = array( 'post_type' => 'photos', 'posts_per_page' => 15, 'orderby' => 'Rand' );
$quotes = array( 'post_type' => 'quotes', 'posts_per_page' => 5, 'orderby' => 'Rand' );
$args = $photos + $quotes;
// Also tried array_merge( $photos, $quotes );
これには運がありません。後者の変数$quotes
は$photos
を上書きし、引用符のみを表示します。
型キャストにより2つのWP_Queryオブジェクトを一緒にマージします。
$photos_query = new WP_Query( $photos );
$quotes_query = new WP_Query( $quotes );
$result = (object)array_merge( (array)$photos_query, (array)$quotes_query );
... 等々。
おそらくデータベースに対して直接SQLクエリを使用できますが、私はneedを1つのループにこれらの2つの異なる投稿タイプを組み合わせて、ランダムに配置し、タイプごとに一定量の投稿に制限できます。
ご協力いただきありがとうございます!
1つの方法は、posts_clauses
または他のそのようなフィルタを使用して実行されるSQLクエリをカスタマイズすることです。それらを見つけるには "wp-includes/query.php"でposts_clauses
を検索してください。そしてこの行の直前にある一連のフィルタを見てください。これらを組み合わせることで、クエリの任意の部分をカスタマイズできます。
あなたができるもう一つのことは、手動でオブジェクト内のクエリされた投稿をマージすることです
$photos_query = new WP_Query( $photos );
$quotes_query = new WP_Query( $quotes );
$result = new WP_Query();
// start putting the contents in the new object
$result->posts = array_merge( $photos_query->posts, $quotes_query->posts );
// here you might wanna apply some sort of sorting on $result->posts
// we also need to set post count correctly so as to enable the looping
$result->post_count = count( $result->posts );
@mridual aggarwalあなたの答えはとても良いですが不幸にもそれは実際には2つのwp_query
を組み合わせたものではありません。この解決策は、少なくとも私の自己の目標を完全に達成しました。
<?php
$term = get_term_by( 'slug', get_query_var( 'tag' ), "post_tag" );
$tagslug = $term->slug;
$post_types = get_post_types('','names');
?>
<?php
//first query
$blogposts = get_posts(array(
'tag' => $tagslug, //first taxonomy
'post_type' => $post_types,
'post_status' => 'publish',
));
//second query
$authorposts = get_posts(array(
'bookauthor' => $tagslug, //second taxonomy
'post_type' => $post_types,
'post_status' => 'publish',
));
$mergedposts = array_merge( $blogposts, $authorposts ); //combine queries
$postids = array();
foreach( $mergedposts as $item ) {
$postids[]=$item->ID; //create a new query only of the post ids
}
$uniqueposts = array_unique($postids); //remove duplicate post ids
$posts = get_posts(array(
//new query of only the unique post ids on the merged queries from above
'post__in' => $uniqueposts,
'post_type' => $post_types,
'post_status' => 'publish',
));
foreach( $posts as $post ) :
setup_postdata($post);
?>
// posts layout
<?php endforeach; ?>
<?php wp_reset_postdata();?>