サポート » 使い方全般 » 新着記事とカテゴリ別の記事一覧が重複しないようにしたい

  • 解決済 ikesu

    (@ikesu)


    トップページに「カテゴリABC〜の新着記事」と「カテゴリAの一覧」 「カテゴリBの一覧」 「カテゴリCの一覧」 を表示させた時に、 「カテゴリABC〜の新着」 と 「カテゴリAの一覧」 「カテゴリBの一覧」 「カテゴリCの一覧」 で同じ記事が表示されないようにしたいのですが良い方法はありませんでしょうか。

    新着記事が8件だった場合、8件が過ぎたものから各カテゴリの一覧に振り分けられていくイメージです。

    <div class="sab-t">カテゴリ新着ABC</div>
     <?php $posts = get_posts('numberposts=8&cat=32,33,34'); global $post;?>
     <?php foreach($posts as $post): ?>
     <div class="fps1">
     <div class="fps2"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php echo the_post_thumbnail(); ?></a></div>
     <div class="ttl01"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php $title= mb_substr($post->post_title,0,21); echo $title;?>...</a></div>
     </div>
     <?php endforeach; ?>
     <br clear="all"><br /> 
    
     <div class="sab-t">カテゴリA</div>
     <?php $posts = get_posts('numberposts=4&cat=32'); global $post;?>
     <?php foreach($posts as $post): ?>
     <div class="fps1">
     <div class="fps2"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php echo the_post_thumbnail(); ?></a></div>
     <div class="ttl01"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php $title= mb_substr($post->post_title,0,21); echo $title;?>...</a></div>
     </div>
     <?php endforeach; ?>
     <br clear="all"><br /> 
    
     <div class="sab-t">カテゴリB</div>
     <?php $posts = get_posts('numberposts=4&cat=33'); global $post;?>
     <?php foreach($posts as $post): ?>
     <div class="fps1">
     <div class="fps2"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php echo the_post_thumbnail(); ?></a></div>
     <div class="ttl01"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php $title= mb_substr($post->post_title,0,21); echo $title;?>...</a></div>
     </div>
     <?php endforeach; ?>
     <br clear="all"><br /> 
    
     <div class="sab-t">カテゴリC</div>
     <?php $posts = get_posts('numberposts=4&cat=34'); global $post;?>
     <?php foreach($posts as $post): ?>
     <div class="fps1">
     <div class="fps2"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php echo the_post_thumbnail(); ?></a></div>
     <div class="ttl01"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php $title= mb_substr($post->post_title,0,21); echo $title;?>...</a></div>
     </div>
     <?php endforeach; ?>
     <br clear="all"><br />

    上記では重複、offsetでは表示されない記事が出てしまう問題を解決したいです。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • ‘post__not_in’ というパラメータが用意されているので、
    このパラメータで取得済みの投稿IDを指定すれば、指定した投稿を除いた上で新着記事を取得できます。
    http://wpdocs.sourceforge.jp/関数リファレンス/WP_Query#.E6.8A.95.E7.A8.BF.EF.BC.86.E5.9B.BA.E5.AE.9A.E3.83.9A.E3.83.BC.E3.82.B8.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF

    ただし cat と post__not_in を一緒に指定できるかどうか?は当方では未検証です。

    トピック投稿者 ikesu

    (@ikesu)

    post__not_inを参照URLや検索サイトで調べてみましたところ
    'post__not_in' => array($post_id)を利用できそうに感じたのですが現在のコードに追記する方法がわかりません。

    phpの知識がなく現在のコードも検索で調べたものを組み合わせたコードになります。
    恐縮ですが記述例を教えて頂けませんでしょうか。

    <div class="sab-t">カテゴリA</div>
     <?php $posts = get_posts('numberposts=4&cat=32'); global $post;?>
     <?php foreach($posts as $post): ?>
     <div class="fps1">
     <div class="fps2"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php echo the_post_thumbnail(); ?></a></div>
     <div class="ttl01"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php $title= mb_substr($post->post_title,0,21); echo $title;?>...</a></div>
     </div>
     <?php endforeach; ?>
     <br clear="all"><br />
    モデレーター gatespace

    (@gatespace)

    除外する投稿用の変数を一つ用意して、「カテゴリ新着ABC」のループ部分で、その変数の中に「カテゴリ新着ABC」の投稿IDを入れていけば良いんじゃないですかね。

    未検証ですが

    <?php
    global $post; // 1回やればよいし、テンプレートファイル内なら書かなくても良い
    $post_not__in_ids = array(); // 除外するIDを格納する変数
    
    // カテゴリ新着ABC
    $args = array(
        'posts_per_page' => 4,
        'cat' => '32,33,34',
    );
    $new_posts = get_posts( $args );
    foreach ( $new_posts as $post ) :
        setup_postdata( $post );
        $post_not__in_ids[] = get_the_ID();
        /* 略 */
        endforeach;
    wp_reset_postdata(); // リセット
    
    // カテゴリA
    $cat_a_args = array(
        'posts_per_page' => 4,
        'cat' => 32,
        'post_not__in' => $post_not__in_ids
    );
    $cat_a_posts = get_posts( $cat_a_args );
    foreach ( $cat_a_posts as $post ) :
        setup_postdata( $post );
        /* 略 */
        endforeach;
    wp_reset_postdata(); // リセット

    トピック投稿者 ikesu

    (@ikesu)

    教えていただいたコードをそのまま貼り付けるとエラーが出たためphpタグを記入しましたが、これまでと同様に重複記事が表示されてしまいました。

    また、実際に使用する時は「カテゴリ新着ABC」と「カテゴリA」の間に別のコンテンツを表示させることを予定していますので、現在のコードは下記にようになっています。

    申し訳ありませんがよろしくお願いします。

    <?php
    global $post; // 1回やればよいし、テンプレートファイル内なら書かなくても良い
    $post_not__in_ids = array(); // 除外するIDを格納する変数
    
    // カテゴリ新着ABC
    $args = array(
        'posts_per_page' => 4,
        'cat' => '32,33,34',
    );
    $new_posts = get_posts( $args );
    foreach ( $new_posts as $post ) :
        setup_postdata( $post );
        $post_not__in_ids[] = get_the_ID();
     ?>
     /* 略 */
     <?php endforeach; ?>
     <?php wp_reset_postdata(); ?>
    
    <br clear="all"><br />
    <p>本文テキスト</p>
    
    <?php
    // カテゴリA
    $cat_a_args = array(
        'posts_per_page' => 4,
        'cat' => 34,
        'post_not__in' => $post_not__in_ids
    );
    $cat_a_posts = get_posts( $cat_a_args );
    foreach ( $cat_a_posts as $post ) :
        setup_postdata( $post );
     ?>
     /* 略 */
     <?php endforeach; ?>
     <?php wp_reset_postdata(); ?>
    モデレーター gatespace

    (@gatespace)

    post_not__inがタイポでした。正確には post__not_in ですね。失礼しました。
    こちらで記事が重複しない事は確認しました。

    教えていただいたコードをそのまま貼り付けるとエラーが出たため

    どんなエラーが出たのかも書いていただいた方が回答しやすいです。

    「カテゴリA」の間に別のコンテンツを表示させることを予定していますので、現在のコードは下記にようになっています。

    私が例示したのはあくまでFumito MIZUNOさんが書かれた get_posts の使い方(パラメーター)の部分の補足なんで、タイトルとか間に何かが入るとかはご自分で頑張ってみてください。

    トピック投稿者 ikesu

    (@ikesu)

    重複記事がなくなり思うように表示されるようになりました!

    エラーについては /* 略 */部分だけを差し替えてコピー&ペーストした場合、真っ白な画面になったので上記のようにphpタグで挟んでみたところ解消されました。

    別のコンテンツにつきましては、間にhtmlやほかのphpを表示させてもpost_not__in_idsを認識してくれるかどうかの確認でしたが、間にhtmlやphpを挟んでも無事に表示してくれました。勉強不足により妙な質問になり申し訳ありません。

    いろいろ教えてくださりありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「新着記事とカテゴリ別の記事一覧が重複しないようにしたい」には新たに返信することはできません。