はじめに
プラグイン「WP Media Category Management」などを使わずに、メディア内の画像や動画をカテゴリー分けし管理できるようにします。
さらに、メディアリスト一覧に「カテゴリー」での絞り込み検索機能を追加します。
この記事では、この方法について説明します。
完成イメージ



実装手順
以下のコードをfunctions.phpに追加します。
// メディアにカスタムタクソノミーを追加
add_action('init', function () {
register_taxonomy('my_media_category', 'attachment', [
'hierarchical' => true,
'labels' => [
'name' => 'メディアカテゴリー',
'singular_name' => 'メディアカテゴリー',
'search_items' => 'メディアカテゴリーを検索',
'all_items' => '全てのメディアカテゴリー',
'parent_item' => '親メディアカテゴリー',
'parent_item_colon' => '親メディアカテゴリー:',
'edit_item' => 'メディアカテゴリーを編集',
'update_item' => 'メディアカテゴリーを更新',
'add_new_item' => '新規メディアカテゴリーを追加',
'new_item_name' => '新規メディアカテゴリー名',
'menu_name' => 'メディアカテゴリー',
],
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => ['slug' => 'media-category'],
]);
// メディアにタクソノミーを登録
register_taxonomy_for_object_type('my_media_category', 'attachment');
});
// 一覧にフィルターボタンを追加
add_action('restrict_manage_posts', function () {
global $pagenow;
// メディア一覧以外は処理対象外
if ($pagenow === 'upload.php') {
$selected = isset($_GET['my_media_category']) ? sanitize_text_field($_GET['my_media_category']) : '';
// ドロップダウンの設定
$dropdown_options = [
'show_option_all' => '全てのメディアカテゴリー',
'hide_empty' => 0,
'hierarchical' => 1,
'orderby' => 'name',
'show_count' => 0,
'name' => 'my_media_category',
'taxonomy' => 'my_media_category',
'value_field' => 'slug',
'selected' => $selected,
];
echo '<label class="screen-reader-text" for="media-category-filter">メディアカテゴリー</label>';
wp_dropdown_categories($dropdown_options);
}
});
// クエリにフィルターを適用
add_filter('parse_query', function ($query) {
global $pagenow;
// メディア一覧以外は処理対象外
if ($pagenow !== 'upload.php') {
return;
}
$tax_input = isset($query->query_vars['my_media_category']) ? $query->query_vars['my_media_category'] : '';
// 未選択は処理対象外
if ($tax_input === '' || $tax_input === '0' || $tax_input === 0) {
return;
}
// タームスラッグを設定
$slug = sanitize_text_field($tax_input);
// タームを取得
$term = get_term_by('slug', $slug, 'my_media_category');
// タームなしは処理対象外
if ($term) {
// タクソノミーの絞り込み条件を設定
$query->query_vars['tax_query'] = [[
'taxonomy' => 'my_media_category',
'field' => 'slug',
'terms' => $slug,
'include_children' => false,
]];
// 元のクエリ変数を削除
unset($query->query_vars['my_media_category']);
}
});
さいごに
今回紹介した方法を使えば、プラグインを使わずに、メディアをカテゴリーで分類して管理できるようになります。
メディア一覧画面でカテゴリーによる絞り込み検索もできるため、メディア管理の効率化に役立ちます。

