[子カテゴリー] [子カテゴリーに含まれれる記事のタイトル]
っていうデータを作りたい場合があると思います。
例えば
[今池の水道工事][テルソックにおまかせください!!]
[新瑞橋の水道工事][ミフテックABCにおまかせください!!]
こんな感じで子カテゴリとタイトル表示したい場合ですね。
あんましWordPressに詳しくないのでやってみるとやっかいでした。
INDEX
あれっ??て思ったとこ
どうせWP_Queryだろって思って、
いつも通り、Hissyさんのコレを見ました。
だけど、どーも子カテゴリ引っこ抜いてくるようなパラメータを見つけられず。
でも良く見たらそんな事なかったです。
とりあえずググった結果
2パターン見つけました。
多分もっとあるんだろうけど、
とりあえずこれでデキルだろうってやつ
1つ目
get_categoriesでカテゴリIDから子カテゴリを取得
子カテゴリ分回すついでにカテゴリの名前を取得
回ってる時にwp_queryでクエリを投げる
戻ってきたオブジェクトのpostsプロパティを回す
さっき取ったカテゴリの名前を出力、次にpost_titleを出力
function getmapdata($catid) { $categories = get_categories(array('parent'=>$catid)); foreach($categories as $category) { $cat = $category->cat_name; $obj = new WP_Query(array('cat'=>$category->cat_ID,'posts_per_page'=>1)); foreach($obj->posts as $array) { echo $cat.'  '.$array->post_title.PHP_EOL; } } wp_reset_query(); }
こんな感じになるんだと思います。
2つ目
カテゴリー番号をget_termsに入れる
それをchild_ofのパラメータに使って子カテゴリ取得
回すカテゴリを取得するパラメータを生成
query_postsをループで回す
それで出力
コードはこちらの記事から見ていただくといいです。
現在のカテゴリの子カテゴリ一覧と各子カテゴリに属する記事の一覧を表示
1つ目について思うこと
記事数の制御がしづらいのが問題だなぁと思いました。
例えば出力する件数が決められている場合に、
5件出力の所、子カテゴリが2件とかあったら5件超えますし、
post_per_pageで制御するにしろ、子カテゴリの数が出力件数を超えている場合
プログラムで制御しないとダメになるので、めんどくさいなーってなります。
2つ目について思うこと
初めてコレを見たとき、ええやんこれでってなって、
ちょっと修正加えてはいおっけーってやろうと思ったんですけど、
query_postsはメインクエリの改変が行われるために、
ちょっと扱い辛いらしいのです。なので2を参考にして書きました。
書いてみたプログラム
query_posts使わずにWP_Queryでやればいいじゃんって。
でもWP_Queryに子カテゴリ捕まえてくるようなパラメータ無かったじゃん
ってなったんですけど、それは僕の勘違いでした。
子カテゴリってタクソノミー扱いになってるっぽいからです。(あんま自信ないけど
だってこうなってるんだもん。
["tax_query"]=> array(1) { [0]=> array(3) { ["field"]=> string(2) "ID" ["taxonomy"]=> string(8) "category" ["terms"]=> string(1) "2" } }
こう見るとタクソノミーの名前がカテゴリーの2番って見方ができるじゃありませんか!
なので、HissyさんとこのWP_Queryの表を見ながら、、、、
$arg = array( 'tax_query' => array( array( 'field' => 'ID', 'taxonomy' => 'category', 'terms' => $term_id, ), ), );
こーんな感じでパラメータ定義するといんじゃないでしょっか!
つまりこんな感じでコード書くといんじゃないでしょうか!
function getSoncat($catid) { $categories = get_terms('category',array( 'orderby' => 'id', 'order' => 'ASC', 'parent' => $catid, 'hide_empty' => 0, )); $catmerge = array(); for($i=0; $i<count($categories); $i++) { $arg = array( 'tax_query' => array( array( 'field' => 'ID', 'taxonomy' => 'category', 'terms' => $categories[$i]->term_id, ), ), ); $q = new WP_Query($arg); for($j=0; $j<count($q); $j++) { if(!empty($q->posts[$j]->post_title)) { $catmerge[] = array( "termid" => $categories[$i]->term_id, "name" => $categories[$i]->name, "title" => $q->posts[$j]->post_title, ); } } } return $catmerge; }
なんかいつも通りグダグダですけど、
誰かがコレやる時困らなければ良いなと思います。