カスタム投稿一覧の管理画面って、普通の投稿と違ってカテゴリで絞り込む機能がないので、過去記事を見つけにくいですよね。
今回は、管理画面のカスタム投稿一覧に記事をターム別で絞り込む機能を追加します。

せっかく、前記事(WordPressのカスタム投稿タイプが複数ある場合にタクソノミー列を管理画面に表示する)で、
管理画面のカスタム投稿一覧にタクソノミー(カテゴリ)の列を表示させたのですから、今度はそれで絞り込みができると良いと思いませんか?

2020-08-24-19
この赤枠部分を作っていきましょう!

まずはカスタム投稿タイプがひとつの場合

今回は

投稿タイプ
スラッグ
投稿タイプ
ラベル
タクソノミー
スラッグ
タクソノミー
ラベル
blog ブログ blog_cat ブログカテゴリ

の例で解説していきます。

「functions.php」に記述を追加していきます。
「functions.php」の扱いには、十分注意して下さい。記述を間違えるとサイトが閲覧できなくなったりします。
変更前は必ずバックアップを保持しておくようお勧めします。

まずは、さっそくコードです。
下記を functions.php に追記します。

function add_post_taxonomy_restrict_filter() {
    global $post_type;
    if ( 'blog' == $post_type ) {
        ?>
        <select name="blog_cat">
            <option value="">カテゴリー指定なし</option>
            <?php
            $terms = get_terms('blog_cat');
            foreach ($terms as $term) { ?>
                <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
            <?php } ?>
        </select>
        <?php
    }
}
add_action( 'restrict_manage_posts', 'add_post_taxonomy_restrict_filter' );

3行目【'blog' == $post_type】
→カスタム投稿タイプを指定します。この場合は「blog」

5行目【select name="blog_cat"】
→タクソノミーを指定します。この場合は「blog_cat」

6行目【カテゴリー指定なし】
→プルダウンのデフォルト値です。

8行目【$terms = get_terms('blog_cat');】
→タクソノミー「blog_cat」のタームを呼び出します。

9行目 呼び出したタームを「foreach」で回します。

16行目 フックする場所は restrict_manage_posts でOKです。

これで、カスタム投稿タイプ「ブログ」の管理画面に絞り込み機能が表示されます。

複数のカスタム投稿タイプに設定する場合

カスタム投稿タイプがひとつの場合と、複数のカスタム投稿タイプを設定していて、それぞれに反映させる場合では、書き方が変わってきます。
基本的には、ひとつの場合と同じですが、要所を「if分岐」して記述します。

投稿タイプ
スラッグ
投稿タイプ
ラベル
タクソノミー
スラッグ
タクソノミー
ラベル
blog ブログ blog_cat ブログカテゴリ
diary 日記 diary_day 曜日

上述の例に「2」の日記を追加した複数のカスタム投稿タイプがあると仮定して説明します。
上述の記載は削除して下記のように書き換えます。

function add_post_taxonomy_restrict_filter() {
    global $post_type;
    if ( 'blog' == $post_type ) {
        ?>
        <select name="blog_cat">
            <option value="">カテゴリー指定なし</option>
            <?php
            $terms = get_terms('blog_cat');
            foreach ($terms as $term) { ?>
                <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
            <?php } ?>
        </select>
        <?php
    }
    else if ( 'diary' == $post_type ) {
        ?>
        <select name="diary_day">
            <option value="">カテゴリー指定なし</option>
            <?php
            $terms = get_terms('diary_day');
            foreach ($terms as $term) { ?>
                <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
            <?php } ?>
        </select>
        <?php
    }
}
add_action( 'restrict_manage_posts', 'add_post_taxonomy_restrict_filter' );

15行目から26行目までが新しく追加したコードです。
異なるカスタム投稿タイプの場合は、if 分岐してあげて投稿タイプのスラッグとタクソノミーのスラッグを当ててあげれば大丈夫です。
そして最後にまとめてフックします。

まとめ

いかがでしたか。意外と簡単でしたね。
カスタム投稿タイプのタクソノミータームが増えてきた場合は、これをしておくと後で重宝します!

*「function.php」は、必ずバックアップを取ってから作業して下さいね。