管理画面のツールバー「管理メニュー」の不要メニューを削除する方法

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

はじめに

管理画面のツールバーにある「管理メニュー」には、Cocoon独自のメニューが数多く並んでいます。
しかし、使わない項目が多いと操作が煩雑になり、目的のメニューを探すのが大変になることがあります。

そこで今回は、管理メニューから不要な項目を削除したり、いつでも初期状態にリセットできる機能を追加します。

この記事では、この方法について説明します。

完成イメージ

ダッシュボード
管理メニュー

実装手順

以下のコードをfunctions.phpに追加します。

// Cocoonの管理メニュー表示を制御
add_filter('cocoon_admin_bar_menus', function ($menus, $wp_admin_bar) {
  $adminbar_remove = get_option('my_cocoon_adminbar_remove', []);

  if (empty($adminbar_remove)) {
    return $menus;
  }

  // 非表示リストに含まれるIDを配列から除去
  return array_filter($menus, function ($item) use ($adminbar_remove) {
    return !in_array($item['id'], $adminbar_remove);
  });
}, 10, 2);


// 管理画面にメニューを追加
add_action('admin_menu', function () {
  add_submenu_page(
    'index.php',
    '管理メニュー表示設定',
    '管理メニュー表示設定',
    'manage_options',
    'cocoon_adminbar_remove',
    'render_cocoon_adminbar_remove'
  );
});


/**
 * 管理画面ページを出力
 *
 * @return void
 */
if (!function_exists('render_cocoon_adminbar_remove')):
function render_cocoon_adminbar_remove() {
  // 全メニュー取得のため一時的にフィルターを解除
  remove_all_filters('cocoon_admin_bar_menus');
  $all_menus = get_admin_bar_menu_array();

  // 現在の非表示設定
  $adminbar_remove = get_option('my_cocoon_adminbar_remove', []);

  ?>
  <div class="wrap">
    <h1>管理メニュー表示設定</h1>
    <p>ツールバー(ヘッダーメニュー)に表示する項目を選択・非表示に設定できます。</p>

    <form method="post" action="" class="cocoon-adminbar-remove__form">
      <?php wp_nonce_field('cocoon_adminbar_remove_action', 'cocoon_adminbar_remove_nonce'); ?>

      <table class="widefat fixed striped cocoon-adminbar-remove__table">
        <thead>
          <tr>
            <th class="check-column"></th>
            <th>項目名</th>
          </tr>
        </thead>
        <tbody>
          <?php foreach ($all_menus as $menu): ?>
            <tr>
              <th scope="row" class="check-column">
                <input type="checkbox" name="cocoon_adminbar_remove_items[]" value="<?= esc_attr($menu['id']); ?>"
                  <?php checked(!in_array($menu['id'], $adminbar_remove)); ?>>
              </th>
              <td><?= wp_strip_all_tags((string) $menu['title']); ?></td>
            </tr>
          <?php endforeach; ?>
        </tbody>
      </table>

      <p class="submit">
        <?php submit_button('設定を保存', 'primary', 'cocoon_adminbar_remove_save', false); ?>
        <input type="submit" name="cocoon_adminbar_remove_reset" class="button button-link-delete" value="リセット" onclick="return confirm('設定をリセットしてもよろしいですか?');" />
      </p>
    </form>
  </div>
  <?php
}
endif;


// 管理画面用JS・CSSを追加
add_action('admin_enqueue_scripts', function () {
  if (($_GET['page'] ?? '') !== 'cocoon_adminbar_remove') {
    return;
  }

  ob_start();
  ?>
  .cocoon-adminbar-remove__form {
    margin-top: 20px;
    max-width: 600px;
  }

  .cocoon-adminbar-remove__table {
    background-color: #fff;
    border: 1px solid #ccd0d4;
    border-radius: 4px;
    margin-bottom: 1em;
  }

  .submit .button-link-delete {
    margin-left: 10px;
  }
  <?php
  wp_add_inline_style('wp-admin', ob_get_clean());
});


// 管理画面からの設定データ更新
add_action('admin_init', function () {
  if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    return;
  }

  // nonceチェック
  if (!isset($_POST['cocoon_adminbar_remove_nonce']) || !wp_verify_nonce($_POST['cocoon_adminbar_remove_nonce'], 'cocoon_adminbar_remove_action')) {
    return;
  }

  // 権限チェック
  if (!current_user_can('manage_options')) {
    return;
  }

  // 設定を初期化
  if (isset($_POST['cocoon_adminbar_remove_reset'])) {
    delete_option('my_cocoon_adminbar_remove');

    set_transient('my_admin_notice', [
      'type'    => 'success',
      'message' => '設定をリセットしました。',
    ], 30);

    wp_safe_redirect(admin_url('index.php?page=cocoon_adminbar_remove'));
    exit;
  }

  // 設定を保存
  if (isset($_POST['cocoon_adminbar_remove_save'])) {
    $items = isset($_POST['cocoon_adminbar_remove_items']) ? array_map('sanitize_text_field', $_POST['cocoon_adminbar_remove_items']) : [];

    // ツールバーの全IDを取得
    remove_all_filters('cocoon_admin_bar_menus');
    $all_menus = get_admin_bar_menu_array();
    $all_ids = array_column($all_menus, 'id');

    // 全IDから表示対象のIDを除去して非表示IDを取得
    $adminbar_remove = array_values(array_diff($all_ids, $items));

    update_option('my_cocoon_adminbar_remove', $adminbar_remove);

    set_transient('my_admin_notice', [
      'type'    => 'success',
      'message' => '設定を保存しました。',
    ], 30);

    wp_safe_redirect(admin_url('index.php?page=cocoon_adminbar_remove'));
    exit;
  }
});


// 通知メッセージを出力
add_action('admin_notices', function () {
  if ($notice = get_transient('my_admin_notice')) {
    echo '<div class="notice notice-' . esc_attr($notice['type']) . ' is-dismissible"><p>' . esc_html($notice['message']) . '</p></div>';
    delete_transient('my_admin_notice');
  }
});
タイトルとURLをコピーしました