web-dev-qa-db-ja.com

同じwp_queryで別のカスタム投稿タイプの投稿を制限する

私は3つのカスタム投稿タイプがあります。

  • マガジン
  • 動画

今、私はカスタム投稿タイプの投稿数を制限したい、例えば:

  • 本=> 3投稿
  • magazine => 2ポスト
  • ビデオ=> 1投稿

私はこのような質問ポストを使いました:

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 = '';
    }

問題は、カスタム投稿タイプによって数を制限することができないことです。何か案が?

ありがとうございました :)

3
rodboc

「できない」という答えを書くのは嫌いですが、できません。これは、単一の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クエリを構築しなければならないかもしれません。

3
s_ha_dum

これを行うには、クエリをマージします。

$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;
1
luke