【WordPress】管理画面でカテゴリーの並び順を自由に変更する方法

【WordPress】管理画面でカテゴリーの並び順を自由に変更する方法 WordPress

WordPressの投稿編集画面で表示されるカテゴリー一覧は、初期状態ではID順や名前順で並んでいます。しかし、用途によっては任意の順序に並び替えたい場合もあるでしょう。この記事では、管理画面(投稿画面)でカテゴリーのチェックリストの表示順を自由に変更する方法を紹介します。

スポンサーリンク

wp_terms_checklist_args フィルターを使用する

WordPressでは、投稿画面のカテゴリー一覧は wp_terms_checklist() 関数によって出力されています。この出力をカスタマイズするには、wp_terms_checklist_args フィルターフックを使います。

任意の順番で表示するカスタマイズ例

以下のコードを functions.php に追加することで、特定のカテゴリーIDの順序でチェックリストが並ぶようになります。

functions.php:カスタムWalkerによる並び替え
class Custom_Order_Category_Checklist_Walker extends Walker_Category_Checklist {
    protected $custom_order;

    public function __construct($custom_order = array()) {
        $this->custom_order = $custom_order;
    }

    public function walk($elements, $max_depth, ...$args) {
        $custom_order = $this->custom_order;

        usort($elements, function ($a, $b) use ($custom_order) {
            $pos_a = array_search($a->term_id, $custom_order);
            $pos_b = array_search($b->term_id, $custom_order);
            // 指定リストにないカテゴリーは末尾に回す
            $pos_a = ($pos_a === false) ? PHP_INT_MAX : $pos_a;
            $pos_b = ($pos_b === false) ? PHP_INT_MAX : $pos_b;
            return $pos_a <=> $pos_b;
        });

        return parent::walk($elements, $max_depth, ...$args);
    }
}

function custom_category_order_in_admin($args, $post_id) {
    // カスタム順序にしたいカテゴリーIDの配列(任意の順番で指定)
    $custom_order = array(5, 12, 8, 3, 1);

    // タクソノミーがカテゴリーであることを確認
    if ($args['taxonomy'] === 'category') {
        $args['walker'] = new Custom_Order_Category_Checklist_Walker($custom_order);
    }

    return $args;
}
add_filter('wp_terms_checklist_args', 'custom_category_order_in_admin', 10, 2);
include・orderbyをフィルターで指定しても効果がない
$args['include']や$args['orderby']をwp_terms_checklist_argsフィルターで設定する方法がよく紹介されていますが、これは完全に無効です。WordPressコアのwp_terms_checklist()は、このフィルター適用後に$argsを内部で完全に作り直しており、実際にカテゴリーを取得するget_terms()呼び出しも固定の引数で行われるため、フィルターで設定したinclude・orderbyは一切参照されません。エラーも出ないまま何も反映されず、表示順はデフォルトのままになります。

正しくは、$args['walker']に独自のWalkerインスタンスを設定する方法を使います。これはコアが実際に尊重する数少ない拡張ポイントで、上記コードのようにWalker_Category_Checklistを継承した独自クラスでwalk()をオーバーライドし、カテゴリーの配列を希望の順序に並び替えてから親クラスの処理に渡すことで、確実に表示順を制御できます。

ポイント:
$custom_order に並べたい順序でカテゴリーIDを指定します。リストにないカテゴリーは末尾にそのまま表示されるため、全カテゴリーを列挙する必要はありません。

注意点と補足

この方法は「投稿編集画面」のカテゴリー表示順にのみ影響します。管理画面のカテゴリー一覧(edit-tags.php)の並び順は対象外です。

また、カテゴリーの親子構造がある場合、上記のusort()は同じ階層内(トップレベル同士、または同じ親を持つ子カテゴリー同士)でのみ並び替えを行います。階層をまたいだ複雑な並び替えが必要な場合は、再帰的な処理を追加するなどの工夫が必要になります。

よくある質問(FAQ)

Qカテゴリーの表示順をGUIで変更できるようにするには?
ACategory Order and Taxonomy Terms Order等のプラグインを使うのが最も手軽です。プラグインなしでは各カテゴリーにterm_metaとして順序番号を保存し、get_terms()にorderby=’meta_value_num’を指定して取得します。
Qカテゴリー一覧のデフォルトのアルファベット順を変えるには?
Aget_categories()・get_terms()のorderbyパラメーターをnameからidに変更します。WordPress標準では地の文のカテゴリー一覧全体に使える永続的な並び順のカラムはないため、プラグインかterm_metaを使ったカスタム実装が必要です。
Q並び替えた順序でカテゴリーウィジェットを表示するには?
Awp_list_categories()にorderby・orderパラメーターを渡します。カスタム順序を使う場合はget_terms()でカスタム順に取得してforeachで出力するカスタムウィジェットを実装します。

まとめ

管理画面でのカテゴリーの並び順を変更することで、頻繁に使うカテゴリーを上部に表示したり、投稿者にわかりやすく整理したりすることが可能になります。wp_terms_checklist_argsフィルターで並び順を制御する場合は、include・orderbyの指定は無効なので、必ずカスタムWalkerクラスを使いましょう。
カスタマイズ性の高いWordPressの機能を活用して、投稿作業の効率化を目指しましょう。