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

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

参考:メインナビゲーションから削除する方法

管理画面のメインナビゲーション(左メニュー)にあるCocoon設定の子メニューから、不要な項目を削除します。
この変更は、前述のダッシュボードウィジェットおよび管理メニューにも自動的に反映(削除)されます。

完成イメージ

実装手順

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

// Cocoonの管理メニュー表示を制御
add_filter('cocoon_menu_definitions', function ($definitions) {
  $sidebar_remove = get_option('my_cocoon_sidebar_remove', []);

  if (empty($sidebar_remove)) {
    return $definitions;
  }

  // 非表示に設定されたメニューを除外
  return array_diff_key($definitions, array_flip($sidebar_remove));
}, 999);


// Cocoon設定にメニューを追加
add_action('admin_menu', function () {
  $parent_slug = defined('THEME_SETTINGS_PAGE') ? THEME_SETTINGS_PAGE : 'theme-settings';

  add_submenu_page(
    $parent_slug,
    'Cocoonメニュー表示設定',
    'メニュー表示設定',
    'manage_options',
    'cocoon_sidebar_remove',
    'render_cocoon_sidebar_remove'
  );
}, 999);


/**
 * 管理画面ページを出力
 *
 * @return void
 */
if (!function_exists('render_cocoon_sidebar_remove')):
function render_cocoon_sidebar_remove() {
  // 元のメニュー一覧を取得するためフィルターを一時的に解除
  $current_filters = $GLOBALS['wp_filter']['cocoon_menu_definitions'] ?? null;
  unset($GLOBALS['wp_filter']['cocoon_menu_definitions']);

  $all_menus = get_cocoon_original_menu_definitions();

  // フィルターを復元
  if ($current_filters) {
    $GLOBALS['wp_filter']['cocoon_menu_definitions'] = $current_filters;
  }

  // 除外する親メニューのスラッグを指定
  $parent_slug = defined('THEME_SETTINGS_PAGE') ? THEME_SETTINGS_PAGE : 'theme-settings';
  $exclude_slugs = [$parent_slug];

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

  ?>
  <div class="wrap">
    <h1>Cocoon メニュー表示設定</h1>
    <p>「Cocoon 設定」の左メニューに表示する項目を選択できます。</p>

    <form method="post" action="" class="cocoon-sidebar-remove__form">
      <?php wp_nonce_field('cocoon_sidebar_remove_action', 'cocoon_sidebar_remove_nonce'); ?>

      <table class="widefat fixed striped cocoon-sidebar-remove__table">
        <thead>
          <tr>
            <th class="check-column"></th>
            <th>項目名</th>
          </tr>
        </thead>

        <tbody>
          <?php foreach ($all_menus as $slug => $menu): ?>
            <?php if (in_array($slug, $exclude_slugs, true)) continue; ?>

            <tr>
              <th scope="row" class="check-column">
                <input type="checkbox" name="cocoon_sidebar_remove_items[]" value="<?= esc_attr($slug); ?>"
                  <?php checked(!in_array($slug, $sidebar_remove, true)); ?>>
              </th>

              <td><?= wp_strip_all_tags((string) $menu['title']); ?></td>
            </tr>
          <?php endforeach; ?>
        </tbody>
      </table>

      <p class="submit">
        <?php submit_button('設定を保存', 'primary', 'cocoon_sidebar_remove_save', false); ?>
        <input type="submit" name="cocoon_sidebar_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_sidebar_remove') {
    return;
  }

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

  .cocoon-sidebar-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_sidebar_remove_nonce']) || !wp_verify_nonce($_POST['cocoon_sidebar_remove_nonce'], 'cocoon_sidebar_remove_action')
  ) {
    return;
  }

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

  $parent_slug = defined('THEME_SETTINGS_PAGE') ? THEME_SETTINGS_PAGE : 'theme-settings';
  $exclude_slugs = [$parent_slug];

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

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

    wp_safe_redirect(admin_url('admin.php?page=cocoon_sidebar_remove'));
    exit;
  }

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

    // 元のメニュー一覧を取得するためフィルターを一時的に解除
    $current_filters = $GLOBALS['wp_filter']['cocoon_menu_definitions'] ?? null;
    unset($GLOBALS['wp_filter']['cocoon_menu_definitions']);

    $all_menus = get_cocoon_original_menu_definitions();

    // フィルターを復元
    if ($current_filters) {
      $GLOBALS['wp_filter']['cocoon_menu_definitions'] = $current_filters;
    }

    $all_slugs = array_keys($all_menus);

    // チェックされていないメニューを非表示リストに設定
    $sidebar_remove = array_diff($all_slugs, $items);

    // 除外対象の親メニューを非表示リストから除外
    $sidebar_remove = array_values(
      array_filter(
        $sidebar_remove,
        function ($slug) use ($exclude_slugs) {
          return !in_array($slug, $exclude_slugs, true);
        }
      )
    );

    update_option('my_cocoon_sidebar_remove', $sidebar_remove);

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

    wp_safe_redirect(admin_url('admin.php?page=cocoon_sidebar_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をコピーしました