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