プラグインなしでメディアをカテゴリーに分けて管理する方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

はじめに

プラグイン「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']);
  }
});

さいごに

今回紹介した方法を使えば、プラグインを使わずに、メディアをカテゴリーで分類して管理できるようになります。
メディア一覧画面でカテゴリーによる絞り込み検索もできるため、メディア管理の効率化に役立ちます。

タイトルとURLをコピーしました