仕様
Wordpressで親子カテゴリーを作り、親カテゴリーのページに子カテゴリー毎に記事を並べるといったケースがあります。
例えば不動産情報のサイトで、「物件情報」という親カテゴリーの下に都道府県ごとの子カテゴリーを置き、都道府県別に新着記事を表示する、など。
以下のようなページ構造です。
- 物件情報(親)
-
北海道(子)
- 北海道の記事1
- 北海道の記事2
-
東京(子)
- 東京の記事1
- 東京の記事2
-
大阪(子)
- 大阪の記事1
- 大阪の記事2
-
香川(子)
- 香川の記事1
- 香川の記事2
-
愛媛(子)
- 愛媛の記事1
- 愛媛の記事2
-
沖縄(子)
- 沖縄の記事1
- 沖縄の記事2
-
今回は例として子カテゴリーが都道府県となっていますが、都道府県に限らずカテゴリー登録時とは違う順序で記事を並べたい場合に使えます。
尚、カテゴリーは以下のように親子設定することが前提となります。
このように子カテゴリーを順不同で追加していくと、順番もカテゴリーIDもバラバラに付与されていくので、デフォルトのままだとカテゴリー毎に記事を出力させると規則性のない並びになってしまいます。
それでは以下が対処法です。
コード
検証環境
- PHP Version 5.3.8
- Wordpress 4.2.2
テーマファイル
<?php
// 親カテゴリーのスラッグを指定
$parent_slug = 'estate';
$cat = get_category_by_slug($parent_slug);
$category_id = $cat->term_id;
$args = array('parent' => $category_id,'orderby' =>id);
$cats = get_categories($args);
// 子カテゴリーの都道府県ごとに番号とスペルを関連付ける
foreach ($cats as $cat) {
$prefname = $cat->cat_name;
/*
$prefspell = 子カテゴリー(都道府県)のスラッグ
$prefid = 並べる順番
*/
switch ($prefname) {
case '北海道': $prefslug ='hokkaido'; $prefid = 1; break;
case '青森': $prefslug ='aomori'; $prefid = 2; break;
case '岩手': $prefslug ='iwate'; $prefid = 3; break;
case '宮城': $prefslug ='miyagi'; $prefid = 4; break;
case '秋田': $prefslug ='akita'; $prefid = 5; break;
case '山形': $prefslug ='yamagata'; $prefid = 6; break;
case '福島': $prefslug ='fukushima';$prefid = 7; break;
case '茨城': $prefslug ='ibaraki'; $prefid = 8; break;
case '栃木': $prefslug ='tochigi'; $prefid = 9; break;
case '群馬': $prefslug ='gunma'; $prefid = 10; break;
case '埼玉': $prefslug ='saitama'; $prefid = 11; break;
case '千葉': $prefslug ='chiba'; $prefid = 12; break;
case '東京': $prefslug ='tokyo'; $prefid = 13; break;
case '神奈川': $prefslug ='kanagawa'; $prefid = 14; break;
case '新潟': $prefslug ='nigata'; $prefid = 15; break;
case '富山': $prefslug ='toyama'; $prefid = 16; break;
case '石川': $prefslug ='ishikawa'; $prefid = 17; break;
case '福井': $prefslug ='fukui'; $prefid = 18; break;
case '山梨': $prefslug ='yamanashi';$prefid = 19; break;
case '長野': $prefslug ='nagano'; $prefid = 20; break;
case '岐阜': $prefslug ='gifu'; $prefid = 21; break;
case '静岡': $prefslug ='shizuoka'; $prefid = 22; break;
case '愛知': $prefslug ='aichi'; $prefid = 23; break;
case '三重': $prefslug ='mie'; $prefid = 24; break;
case '滋賀': $prefslug ='shiga'; $prefid = 25; break;
case '京都': $prefslug ='kyoto'; $prefid = 26; break;
case '大阪': $prefslug ='osaka'; $prefid = 27; break;
case '兵庫': $prefslug ='hyougo'; $prefid = 28; break;
case '奈良': $prefslug ='nara'; $prefid = 29; break;
case '和歌山': $prefslug ='wakayama'; $prefid = 30; break;
case '鳥取': $prefslug ='tottori'; $prefid = 31; break;
case '島根': $prefslug ='shimane'; $prefid = 32; break;
case '岡山': $prefslug ='okayama'; $prefid = 33; break;
case '広島': $prefslug ='hiroshima';$prefid = 34; break;
case '山口': $prefslug ='yamaguchi';$prefid = 35; break;
case '徳島': $prefslug ='tokushima';$prefid = 36; break;
case '香川': $prefslug ='kagawa'; $prefid = 37; break;
case '愛媛': $prefslug ='ehime'; $prefid = 38; break;
case '高知': $prefslug ='kouchi'; $prefid = 39; break;
case '福岡': $prefslug ='fukuoka'; $prefid = 40; break;
case '佐賀': $prefslug ='saga'; $prefid = 41; break;
case '長崎': $prefslug ='nagasaki'; $prefid = 42; break;
case '熊本': $prefslug ='kumamoto'; $prefid = 43; break;
case '大分': $prefslug ='ooita'; $prefid = 44; break;
case '宮崎': $prefslug ='miyazaki'; $prefid = 45; break;
case '鹿児島': $prefslug ='kagoshima';$prefid = 46; break;
case '沖縄': $prefslug ='okinawa'; $prefid = 47; break;
}
// 上記の内容を配列に収める
$preflist[$prefslug] = array(
'id' => $prefid, //この値を基準にソートする
'name' => $prefname,
'slug' => $prefslug
);
}
// ソートする値を定義
foreach ($preflist as $key => $value) {
$key_id[$key] = $value['id'];
}
// 番号順にソート
array_multisort ($key_id , SORT_ASC , $preflist);
// 都道府県別に記事を出力する
foreach ($preflist as $key => $value) {
// 見出し(都道府県名)
echo '<h2 id="'.$value[slug].'">'.$value[name].'</h2>';
$pref_cat = get_category_by_slug($value[slug]);
$pref_category_id = $pref_cat->term_id;
// get_postsのパラメーターは適宜設定してください。
$posts = get_posts('numberposts=-1&category='.$pref_category_id);
foreach ($posts as $post) : setup_postdata($post);
// 日付
the_time('Y-m-d');
// 記事の内容
the_content();
endforeach;
}
?>
ポイントは、$preflist という配列に[カテゴリー名],[カテゴリースラッグ],[番号]を収め、array_multisort()で番号順にソート(並べ替え)している点です。
array_multisort()という関数の使い方は下記のページを参考にしました。ありがとうございます。
▼PHPの連想配列をソートする時に便利な関数(array_multisort)
http://net-labo.net/?p=155