WordPressのカテゴリーをプラグインなしで並び替える
WordPressのカテゴリーを任意の順番で並び替えたい、
そう思う場面は結構多いのかなと思います。
例えば、以下のような4件のカテゴリーがあるとします。
ID:2
カテゴリー名:料理
スラッグ:cooking
ID:3
カテゴリー名:スポーツ
スラッグ:sports
ID:4
カテゴリー名:その他
スラッグ:others
ID:5
カテゴリー名:旅行
スラッグ:travel
この4件のカテゴリー一覧を表示する際、
「その他」を一番下に表示したいと考えた場合、
IDで並び替えても、nameで並び替えても、slugで並び替えても
「その他」が一番下にはこないです。
get_categoriesで取得してvar_dump出力結果を下にそれぞれ記載しておきます。
実行したコード
1 2 3 4 5 |
$categories = get_categories(array( 'exclude' => '1', //今回は未分類を除外したいのでID:1をexclude 'orderby' => 'slug' //slugで並び替え、初期値はname )); var_dump($categories); |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
array(4) { [0]=> object(WP_Term)#3026 (16) { ["term_id"]=> int(2) ["name"]=> string(6) "料理" ["slug"]=> string(7) "cooking" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(2) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" //長いので一部省略 } [1]=> object(WP_Term)#3028 (16) { ["term_id"]=> int(4) ["name"]=> string(9) "その他" ["slug"]=> string(6) "others" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(4) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" //長いので一部省略 } [2]=> object(WP_Term)#3033 (16) { ["term_id"]=> int(3) ["name"]=> string(12) "スポーツ" ["slug"]=> string(6) "sports" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(3) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" //長いので一部省略 } [3]=> object(WP_Term)#3034 (16) { ["term_id"]=> int(5) ["name"]=> string(6) "旅行" ["slug"]=> string(6) "travel" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(5) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" //長いので一部省略 } } |
get_categoriesのorderbyでは
下記のとおりカテゴリーID、名前、スラッグ、該当する投稿数、親カテゴリーのIDにて並び替えが可能です。
orderby
(文字列) 指定した項目のアルファベット順またはカテゴリー ID によってカテゴリーを並べ替えます。初期値はカテゴリー名で並べ替えです。有効値な値は:
・id
・name – 初期値
・slug
・count
・term_group
上記結果をご覧のとおりslugで並び替えても「その他」が一番下にはきません。
他のorderbyで試しても「その他」を一番下にする事はできません。
こういった場合に良く利用されている「Category Order and Taxonomy Terms Order」を使うという手もありますが、
できるだけプラグインは使いたくないという人も多いかと思います。
そのような訳でプラグインを使わずに任意の並べ替えをする方法をご紹介したいと思います。
様々な方法があるのかと思いますが、一番コードの記述が少なくて方法としては
カテゴリーの「説明」欄に順位づけの値を入れる方法かと考えてます。
・旅行
・料理
・スポーツ
・その他
の順番に並べたいと考えた場合に、
10刻みで説明に数字を入力してカテゴリーを更新したとします。
・旅行(説明:10)
・料理(説明:20)
・スポーツ(説明:30)
・その他(説明:40)
別に1刻みでもいいのですが、
例えば旅行と料理の間に別のカテゴリーを追加したくなった場合に
間の数字を入れられるようにするため10刻みをオススメします。
この状態で先程と同じく取得してvar_dumpしてみます。
orderbyはしてません。
実行したコード
1 2 3 4 |
$categories = get_categories(array( 'exclude' => '1' //今回は未分類を除外したいのでID:1をexclude )); var_dump($categories); |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
array(4) { [0]=> object(WP_Term)#3026 (16) { ["term_id"]=> int(3) ["name"]=> string(12) "スポーツ" ["slug"]=> string(6) "sports" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(3) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "30" //長いので一部省略 } [1]=> object(WP_Term)#3028 (16) { ["term_id"]=> int(4) ["name"]=> string(9) "その他" ["slug"]=> string(6) "others" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(4) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "40" //長いので一部省略 } [2]=> object(WP_Term)#3033 (16) { ["term_id"]=> int(2) ["name"]=> string(6) "料理" ["slug"]=> string(7) "cooking" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(2) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "20" //長いので一部省略 } [3]=> object(WP_Term)#3034 (16) { ["term_id"]=> int(5) ["name"]=> string(6) "旅行" ["slug"]=> string(6) "travel" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(5) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "10" //長いので一部省略 } } |
descriptionに10~40の値が入っている事が確認できます。
$categories->descriptionでdescriptionの値が取得できますので
PHPのusortで並び替えます。
1 2 3 |
usort($categories, function ($a, $b) { return $a->description - $b->description; }); |
並べ替えてからvar_dumpするとこんな感じです。
実行したコード
1 2 3 4 5 6 7 |
$categories = get_categories(array( 'exclude' => '1' //今回は未分類を除外したいのでID:1をexclude )); usort($categories, function ($a, $b) { return $a->description - $b->description; }); var_dump($categories); |
結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
array(4) { [0]=> object(WP_Term)#3034 (16) { ["term_id"]=> int(5) ["name"]=> string(6) "旅行" ["slug"]=> string(6) "travel" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(5) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "10" //長いので一部省略 } [1]=> object(WP_Term)#3033 (16) { ["term_id"]=> int(2) ["name"]=> string(6) "料理" ["slug"]=> string(7) "cooking" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(2) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "20" //長いので一部省略 } [2]=> object(WP_Term)#3026 (16) { ["term_id"]=> int(3) ["name"]=> string(12) "スポーツ" ["slug"]=> string(6) "sports" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(3) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "30" //長いので一部省略 } [3]=> object(WP_Term)#3028 (16) { ["term_id"]=> int(4) ["name"]=> string(9) "その他" ["slug"]=> string(6) "others" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(4) ["taxonomy"]=> string(8) "category" ["description"]=> string(2) "40" //長いので一部省略 } } |
無事並び変わりました。
あとはforeachでループさせればOKです。
実行したコード
1 2 3 4 5 6 7 8 9 10 11 12 |
$categories = get_categories(array( 'exclude' => '1' //今回は未分類を除外したいのでID:1をexclude )); usort($categories, function ($a, $b) { return $a->description - $b->description; }); ?> |
結果
1 2 3 4 5 6 |
以上でプラグインを使わずに任意の並び替えが完了しました。
カテゴリーの説明欄は別の表示部分に使っているから
数字は入れられないよ、という人もいらっしゃるかと思います。
その場合は説明の下にカスタムフィールドで
例えば「並び替え用」といった項目を増やして利用する方法もあるかと思います。
まとめ
プラグインなしでカテゴリーを任意の並べ替えをするには以下の流れとなります。
1. カテゴリーの説明欄に並べ替え用の数字を保存する。
2. get_categoriesでカテゴリー一覧をorderbyは気にせずに取得する。
3. get_categoriesで取得した結果をPHPのusortを使ってdescriptionの値を基準に並び替える。
プラグインを多用すると色々と制限が多くなり後々辛くなってしまうので
出来るだけプラグインは使わないで済むといいですよね!
執筆者
30代の既婚者子持ちです。現在は非エンジニア職で経理とか色々やってますがもし生まれ変わったら次はリアルガチのプログラマーになりたいなと思っています。
何度か転職してまして2008年ぐらいからIT業界です。PHP,MySQLでの開発を多少経験していますが本職の人にはかないません。
この記事を読んだ人はこんな記事も読んでいます
CHANGEUP!では、エンジニアの転職、
フリーランスの案件紹介を行なっています。
将来の働き方で迷っている方、転職をお考えの方、あなたのエンジニアとしての力を最大限発揮できる場所を提案させていただきます。