5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-13

仕様

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?