• 解決済 satceee

    (@satceee)


    トップページに記事の一覧(3つのカテゴリーを指定)を表示ししたいと思っております。
    それを
    奇数にはAのカテゴリーを表示
    偶数にはA以外を表示
    と言う感じにしたいと思っているのですが、このような表示のしかたは可能なのでしょうか。

    当方無い頭で
    ループの中にカテゴリーを奇数偶数で分岐するんだろうと
    単純に思っているのですが、記述方法がわかりません。

    どなたかお力をお貸しして頂けましたら幸いです。
    宜しくお願い致します。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • 奇数・偶数というのがどこから持ってくる数字なのかわからないですが
    2で割って余りがあるかないかというようにして判定します。
    ループというのも人によってwp queryクラスをつかったりget_postsを使ったりと
    色々ですので実際に「こう」とはいえませんが

    $count = 1;
    //ループ開始
    if($count % 2 == 1){ // == 1がなくてもいけるかもしれません
      //奇数の処理
    }else{
      //偶数の処理
    }
    $count++;
    //ループ終了

    こんなかんじで判定します。

    トピック投稿者 satceee

    (@satceee)

    わー!
    jdbbさん
    さっそく有り難うございます。

    頂いたソースでなんとなく全体の構成がわかりました。
    それで引き続きご質問させてもらいたいのですが、

    例えば

    $count = 1;

    if (have_posts()) :
    while (have_posts()) : the_post(); //ループ開始

    if($count % 2 == 1)

    $args = array( ‘category’ => 1 );
    $myposts = get_posts( $args );
    foreach ( $myposts as $post ) : setup_postdata( $post );

    カテゴリー1の内容

    endforeach;
    wp_reset_postdata(); //奇数の処理

    }else{

    $args = array( ‘category’ => 2 );
    $myposts = get_posts( $args );
    foreach ( $myposts as $post ) : setup_postdata( $post );

    カテゴリー2の内容

    endforeach;
    wp_reset_postdata(); //偶数の処理

    }
    $count++;

    endwhile;
    endif; //ループ終了

    こんな記述方法でも大丈夫なのでしょうか?
    度々宜しくお願い致します。

    コードを記述するときは「code」ボタンを使って
    半角のバックスラッシュ「`」で囲むようにしてください。

    で、そのような記述では奇数偶数の判定自体は大丈夫ですが
    メインクエリのループ内

    if (have_posts()) :
    while (have_posts()) : the_post();

    endwhile;
    endif; //ループ終了

    の中でsetup_postdataを使用したら問題あると思います。(もしかしたらないかもしれません)

    satceee様が実際にどのような動きを想定しているのかもうすこし詳しく教えてもらえると
    もっといい方法があると思います。

    あげていただいたコードがちゃんと動いた場合、管理画面の一覧表示件数が3の場合で
    新着情報
    ○○○○○(カテゴリ1)
    ○○○○○(カテゴリ1)
    ○○○○○(カテゴリ1)
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ1)ここから一番上のと同じ記事
    ○○○○○(カテゴリ1)
    ○○○○○(カテゴリ1)

    となります。

    トピック投稿者 satceee

    (@satceee)

    jdbb様
    ご返事有り難うございます。

    >コードを記述するときは「code」ボタンを使って
    >半角のバックスラッシュ「`」で囲むようにしてください。

    ↑こちら大変勉強になりました、有り難うございます。
    また、説明がへたくそで申し訳ございません。

    実際はこういう動きにしたいのです。

    新着情報
    ○○○○○(カテゴリ1)奇数
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ1)奇数
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ1)奇数
    ○○○○○(カテゴリ2)
    ○○○○○(カテゴリ1)奇数
    ○○○○○(カテゴリ3)たまに3つ目のカテゴリ

    説明致しますと、
    奇数の所には常に(カテゴリ1)
    偶数の所には(カテゴリ1)意外が表示されたいのです、
    それで偶数の記事が新着が無ければ(カテゴリ1)のみシフトしていく感じで、
    常に配列順は交互になるようにしたいと思っております。

    宜しくお願い致します。

    ありがとうございます。よくわかりました。
    そのような動きの場合は偶数奇数での判定ではなく一旦カテゴリ1以外の新着を別で取得しておき
    メインクエリではカテゴリ1をループさせ、ループ終了部分で1つずつ表示させるという方法
    でいいと思います。

    まず、トップページのメインループをカテゴリ1に絞るために、functions.phpに

    function my_home_query($query) {
    	if (is_admin())
    		return;
    	if ($query->is_main_query() && $query->is_home()){
    		$query->set('cat', 1);
    	}
    }
    add_action('pre_get_posts', 'my_home_query');

    とします。
    その上でhome.phpなりindex.phpで

    $args = arrray(
    	'category__not_in' => 1
    );
    $other_posts = get_posts($args);

    でカテゴリ1以外の情報を取得し
    メインクエリ内で表示します。(ループ内ではオブジェクトのまま表示していく形で)

    <ul>
    <?php
    $i = 0;
    if (have_posts()): while (have_posts()): the_post();
    ?>
    	<li><a href="<?php the_permalink()?>"><?php the_title(); ?></a></li>
    	<?php if(count($other_posts) > $i ): ?>
    		<li><a href="<?php echo get_permalink($other_posts[$i]->ID)?>"><?php echo esc_html($other_posts[$i]->post_title); ?></a></li>
    	<?php endif; ?>
    <?php $i++;endwhile;endif;?>
    </ul>

    だいたいこんな感じだと思います。(多分色々変な部分があるかもしれませんがおおまかにってことで)

    トピック投稿者 satceee

    (@satceee)

    jdbb様
    ありがとうございます!

    只今おしえていただいたソースを設置してみましたら、
    思っていた動作になりました〜!

    自分の単純な奇数偶数って考え方を
    違う視点で考えて頂いてとても感謝と感動をしております。
    ソース内容も大変勉強にもなりました(わからない箇所もあいりますが、自分の勉強不足です。。。)、本当に有り難うございます。
    教えて頂いたソースをじっくりと勉強させて頂きます。

    こんな夜にお時間と知恵を頂いて、本当にありがとうございました。

    完了しましたら解決済みとしておいてください。

    で、上のやつですが今考えるとちょっとメンテしにくく、わかりづらい書き方ですね。
    pre_get_postsでやるのはデータベースへのクエリ数を減らすためですが
    トップページだけということ、今後のメンテの際に見通しが悪くなることを考えると
    そこまでして絶対にpre_get_postsを使わなければいけないというわけではないので
    この場合はテンプレート内で完結させたほうが良さそうです。

    ・カテゴリ1のものとカテゴリ1以外のものをそれぞれ取得する。
    ・カテゴリ1をループさせて、そのループ終了前にカテゴリ1以外のものを表示する
    とします。

    $odd_args = arrray(
    	'category__in' => array(1)
    );
    $odd_posts = get_posts($odd_args);
    $even_args = arrray(
    	'category__not_in' => array(1)
    );
    $even_posts = get_posts($even_args);

    最初にこのようにして奇数(カテゴリ1)の投稿と偶数(カテゴリ1以外)を
    それぞれ別に取得します。

    <?php for($i = 0;count($odd_posts) < $i;$i++): ?>
    	//この中でそれぞれを表示させる
    <?php endfor; ?>

    同じ順番のものを使用するのでforeachではなくfor文でループを作ります。
    配列をまとめてからfoeachで回したほうが速いですがせいぜい10~20件でしたら
    変わりませんし、表示を各々変える場合もありそうですので判定でなんか入れるよりは
    この方が単純でわかりやすいかと思います。

    その上で上記ループ内でそれぞれを表示するだけになります。

    <ul>
    <?php for($i = 0;count($odd_posts) < $i;$i++): ?>
    
    	<?php setup_postdata($odd_posts[$i]); /*奇数(カテゴリ1)の記事 */ ?>
    	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    
    	<?php if(count($even_posts) > $i ): setup_postdata($even_posts[$i]); /*偶数(カテゴリ1以外)の記事 */ ?>
    		<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    	<?php endif; ?>
    
    <?php endfor;wp_reset_postdata(); ?>
    </ul>

    どちらでも結果は変わりませんが、今後も自分がよく触ったり
    他の人が触ったりするのが頻繁であるようならこちらのほうがいいかと思います。

    トピック投稿者 satceee

    (@satceee)

    jdbb様
    ご連絡有り難うございます。

    >完了しましたら解決済みとしておいてください。
    そうでしたね、失礼致しました。

    その後昨晩の教えて頂いたソースで、記事の追加と検証をしておりましたら、同じものが重複して出てきたりとかでちょっと不具合がでてきました。原因はまだわかりませんが、、、
    また、上記新しく頂いたソースで試してみた所、

    $odd_args = arrray(  //この部分にエラーが出ててarrray→arrayに直したらエラーが消えました。
    	'category__in' => array(1)
    );

    修正した後

    <?php $odd_args = array(
     'category__in' => array('17') //実際はカテゴリーid17なのでそのまま表示します。
    				);
     $odd_posts = get_posts($odd_args);
     $even_args = array(
     'category__not_in' => array('17')
    				);
     $even_posts = get_posts($even_args); ?>
    
                    <ul id="topCol_container">
    
                        <?php for($i = 0;count($odd_posts) < $i;$i++): ?>
    
                        <?php setup_postdata($odd_posts[$i]); /*奇数(カテゴリ1)の記事 */ ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    
                        <?php if(count($even_posts) > $i ): setup_postdata($even_posts[$i]); /*偶数(カテゴリ1以外)の記事 */ ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endif; ?>
    
                        <?php endfor;wp_reset_postdata(); ?>
    
                    </ul><!--/#topCol_container-->

    でやったところ、今度は何も表示されませんでした。

    せっかくメンテ性や他人が触る事を考慮して頂いたのですが、私が使えきれていなくすいません。

    また、只今テスト環境にて構築中なのですが、他の設定のPCにテーマを移す際にIDでの指定だとIDナンバーがかわってしまったらと考えまして、スラッグ指定にすることは可能なものでしょうか?続けざまの質問で大変恐縮なのですが、合わせてご教授宜しくお願い致します。

    すみません。arrayのtypoに加え、for文の条件式が逆でした…
    正しくは
    <?php for($i = 0;$i < count($odd_posts);$i++): ?>
    にして試してください。

    トピック投稿者 satceee

    (@satceee)

    jdbb様
    ご連絡有り難うございます。

    直してやってみましたが、思うように表示されませんでした。。。
    今回はちょっと仕様自体を変えてみます。
    ですが、本当に色々勉強になりましたので大変感謝しております。
    私自身ももっと勉強しないとイレギュラーなWPの応用サイトは難しいなと実感しました。

    jdbb様
    また道に迷った時はお力を貸して頂けましたら幸いです。

    有り難うございました。

    これでここを閉めます。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「トップページの記事一覧を奇数偶数で表示するカテゴリーを分けたい」には新たに返信することはできません。