WordPressの管理画面にカテゴリー列と絞り込み機能を追加する方法

公開日
最終更新日

WordPressで投稿やカスタム投稿を書き続けていると、記事が増えて、特定のカテゴリーの投稿を管理画面で探すのが大変になってきます。デフォルトの投稿一覧では、カテゴリーで絞り込むことができないためです。

結論から言うと、functions.phpにコードを追加するだけで、管理画面の投稿一覧に「カテゴリー」列を追加し、カテゴリー別に絞り込めるドロップダウンを設置できます。この記事では、その実装方法を解説します。

デフォルトの仕様

デフォルトの投稿一覧画面では、上図のように「投稿タイトル」と「日付」のみが表示されています。まずは、ここに「カテゴリー」列を追加していきます。

「カテゴリー」列を追加する

functions.phpに、次のコードを追加します。{タクソノミースラッグ}{カスタム投稿タイプスラッグ}は、実際の値に置き換えます。

function my_custom_column($columns)
{
    $columns['{タクソノミースラッグ}'] = 'カテゴリ';
    return $columns;
}
add_filter('manage_{カスタム投稿タイプスラッグ}_posts_columns', 'my_custom_column');

function my_custom_column_id($column_name, $id)
{
    $terms = get_the_terms($id, $column_name);
    if ($terms && !is_wp_error($terms)) {
        $menu_terms = array(); // 変数名は任意
        foreach ($terms as $term) {
            $menu_terms[] = $term->name;
        }
        echo join(", ", $menu_terms);
    }
}
add_action('manage_{カスタム投稿タイプスラッグ}_posts_custom_column', 'my_custom_column_id', 10, 2);

タクソノミースラッグがworks_category、カスタム投稿タイプスラッグがworksの場合は、次のようになります。

function my_custom_column($columns)
{
    $columns['works_category'] = 'カテゴリ';
    return $columns;
}
add_filter('manage_works_posts_columns', 'my_custom_column');

function my_custom_column_id($column_name, $id)
{
    $terms = get_the_terms($id, $column_name);
    if ($terms && !is_wp_error($terms)) {
        $category_terms = array(); // 変数名は任意
        foreach ($terms as $term) {
            $category_terms[] = $term->name;
        }
        echo join(", ", $category_terms);
    }
}
add_action('manage_works_posts_custom_column', 'my_custom_column_id', 10, 2);

すると、上図のように「カテゴリー」の項目が増えました。manage_{投稿タイプ}_posts_columnsで列そのものを追加し、manage_{投稿タイプ}_posts_custom_columnで各行に表示する内容(ターム名)を出力しています。

絞り込みドロップダウンを追加する

次に、カテゴリーで絞り込めるように、一覧上部にドロップダウンを追加します。functions.phpに、次のコードを追加します。

function my_add_filter()
{
    global $post_type;
    if ('{カスタム投稿タイプスラッグ}' == $post_type) {
?>
        <select name="{タクソノミースラッグ}">
            <option value="">すべてのカテゴリー</option>
            <?php
            $terms = get_terms('{タクソノミースラッグ}');
            foreach ($terms as $term) {
            ?>
                <option value="<?php echo $term->slug; ?>" <?php if (isset($_GET['{タクソノミースラッグ}']) && $_GET['{タクソノミースラッグ}'] == $term->slug) {
                                                                echo 'selected';
                                                            } ?>><?php echo $term->name; ?></option>
            <?php
            }
            ?>
        </select>
    <?php
    }
}
add_action('restrict_manage_posts', 'my_add_filter');

こちらも、タクソノミースラッグがworks_category、カスタム投稿タイプスラッグがworksの場合は、次のようになります。

function my_add_filter()
{
    global $post_type;
    if ('works' == $post_type) {
?>
        <select name="works_category">
            <option value="">すべてのカテゴリー</option>
            <?php
            $terms = get_terms('works_category');
            foreach ($terms as $term) {
            ?>
                <option value="<?php echo $term->slug; ?>" <?php if (isset($_GET['works_category']) && $_GET['works_category'] == $term->slug) {
                                                                echo 'selected';
                                                            } ?>><?php echo $term->name; ?></option>
            <?php
            }
            ?>
        </select>
<?php
    }
}
add_action('restrict_manage_posts', 'my_add_filter');

すると、上図のようにカテゴリーで絞り込みができるようになりました。restrict_manage_postsフックで、一覧上部に絞り込み用のセレクトボックスを追加しています。選んだタームのスラッグがクエリに渡され、その分類の投稿だけが表示されます。

絞り込みが機能するのは、セレクトボックスのnameをタクソノミーのスラッグに合わせているためです。登録済みのタクソノミーであれば、WordPressがそのクエリを解釈し、自動的に絞り込んでくれます。なお、標準の投稿(post)で使いたい場合は、投稿タイプの判定を'post'に、列追加のフック名をmanage_posts_columns系に置き換えれば応用できます。

まとめ

  • manage_{投稿タイプ}_posts_columns系のフックで、一覧に「カテゴリー」列を追加できる
  • restrict_manage_postsフックで、絞り込み用のドロップダウンを追加できる
  • スラッグ(投稿タイプ・タクソノミー)を自分の環境に合わせて置き換える

functions.phpにコードを追加するだけで、管理画面にカテゴリー列と絞り込み機能を追加できました。記事数が多いサイトほど、投稿を効率的に管理でき、目的の記事をすばやく見つけられるようになります。

IPPEI FUKUTA(株式会社バッズブルー 代表)

IPPEI FUKUTA(株式会社バッズブルー 代表)

WordPress専門のWeb制作者として15年・150サイト以上を担当。現場でつまずいた問題と解決策を、同じ制作者・フリーランスの方に向けて発信しています。無料のWeb便利ツール集「バドツール」を開発・運営中。