【WordPress】メディアライブラリに独自の分類フィルターを追加する方法

【WordPress】メディアライブラリに独自の分類フィルターを追加する方法 WordPress

WordPressでは、メディアライブラリにアップロードされた画像やPDFなどのファイルを一括管理できますが、標準では「すべてのメディアアイテム」「画像」「未添付」などの基本的なフィルターしか用意されていません。大量のメディアファイルを扱うサイトでは、これだけでは管理しづらい場合があります。

この記事では、メディアライブラリに独自の分類(カスタムタクソノミー)を追加し、管理画面での絞り込みに対応させる方法を紹介します。

スポンサーリンク

カスタムタクソノミーを「attachment」タイプに追加する

まずは、メディア(添付ファイル)に対応したカスタムタクソノミーを登録します。functions.phpに以下のコードを追加してください。

functions.php:メディア用タクソノミーの登録
function add_media_taxonomy() {
  register_taxonomy(
    'media_category',
    'attachment',
    array(
      'label'        => 'メディア分類',
      'public'       => false,
      'hierarchical' => true,
      'show_ui'      => true,
      'show_admin_column' => true,
      'rewrite'      => false,
    )
  );
}
add_action('init', 'add_media_taxonomy');

このコードにより、「メディア分類」というカスタムタクソノミーが作成され、管理画面のメディア詳細編集画面でも設定可能になります。

メディアライブラリにフィルター項目を追加する

次に、メディアライブラリ(リスト表示時)で「メディア分類」での絞り込みができるように、ドロップダウンフィルターを追加します。

functions.php:ドロップダウンフィルターの追加
function add_media_category_filter() {
  global $typenow;

  if ($typenow !== 'attachment') {
    return;
  }

  $taxonomy = 'media_category';
  $selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
  $info_taxonomy = get_taxonomy($taxonomy);

  wp_dropdown_categories(array(
    'show_option_all' => esc_html($info_taxonomy->labels->all_items),
    'taxonomy'        => $taxonomy,
    'name'            => $taxonomy,
    'orderby'         => 'name',
    'selected'        => $selected,
    'hierarchical'    => true,
    'depth'           => 3,
    'show_count'      => false,
    'hide_empty'      => true,
  ));
}
add_action('restrict_manage_posts', 'add_media_category_filter');

この処理により、メディアライブラリ上部に「メディア分類」のドロップダウンが表示され、分類によるフィルタリングが可能になります。

フィルターが有効になるようにクエリを調整する

最後に、ドロップダウンで選択された分類が有効になるように、クエリの調整処理を追加します。

functions.php:クエリへの反映
function convert_media_category_query($query) {
  global $pagenow;

  if (
    !$query->is_main_query() ||
    !is_admin() ||
    $pagenow !== 'upload.php'
  ) {
    return;
  }

  // show_option_allの選択肢は value="0" で送信されるため、
  // isset()だけで判定すると「すべて」を選んでも0件になってしまう
  if (!empty($_GET['media_category'])) {
    $term = sanitize_text_field($_GET['media_category']);
    $query->set('tax_query', array(
      array(
        'taxonomy' => 'media_category',
        'field'    => 'term_id',
        'terms'    => $term,
      )
    ));
  }
}
add_action('pre_get_posts', 'convert_media_category_query');
「すべて」を選択すると逆に0件になってしまう
wp_dropdown_categories()の「すべて」を表す選択肢(show_option_all)は、WordPressコア内部で<option value='0'>というハードコードされた「0」をvalueに持ちます。isset($_GET['media_category'])は文字列"0"に対してもtrueを返すため、単純なisset()判定のままだと、ユーザーが「すべてのメディア分類」を選んでフィルターを解除しようとした瞬間に、存在しないterm_id=0で絞り込もうとしてしまい、メディア一覧が0件になって表示されてしまいます。!empty()での判定に変更することでこの問題を回避できます。

これで、選択された「メディア分類」に基づいて、表示されるメディアが自動的に絞り込まれるようになります。

よくある質問(FAQ)

Qメディアライブラリにカスタムフィルター(年・ファイルタイプ以外)を追加するには?
Amedia_library_show_filterフィルターまたはajax_query_attachments_argsフィルターでAjaxクエリを変更します。管理画面にJavaScriptを追加してUIのフィルターセレクターを拡張します。
Q特定の投稿に添付された画像のみをメディアライブラリに表示するには?
Aajax_query_attachments_argsフィルターでpost_parentパラメーターを設定します。これにより特定の記事IDに添付されたメディアのみが表示されます。
Qユーザー別に自分がアップロードした画像のみ表示するには?
Aajax_query_attachments_argsフィルターでauthorパラメーターにget_current_user_id()を設定します。管理者以外のユーザーにこの制限を適用するためcurrent_user_can()での条件分岐が必要です。

まとめ

メディアライブラリに独自の分類フィルターを追加することで、管理画面でのメディア整理が格段に効率化されます。とくに企業サイトやメディア運営など、画像・PDF・資料などを多く扱う場面では大きな効果を発揮します。

必要に応じて、分類を細分化したり、メディアアップローダーとの連携を強化することも可能です。ぜひカスタマイズに活用してみてください。