先頭の foreach(仮にAと呼びます)の中でもう一つ foreach(Bと呼びます)が繰り返されますが、Aが2回繰り返されているのに、Bが $resArr に追加する投稿($post)はAの1回目でも2回目でもまったく同じ投稿だからです。
想像ですが、get_posts のパラメータが違っていて、本当は次のようにしたいのではないですか?
'numberposts=-1&category=' . $id . '&orderby=post_date'
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; ?>
なお、上記のように直して希望どおりになったとしても、無駄なことを行っているコードなので、もっと短く(わかりやすく)書くことができるかもしれませんよ。
glsm様
ご回答ありがとうございます。
無事問題解決できました!!
しかし内容をわかっていない自分がいます。
問題にぶつかったとしても自分で解決できるよう
やりつづけようと思います。
調べて実際にやってみて、行き詰まったらこのフォーラムや周りの方に相談してみる、、、例えばそういう繰り返しで身に付くと思います。これからもぜひ続けてください。
ところで「この行、削除してください」の行を削除した後のコードは、要約すると次のようなことを実施しています。
- get_posts関数で、カテゴリーIDが9の投稿を、post_dateの順に取得する。(デフォルトで降順になります。)
- foreachループで、$resPost(get_postsで取得した投稿の配列)から一つずつ投稿を取り出して、同じ順序のまま$resArrへ追加する(同じく投稿の配列になります)。
- 2番目のforeachループで、$resArrに入っている投稿それぞれの作成日を取り出して、同じ順序のまま$post_dateへ追加する(作成日の配列になります)。
- array_multisort関数で、$resArr(投稿の配列)と$post_date(投稿の作成日の配列)をソートします。どんなソート順序になるかは説明省略しますので興味あれば調べてください。
- 最後のforeach-endforeachループで、$resArrから順番に投稿を取り出して、、、後はお分かりですよね。
そういう訳で、$resPostから$resArrへわざわざ移し変えなくても良さそうだと思いました。もともとの(カテゴリーIDが 9 ではなく $id だった)コードは、get_postsを一回だけではなく何度も呼び出すので、$resArrへ追加してから改て並べ替える必要がありましたけれど、カテゴリーIDを9に固定してしまえば改めて並べ替える必要はない訳です。
gblsm様
ご丁寧にありがとうございます!
すごくわかりやすいです。
「ソースを読んでそれを理解する」
ことがまだできずにいますので、苦しいところもありますが
自分で調べてわからなかったらここを訪れる、
頑張って続けたいと思います。