【WordPress】プラグインなしでカテゴリーを並び替える方法

WordPressはかなりの人が使っているものだが、その割にはカテゴリーの並び順がデフォルトに付いていない。

そのため、カテゴリーの並び替えをしたいと思ったら、大体がプラグイン(主にCategory Order and Taxonomy Terms Order)を入れることになる。

下の画像はCategory Order and Taxonomy Terms Orderを有効化してカテゴリーを並び替えたものだ。

だが、自分はプラグインを可能な限りいれたくない人間である。

カテゴリーの並び替えを気にする前に記事を投稿したほうがいい。

本人が思っているほど読者はカテゴリーを見ていない。

そんなことはわかっている。

わかっているのだが、細かい部分まできっちりしたいと思ってしまうのだ。

ということで、ここではWordPressのカテゴリーの並び順をプラグインなしで編集できるコードと使い方を説明する。

今、Category Order and Taxonomy Terms Orderを無効化したので、以下の画像の並びになった。

これを、プラグインなしで先ほどの並びにしていく。

大まかな流れは以下の通りだ。

  1. コードを追加する
  2. カテゴリーの説明を変更する
  3. 場合に応じてはカテゴリーの説明を非表示にする

事前に伝えておくが、今回はWordPressの中でも良く使い、そして重要なファイルfunctions.phpを使う。そのため、何かあったときのためにfunctions.phpのバックアップを取っておくことを推薦する。

コードを追加

まずは、以下のコードをfunctions.phpの一番下に追加する。

少々長いので注意。

// カテゴリー並び替え
defined( 'USE_CATEGORY_DESCRIPTION_ORDER' ) or define( 'USE_CATEGORY_DESCRIPTION_ORDER', true );
defined( 'CATEGORY_DESCRIPTION_ORDER_ON_ADMIN' ) or define( 'CATEGORY_DESCRIPTION_ORDER_ON_ADMIN', true );

function optimize_category_description( $description ) {
  if ( ! empty( $description ) && strpos( $description, ';' ) !== true ) {
    list( ,$_parse_description ) = explode( ';', $description, 2 );
    $description = trim( $_parse_description );
  }
  return $description;
}

add_filter( 'get_terms', function( $terms, $taxonomies, $args, $term_query ) {
  $_is_run = is_admin() ? ( CATEGORY_DESCRIPTION_ORDER_ON_ADMIN ? true : false ) : true;
  if ( $_is_run && in_array( 'category', $taxonomies ) ) {
    // Category order by prepended number in description
    $_tempOrder = [];
    foreach ( $terms as $_idx => $term_obj ) {
      if ( ! empty( $term_obj->description ) && strpos( $term_obj->description, ';' ) !== true ) {
        list( $_order_num, $_parse_description ) = explode( ';', $term_obj->description, 2 );
        $_tempOrder[] = intval( trim( $_order_num ) );
        if ( ! is_admin() ) {
          $terms[$_idx]->description = trim( $_parse_description );
        }
      } else {
        $_tempOrder[] = 0;
      }
    }
    $_maxOrder = count( $_tempOrder ) > 0 ? max( $_tempOrder ) : 1;
    if ( USE_CATEGORY_DESCRIPTION_ORDER && $_maxOrder > 0 ) {
      foreach ( $_tempOrder as $_idx => $_order ) {
        if ( $_order == 0 ) {
          $_maxOrder++;
          $_tempOrder[$_idx] = $_maxOrder;
        } else {
          $_tempOrder[$_idx] = $_order;
        }
      }
      array_multisort( $_tempOrder, $terms );
      // Remove categories if it has minus ordered
      if ( ! is_admin() ) {
        foreach ( $_tempOrder as $_idx => $_order ) {
          if ( $_order < 0 ) {
            unset( $terms[$_idx] );
          }
        }
      }
    }
  }
  return $terms;
}, PHP_INT_MAX, 5 );

この時点ではまだカテゴリーを入れ替えることはできない。

カテゴリーの説明の順番

まずは、カテゴリーの設定ページに行く。

カテゴリーは「メニュー」の「投稿」→「カテゴリー」から入れる。

当ブログのカテゴリーは現在、下の並びになっている。

  • WordPress
  • アプリ
  • ゲーム
  • ソフト
  • 本の感想

カテゴリーの名前の欄に「説明」と書かれていて、今は「—」になっている。

これを並べたい順に数字を変えていけばいい。

「クイック編集」からは説明が変更できないので、「編集」を押して「説明」のところに自分の並びたい順番で数字を変えていくといいだろう。

おそらく1桁でも5桁でも並び替えができるはずだ。

しかし、1桁だと後からカテゴリーを追加したときに修正するのが面倒になるので、なるべく2桁や3桁にして数字を10や100開けておくといいだろう。

もし「編集」が表示されていない方は、カテゴリー名にマウスのポインターを乗せることで編集が表示される。

シツログでは、以下のように変更した。

既にカテゴリーが並び変わっているのがわかる。

念のため、ブログのトップページでも確認。

これだとプラグインをオフにしているのかが分かりづらいが、確かに並び変わっていたのを確認できた。

一応、これでカテゴリーの並び替えは終わったのだが、どうしても気に入らない部分がある。

それは、カテゴリーのページを開いたときに先ほど指定した数字が説明が表示されていることだ。

字が汚くて申し訳ない。

こんなの誰も気にしないと思うのだが、自分が気に入らないし、最初に来た読者にも不振に思われてしまうのでcssで修正する。

style.cssに以下のコードを記述。

/* カテゴリーの説明を非表示 */
.category-description {
	display: none;
}

これで説明が非表示になるはずだ。

ということで、プラグインなしのカテゴリー並び替えについて終了する。

今回は、こちらの記事を参考にさせてもらった。