サポート » 使い方全般 » 指定した複数カテゴリの最新記事を各1件ずつ、投稿順に表示したい

  • 解決済 yukki

    (@yukki)


    色々と検索したのですが、どうしても見つけることができなかったため質問させて頂きます。

    カテゴリA
    カテゴリB
    カテゴリC
    カテゴリD

    とあった場合、カテゴリB・カテゴリC・カテゴリDを指定して、指定したカテゴリの最新記事を各1件ずつ、投稿日順にメインページやサイドバーに表示したいと考えています。表示したいのは、記事タイトルと本文(続きを読むの手前まで)です。

    たとえば、カテゴリCに記事を投稿した場合、

    ・カテゴリCの最新記事
    ・カテゴリBの最新記事
    ・カテゴリDの最新記事

    となり、その次にカテゴリBに記事を投稿すると、

    ・カテゴリBの最新記事
    ・カテゴリCの最新記事
    ・カテゴリDの最新記事

    というような順番になるのが理想的です。

    get_postsやwp_queryなど思いつく限りで色々と試してみましたが、どうしても思い通りの表示にすることができませんでした。どなたかお詳しい方がいらっしゃいましたら、ご教示いただけますでしょうか。当方、PHPの知識がなく、できましたら例を挙げて説明して頂けると大変助かります。

    宜しくお願い致します。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • 解決済みにはなっていませんけど、http://ja.forums.wordpress.org/topic/2555?replies=3が解決のヒントになりませんか?

    トピック投稿者 yukki

    (@yukki)

    > shokun0803さん

    ここに質問する前にそちらのページは何度もチェックしており、「例えばの話」の箇所を参考にさせて頂いて色々と調べながら試行錯誤してみました。

    「全カテゴリの最新の投稿を1件ずつ表示」は当方でも確認できたのですが、どうしても今回質問した「指定したカテゴリの最新記事を投稿順に各1件ずつ」を出力することができずに、こちらに質問させて頂きました。

    やることとしてはこう言う手順になると思います。

    1. get_the_categoryで現在表示中のカテゴリーを取得(Codexにサンプルがあります)
    2. get_categoriesで現在表示中のカテゴリー以外の全てのカテゴリーを取得(excludeを指定すればできますね)
    3. get_postsで現在表示中のカテゴリーの最新記事を取得
    4. get_postsで現在表示中のカテゴリー以外の最新記事を順番に取得(ここだけPHPのforeach文などが必要です)

    全部書くと大変だし、それぞれの項目は参考になる情報がありそうな気がします。

    結構強引だけど、こんなようなんじゃだめかな?(ほぼ未検証)

    <?php
      $my_category_1 = get_posts('numberposts=1&category=1&orderby=post_date');
      $my_category_2 = get_posts('numberposts=1&category=4&orderby=post_date');
      $my_category_post = array_merge_recursive($my_category_1, $my_category_2);
      foreach ($my_category_post as $post) :
      setup_postdata($post);
    ?>
    <a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php the_title(); ?></a>
    <?php the_content(); ?>
    <?php endforeach; ?>

    まあ、並べ替えとかは適当に・・・

    トピック投稿者 yukki

    (@yukki)

    ご提示頂いたサンプル例で「指定した複数カテゴリの出力」はできたのですが、category=4に新規記事を投稿をした場合、category=1の上には出力されないようです。自分でカスタマイズしようにも、やはりPHPを理解していないと難しいですね。

    umbrella_processさんの手順を一つ一つつぶしながら、ご提示頂いたサンプル例を参考に試行錯誤してみたいと思います。返信して頂いた方、ありがとうございました。

    解決はしていませんので、トピックは締めないでおきます。

    shokun0803さんが最後に「並び替えとかは適当に」と書かれているように、並び替えはご自分で実装しないとだと思いますけど・・・

    カスタムフィールドの有無や、複数カテゴリの投稿などは考慮してませんが、以下のようなやりかたも考えられますかね。
    全部のカテゴリをなめるとして、サンプルを動かしてみました。

    <?php
    	$catList = get_categories();
    	foreach ($catList as $val) {
      		$id = $val->cat_ID;
    		$resPost = get_posts('numberposts=1&category='.$id.'&orderby=post_date');
    			foreach ($resPost as $post) {
    				$resArr []= $post;
    			}
    	}
    	foreach($resArr as $key=>$row){
    		$post_date[$key] = $row->post_date;
    	}
    	array_multisort($resArr,SORT_DESC,$post_date);
    	var_dump($resArr);
    ?>

    特定のカテゴリを指定するなら
    $catList = get_categories();

    $catList = array(1,3,5,7)
    とかすると良いかもしれません。
    最後にダンプさせてますので、正しく並び替えられているか確認してみてください。
    実際の表示は、このあとにforeachなどでお好きなようにどうぞ。

    トピック投稿者 yukki

    (@yukki)

    皆さんに提示して頂いた方法を組み合わせて、タイトル通りの表示ができました。
    複数カテゴリを指定する部分で、arrayを使うとうまく出力がされなかったので、excludeで表示したくないカテゴリを指定しています。

    foreachの書き方がわからず、ただ当てはめていっただけなので間違っているかもしれませんが、問題がなさそうであれば明日にでもトピックを締めたいと思います。

    皆さんありがとうございました。
    本当に助かりました。

    <?php
    	$catList = get_categories('exclude=1,4');
    	foreach ($catList as $val) {
      		$id = $val->cat_ID;
    		$resPost = get_posts('numberposts=1&category='.$id.'&orderby=post_date');
    			foreach ($resPost as $post) {
    				$resArr []= $post;
    			}
    	}
    	foreach($resArr as $key=>$row){
    		$post_date[$key] = $row->post_date;
    	}
    	array_multisort($resArr,SORT_DESC,$post_date);
    	foreach($resArr as $post):
    	setup_postdata($post);
    ?>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    <?php the_content(); ?>
    <?php endforeach; ?>

    私の書いた部分は、もしかするともっとすっきり書けるかもしれませんが、とりあえず完成したコードで問題無いと思います。
    補足ながら、無駄な行が増えるかもですが、後々の可読性という意味で。

    <?php
    // 各カテゴリからデータの所得とソート
    	$catList = get_categories('exclude=1,4');
    	foreach ($catList as $val) {
      		$id = $val->cat_ID;
    		$resPost = get_posts('numberposts=1&category='.$id.'&orderby=post_date');
    			foreach ($resPost as $post) {
    				$resArr []= $post;
    			}
    	}
    	foreach($resArr as $key=>$row){
    		$post_date[$key] = $row->post_date;
    	}
    	array_multisort($resArr,SORT_DESC,$post_date);
    ?>
    
    <?
    	foreach($resArr as $post):
    	setup_postdata($post);
    ?>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    <?php the_content(); ?>
    <?php endforeach; ?>

    などとすると良いのかな?と思います。
    また、get_category と array で処理を変えなくてはなりませんので、最初のほうを以下のように書き換えると流用が効くと思います。

    <?php
    // 各カテゴリからデータの所得とソート
    //	$catList = get_categories('exclude=1,4'); // テンプレート関数用
    	$catList = array(2,3,4,5,6,7,8,9); // 配列指定用
    	foreach ($catList as $val) {
      		$id = $val;
      		if(is_object($id)) : $id = $val->cat_ID; endif;
      		$resPost = ~以下同じ~

    今、テストしてみたら$catList 部分だけの置き換えで動くことを確認しました。
    っていうか、さきほど自分で使う業務が出てきたので私も助かりました^^

    kvexさん、いつもフォローありがとうございます。
    foreachを繰り返すと巨大サイトで記事が膨大になった場合に遅延の原因になるのではないかと上記のようなコードを考えてみていました。全部のカテゴリをなめると案外怖いですよね(汗)

    yukkiさん。
    やっぱり並べ替えまでのコードが必要でしたか・・・すみません。時間的に手を抜いていましたorz

    そうなんですよ。
    なので私の案も、一つの考え方として。。。ですね

    for で回した方が幾分か付加は減るかなぁ。

    トピック投稿者 yukki

    (@yukki)

    > kvexさん
    補足のコードまでご提示頂きありがとうございます。
    arrayでの動作ですが、当方でも確認することができました。
    カテゴリ数が多少多くなりそうだったので助かります。

    > shokun0803さん
    いえ、とんでもありません。
    お忙しい中ご返信頂きありがとうございました。
    ご提示頂いたコードでも並べ替えできるようにチャレンジしてみます。

    本日PHP関連の本を購入してきました。
    マスターすることはできなくても、せめて意味を理解できるまでにはなりたいと思います。
    それでは、また質問させて頂くこともあるかと思いますが、その際は何卒宜しくお願い致します。

    自ら勉強しようとするところがすばらしいです。
    ほぼ未検証ですが、ちょっとコードを考えてみました。

    カテゴリ数が多少多くなりそうだったので助かります。

    も考慮して並べ替えまでやってみましたが、動作に保障はありません、すみません。

    functions.phpに以下を記述して、

    function my_top_list($category_list) {
      global $post;
      foreach( $category_list as $val ) {
        $my_category[] = get_posts('numberposts=1&category=' . $val . '&orderby=post_date');
      }
      $my_category_count = count($my_category);
      $my_category_post = array();
      for( $i = 0;$i < $my_category_count;$i++ ) {
        $my_category_post = array_merge_recursive($my_category_post, $my_category[$i]);
        $sort_key[$i] = $my_category[$i][0] -> post_date;
      }
      arsort($sort_key);
      foreach( $sort_key as $key => $val ) :
        $post = $my_category_post[$key];
        setup_postdata($post);
    ?>
    <a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php the_title(); ?></a>
    <?php the_date(); ?><?php the_category(); ?>
    <hr />
    <?php
      endforeach;
    }

    呼び出したい場所で、

    <?php
      $category_list = array( '1', '4', '10' );
      my_top_list($category_list);
    ?>

    などと呼び出します。
    表示部分はがっつりfunctionにじか書きしちゃってるので、適当に変更してください。

    もっと良いコードがあると思いますので、ご参考までということで・・・

    トピック投稿者 yukki

    (@yukki)

    > shokun0803さん

    別コードをご提示頂きありがとうございます。
    動作も確認できました。

    functionから呼び出すという方法もあるのですね。
    大変勉強になります。

    現時点ではコードを見ても全く意味がわかりませんが、いつか理解できるように頑張ります。
    今回は本当にありがとうございました。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「指定した複数カテゴリの最新記事を各1件ずつ、投稿順に表示したい」には新たに返信することはできません。