サポート » 使い方全般 » 複数ループ:最新記事を除いたカテゴリー所属記事一覧表示

  • 解決済 SMSayaka

    (@smsayaka)


    独自テーマの作成で、
    トップページをニュースサイトやポータルサイトのようなインターフェイスを目指して作成しています。

    ■トップページで実現したいこと(home.php)
    ・最新記事タイトルリンク10件表示:メインループ、所属カテゴリー関係なく最新10件
    ・カテゴリA タイトルリンク5件表示:最新記事10件で表示されたタイトルリンクを除く
    ・カテゴリB タイトルリンク5件表示:最新記事10件で表示されたタイトルリンクを除く

    ・要は、1ページの中に重複して記事へのリンクが表示されないようにしたい。
    ・記事は1つのカテゴリーにのみ所属しています。

    Codex:ループ を参考に一度自分でテストとして下記のように書きました。

    //最新記事10件表示
    <ul>
    <?php $my_query = new WP_Query( 'posts_per_page=10' );
    while ( $my_query->have_posts() ) : $my_query->the_post();
    $do_not_duplicate[] = $post->ID; ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    </ul>
    
    //カテゴリーAに属する記事5件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    <?php $cata_query = new WP_Query( 'category_name=cata&posts_per_page=6' );?>
    <?php if ( have_posts() ) : while ( $cata_query ->have_posts() ) : $cata_query ->the_post(); $do_not_duplicate_report[] = $post->ID;?>
    <?php if ( in_array( $post->ID, $do_not_duplicate ) ) continue; ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    
    //カテゴリーBに属する記事5件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    <?php $catb_query = new WP_Query( 'category_name=catb&posts_per_page=6' );?>
    <?php if ( have_posts() ) : while ( $catb_query->have_posts() ) : $catb_query->the_post();?>
    <?php if ( in_array( $post->ID, $do_not_duplicate_report ) ) continue; ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    

    最新記事10件を除く各カテゴリーの表示はできたのですが、
    件数が5件ずつ表示できず、最新記事を除いた件数しか表示されません。

    例えば最新10件の中で5件がカテゴリーAに所属する記事だった場合、カテゴリーAには0件の表示になってしまいます。
    複数ループ、マルチループなど検索しましたが、思うような事例が見受けられませんでした。

    ご教授願います。
    何卒よろしくお願いいたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • こんにちは

    WP_Query の post__not_in パレメーターで除外したい投稿 ID(配列)を指定できます。

    $cata_query = new WP_Query( array(
    	'category_name' => 'cata',
    	'posts_per_page' => 5,
    	'post__not_in' => $do_not_duplicate // 除外する投稿 ID(配列)
    ) );

    2つめのループの

    $do_not_duplicate_report[] = $post->ID;

    がいらないのではないでしょうか。

    それがなくなったので、
    3つめのループの

    $do_not_duplicate_report

    の部分は最初の

    $do_not_duplicate

    でいいのではないですか。

    //最新記事10件表示
    <ul>
    <?php $my_query = new WP_Query( 'posts_per_page=10' );
    while ( $my_query->have_posts() ) : $my_query->the_post();
    $do_not_duplicate[] = $post->ID; ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    </ul>
    
    //カテゴリーAに属する記事5件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    <?php $args = array('post__not_in' => $do_not_duplicate,
    					'category_name' => 'cata',
    					'posts_per_page' => 5,
    );
    $cata_query = new WP_Query( $args );?>
    <?php if ( have_posts() ) : while ( $cata_query ->have_posts() ) : $cata_query ->the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    
    //カテゴリーBに属する記事5件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    <?php $args = array('post__not_in' => $do_not_duplicate,
    					'category_name' => 'catb',
    					'posts_per_page' => 5,
    );
    $cata_query = new WP_Query( $args );?>
    <?php if ( have_posts() ) : while ( $catb_query->have_posts() ) : $catb_query->the_post();?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>

    SMSayakaさんに合わせた書き方がわからなかったので……と書いてるうちに他の方が書いてますね。

    たぶん、条件に合う記事を書き出した後に
    <?php if ( in_array( $post->ID, $do_not_duplicate ) ) continue; ?>
    で削除しているので、その分記事数が減っているのだと思います。

    違うかな?

    ご教授いただいたコードをカスタマイズし、目指していた通りの挙動が実現できました。
    ループに関してまたさらに理解が深まったと実感しております。

    ishitaka様
    post__not_inを教えていただきありがとうございました。
    codexを読み直しやっと理解できました。
    使用方法にも注意が必要とのこと、学びになりました。ありがとうございました。

    ioxrxogi様
    具体的なコードをありがとうございます。
    実は2つ目のコードは、まずカテゴリーAを3件表示し、
    さらに、最新10件と先の3件を除いたカテゴリーAを4件サムネイルで表示する・・・
    という挙動が最終形態だったのですが、
    質問様に多少コードを整形していたら中途半端なコードが残った状態でした。
    大変失礼いたしました。

    本件は解決済みとさせていただきます。

    下記、最終のコードを記載します。

    
    //最新記事10件表示
    <ul>
    <?php $my_query = new WP_Query( 'posts_per_page=10' );
    while ( $my_query->have_posts() ) : $my_query->the_post();
    $do_not_duplicate[] = $post->ID; ?>
    
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    
    <?php endwhile; ?>
    
    </ul>
    
    //カテゴリーAに属する記事3件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    
    <?php $args = array('post__not_in' => $do_not_duplicate,
    					'category_name' => 'cata',
    					'posts_per_page' => 3,
    );
    $my_query = new WP_Query( $args );?>
    
    <?php if ( have_posts() ) : while ( $my_query->have_posts() ) : $my_query->the_post();
    $do_not_duplicate[] = $post->ID;?>
    
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    
    //カテゴリーAに属する記事さらに4件表示  サムネイルリンクを表示する
    // (最新記事10件に表示されている記事&先に表示したカテゴリA 3件を除く)
    
    <ul>
    <?php $args = array('post__not_in' => $do_not_duplicate,
    					'category_name' => 'cata',
    					'posts_per_page' => 3,
    );
    $my_query = new WP_Query( $args );?>
    
    <?php if ( have_posts() ) : while ( $my_query->have_posts() ) : $my_query->the_post();?>
    <li><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail(); ?></a></li>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    
    //カテゴリーBに属する記事5件表示 (最新記事10件に表示されている記事は除く)
    <ul>
    
    <?php $args = array('post__not_in' => $do_not_duplicate,
    					'category_name' => 'catb',
    					'posts_per_page' => 5,
    );
    $my_query = new WP_Query( $args );?>
    <?php if ( have_posts() ) : while ( $my_query->have_posts() ) : $my_query->the_post(); ?>
    
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「複数ループ:最新記事を除いたカテゴリー所属記事一覧表示」には新たに返信することはできません。