はじめに
管理画面のツールバーにある「管理メニュー」には、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');
}
});


