[Wordpress]任意の順序で子カテゴリー毎に記事を出力（例：都道府県順）


## 仕様
Wordpressで親子カテゴリーを作り、親カテゴリーのページに子カテゴリー毎に記事を並べるといったケースがあります。
例えば不動産情報のサイトで、「物件情報」という親カテゴリーの下に都道府県ごとの子カテゴリーを置き、都道府県別に新着記事を表示する、など。

以下のようなページ構造です。

- 物件情報(親)
    - 北海道(子)
        - 北海道の記事1
        - 北海道の記事2

    - 東京(子)
        - 東京の記事1
        - 東京の記事2

    - 大阪(子)
        - 大阪の記事1
        - 大阪の記事2

    - 香川(子)
        - 香川の記事1
        - 香川の記事2

    - 愛媛(子)
        - 愛媛の記事1
        - 愛媛の記事2
  
    - 沖縄(子)
        - 沖縄の記事1
        - 沖縄の記事2

今回は例として子カテゴリーが都道府県となっていますが、都道府県に限らずカテゴリー登録時とは違う順序で記事を並べたい場合に使えます。

尚、カテゴリーは以下のように親子設定することが前提となります。

![カテゴリー登録例](https://qiita-image-store.s3.amazonaws.com/0/62022/d67f4495-6c6f-10cd-79b3-818e83906796.png)

このように子カテゴリーを順不同で追加していくと、順番もカテゴリーIDもバラバラに付与されていくので、デフォルトのままだとカテゴリー毎に記事を出力させると規則性のない並びになってしまいます。

それでは以下が対処法です。

## コード

### 検証環境

+ PHP Version 5.3.8
+ Wordpress 4.2.2

### テーマファイル

```php
<?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](http://net-labo.net/?p=155)