サポート » 使い方全般 » カテゴリ 記事一覧 2重表示

  • 解決済 yama21

    (@yama21)


    カテゴリの同じ記事のタイトルが2つずつ表示されてしまいます。

    <?php

    $catList = get_categories();
    foreach ($catList as $val) {
    $id = $val->cat_ID;
    $resPost = get_posts(‘numberposts=-1&category=9&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);

    endforeach; ?>

    原因がわかりません。
    ご教示いただけると有難いです。

    宜しくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 先頭の foreach(仮にAと呼びます)の中でもう一つ foreach(Bと呼びます)が繰り返されますが、Aが2回繰り返されているのに、Bが $resArr に追加する投稿($post)はAの1回目でも2回目でもまったく同じ投稿だからです。
    想像ですが、get_posts のパラメータが違っていて、本当は次のようにしたいのではないですか?

    'numberposts=-1&category=' . $id . '&orderby=post_date'

    トピック投稿者 yama21

    (@yama21)

    gblsm様

    ご回答ありがとうございます。

    gblsm様の想像通り、元々は
    category の後に $idがあるものを
    カテゴリID 9 のみ表示させるページにさせたく
    そのようにしました。

    元々全部のカテゴリー合わせて最新のものを表示させるコードを変えただけですので

    カテゴリID 9のみを表示させるには
    どうしたら良いでしょうか。

    とりあえず下記のように直してみて
    (「この行、削除してください。」の行を丸ごと削除。)
    希望どおりに表示されるか確認してください。

    <?php
    
    $catList = get_categories(); // この行、削除してください。
    foreach ($catList as $val) { // この行、削除してください。
    $id = $val->cat_ID; // この行、削除してください。
    $resPost = get_posts('numberposts=-1&category=9&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);
    
    endforeach; ?>

    なお、上記のように直して希望どおりになったとしても、無駄なことを行っているコードなので、もっと短く(わかりやすく)書くことができるかもしれませんよ。

    トピック投稿者 yama21

    (@yama21)

    glsm様

    ご回答ありがとうございます。
    無事問題解決できました!!

    しかし内容をわかっていない自分がいます。
    問題にぶつかったとしても自分で解決できるよう
    やりつづけようと思います。

    調べて実際にやってみて、行き詰まったらこのフォーラムや周りの方に相談してみる、、、例えばそういう繰り返しで身に付くと思います。これからもぜひ続けてください。

    ところで「この行、削除してください」の行を削除した後のコードは、要約すると次のようなことを実施しています。

    1. get_posts関数で、カテゴリーIDが9の投稿を、post_dateの順に取得する。(デフォルトで降順になります。)
    2. foreachループで、$resPost(get_postsで取得した投稿の配列)から一つずつ投稿を取り出して、同じ順序のまま$resArrへ追加する(同じく投稿の配列になります)。
    3. 2番目のforeachループで、$resArrに入っている投稿それぞれの作成日を取り出して、同じ順序のまま$post_dateへ追加する(作成日の配列になります)。
    4. array_multisort関数で、$resArr(投稿の配列)と$post_date(投稿の作成日の配列)をソートします。どんなソート順序になるかは説明省略しますので興味あれば調べてください。
    5. 最後のforeach-endforeachループで、$resArrから順番に投稿を取り出して、、、後はお分かりですよね。

    そういう訳で、$resPostから$resArrへわざわざ移し変えなくても良さそうだと思いました。もともとの(カテゴリーIDが 9 ではなく $id だった)コードは、get_postsを一回だけではなく何度も呼び出すので、$resArrへ追加してから改て並べ替える必要がありましたけれど、カテゴリーIDを9に固定してしまえば改めて並べ替える必要はない訳です。

    トピック投稿者 yama21

    (@yama21)

    gblsm様

    ご丁寧にありがとうございます!

    すごくわかりやすいです。
    「ソースを読んでそれを理解する」
    ことがまだできずにいますので、苦しいところもありますが
    自分で調べてわからなかったらここを訪れる、

    頑張って続けたいと思います。

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