私は3つのカスタム投稿タイプがあります。
今、私はカスタム投稿タイプの投稿数を制限したい、例えば:
私はこのような質問ポストを使いました:
query_posts( array(
'post_type' => array(
'books',
'magazine',
'videos'
),
'paged' => $paged,
'posts_per_page' => 6,
));
$counter = 1;
if (have_posts()) :
while (have_posts()) : the_post();
if (($counter == 2) || ($counter == 3) || ($counter == 4)) {
$div = 'alpha';
} elseif(($counter == 6)) {
$div = 'omega';
} else {
$div = '';
}
問題は、カスタム投稿タイプによって数を制限することができないことです。何か案が?
ありがとうございました :)
「できない」という答えを書くのは嫌いですが、できません。これは、単一のWP_Query
でこれを実行できるかどうかについてのあなたの質問に対する厳密な答えです。同じクエリ内で WP_Query
を使用して投稿タイプの数を個別に制限することはできません(実際には query_posts
を使用しています。使用しないでください。2次ループには適しません)
生のSQLでもあなたは別々の問い合わせを書く必要がありますそして UNION
それらを一緒に これが私がこれに近づく方法です。
$sql = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'books' AND post_status = 'publish' LIMIT 3)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'magazines' AND post_status = 'publish' LIMIT 2)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'videos' AND post_status = 'publish' LIMIT 1)";
// be sure to add any other conditions you need
$ids = $wpdb->get_col($sql);
次に、これらの$ids
を新しいWP_Query
まで実行して、適切なループに必要な投稿オブジェクトを取得します。
SQLをパターンに分割して再利用することもできます。何かのようなもの...
$sqlpat = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = '%s' AND post_status = 'publish' LIMIT %d)";
$sql = '('.sprintf($sqlpat,'books',3).') UNION ALL ('.sprintf($sqlpat,'magazines',2).') UNION ALL ('.sprintf($sqlpat,'videos',1).')';
私がミスをしなかったとすると(コードはテストされていません)、あなたはそれからあなたが望むものを持っているべきです - それぞれ特定のカウントを持つ3つの投稿タイプ。それらはあなたが望む順序で出てこないかもしれないので、あなたはそれらをPHPでソートしなければならないか、あるいはさらにトリッキーなSQLクエリを構築しなければならないかもしれません。
これを行うには、クエリをマージします。
$q1 = get_posts(array(
'post_type' => 'books',
'posts_per_page' => 3
));
$q2 = get_posts(array(
'post_type' => 'magazines',
'posts_per_page' => 2
));
$q3 = get_posts(array(
'post_type' => 'videos',
'posts_per_page' => 1
));
$merged = array_merge( $q1, $q2, $q3 );
$post_ids = array();
foreach( $merged as $item ) {
$post_ids[] = $item->ID;
}
$unique = array_unique($post_ids);
$args = array(
'post_type' => array(
'books',
'magazine',
'videos'
),
'post__in' => $unique,
'post_status' => 'publish',
'posts_per_page' => 6
);
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ) : $the_query->the_post();
// post stuff here
endwhile;