関数

remove_menu_page() の使い方について解説:WordPress 管理画面の最上位メニュー削除方法

remove_menu_page() を利用すると、WordPress 管理画面の最上位メニューを非表示にできます。

admin_menu フック内で設定し、対象となるメニューのスラッグを指定するだけで削除が可能です。

実装例や、ユーザー権限やプラグインとの併用時の注意点も紹介しています。

remove_menu_page() の基本仕様

関数の目的と基本動作

remove_menu_page()関数は、WordPress の管理画面で不要な最上位メニューを非表示にするために使用します。

この関数を利用することで、特定のメニュー項目を管理画面から取り除き、ユーザーが必要なメニューだけを表示させることが可能となります。

基本的な動作としては、グローバル変数 $menu に対してターゲットとなるメニュー項目を unset することで削除を実現します。

管理画面のカスタマイズやユーザー権限の調整において、シンプルなインターフェースを提供する便利なツールです。

引数と返り値の仕様

remove_menu_page() は、唯一の引数として削除対象のメニューを識別する識別子、すなわち $menu_slug を受け取ります。

通常、この識別子は WordPress の組み込みメニューの場合、PHP ファイル名(例:edit.phptools.php)となります。

返り値については、削除に成功すると削除されたメニュー項目の情報が配列で返され、対象のメニューが存在しなかった場合は false が返される仕様となっています。

この返り値を利用して、削除が正しく行われたかどうかを確認することが可能です。

管理画面のメニュー構造

グローバル変数 $menu の役割

WordPress の管理画面では、すべての最上位メニュー項目がグローバル変数 $menu に格納されています。

この変数は連想配列で管理され、各要素にメニュータイトルやスラッグ、アイコンなどが含まれています。

remove_menu_page()関数は、この $menu 配列から目的のメニュー情報を削除することによって動作します。

現在のメニュー構造を把握するために、開発時には print_r($GLOBALS['menu']) などでデバッグ出力を行うと便利です。

admin_menu フックの動作タイミング

admin_menu フックは、WordPress の管理画面のメニューが初期化された後に実行されるタイミングで提供されます。

このタイミングでフックを利用することで、既に $menu 配列に格納されたメニュー情報に対して変更や削除を行うことが可能です。

このタイミングの特性を活かし、プラグインやテーマでのカスタマイズを行う場合は、必ず admin_menu フック内で remove_menu_page() を利用する必要があります。

フック選定時のポイント

フックを選定する際には下記のポイントに留意してください:

  • タイミングの確認

管理画面のメニューがすでに生成されているか、グローバル変数 $menu が正しくセットされているタイミングで実行する必要があります。

  • 優先度の調整

複数のプラグインやテーマがメニューを操作している場合、優先度を変更することで、確実に必要なタイミングで削除処理を実行できるようになります。

たとえば、プラグインの後で動作させるために、優先度に高い値(例:999)を指定することが検討されます。

実装例

単一メニュー削除の実例

ツールメニューなどの具体例

以下は、ツールメニューを管理画面から削除する具体例です。

このサンプルコードは、管理画面の admin_menu フック内で実行され、tools.php というスラッグのメニューを削除します。

<?php
// ツールメニューを削除するサンプルコード
add_action('admin_menu', function() {
    // ツールメニューのスラッグは 'tools.php'
    remove_menu_page('tools.php');
});
?>
// 管理画面上にツールメニューが表示されなくなります。

複数メニュー削除の実例

投稿・メディア・コメントの削除例

以下の例では、投稿、メディア、およびコメントの各メニューを管理画面からまとめて削除する方法を示しています。

各メニューは、それぞれ edit.phpupload.phpedit-comments.php というスラッグで登録されています。

<?php
// 複数のメニューを削除するサンプルコード
add_action('admin_menu', function() {
    // 投稿メニューの削除
    remove_menu_page('edit.php');
    // メディアメニューの削除
    remove_menu_page('upload.php');
    // コメントメニューの削除
    remove_menu_page('edit-comments.php');
});
?>
// 管理画面上に投稿、メディア、コメントのメニューが削除され、表示されなくなります。

ユーザー権限に基づく制御

権限別削除処理の具体例

ユーザー権限に応じた管理画面の表示を調整するために、特定のユーザーに対して不要なメニューを非表示にする実装例です。

例えば、購読者subscriber権限のユーザーには投稿メニューが不要な場合、以下のように実装できます。

<?php
// ユーザー権限に基づいてメニュー削除を行うサンプルコード
add_action('admin_menu', function() {
    // 現在のユーザーが購読者の場合
    if ( current_user_can('subscriber') ) {
        // 投稿メニュー(edit.php)を削除
        remove_menu_page('edit.php');
    }
});
?>
// 購読者権限のユーザーが管理画面を表示した際、投稿メニューが表示されなくなります。

プラグイン環境での注意点

プラグイン独自のメニュー登録とスラッグ確認

WordPress サイトでは、プラグインが独自のメニューを追加することがよくあります。

それぞれのプラグインは、独自のメニュースラッグを定義しているため、削除対象のスラッグを正確に把握することが重要です。

プラグインのメニューを削除する場合は、対象となるプラグインのドキュメントや、実際に print_r($GLOBALS['menu']) などで出力されるメニュー配列を確認することで、正しいスラッグを特定することをお勧めします。

フックの実行タイミングと影響の調整

複数のプラグインやテーマが同じ管理画面のメニューに影響を与える場合、それぞれが実行されるタイミングの違いが問題となることがあります。

そのため、プラグインでのメニュー登録が終了した後に削除処理が実行されるよう、admin_menu フックの優先度を適切に調整することが必要です。

たとえば、削除処理を遅めに実行するために、以下のように優先度を高く設定する方法があります。

<?php
// 優先度を 999 に設定してプラグインのメニュー登録後に削除処理を行うサンプルコード
add_action('admin_menu', function() {
    remove_menu_page('sample_plugin_slug'); // プラグイン固有のメニュースラッグを指定
}, 999);
?>
// プラグインで登録されたメニューが削除され、管理画面上から表示されなくなります。

エラー対処とデバッグ手法

発生しやすいエラー事例

remove_menu_page() を利用する際に発生しやすいエラーとしては、以下のようなケースがあります:

  • 誤ったフックタイミングで実行した場合、$menu が未定義となりエラーが発生する
  • 存在しない $menu_slug を指定すると、削除対象が見つからず false が返る
  • 優先度設定が不適切で、プラグインのメニュー登録前に削除処理が実行され、意図した動作とならない

上記のエラー発生時は、デバッグ手法としてメニュー配列の出力を行い、対象のメニューが正しく存在しているか、また実行タイミングが合っているかを確認することが有効です。

管理画面メニュー配列の確認方法

実装タイミングの検証方法

デバッグ時には、管理画面のメニュー構造を確認するために、以下のサンプルコードを利用することで、$GLOBALS['menu'] の内容を出力できます。

これにより、各メニューアイテムの情報(スラッグや位置など)が把握でき、削除対象の判断材料として役立ちます。

<?php
// 管理画面のメニュー配列を確認するサンプルコード
add_action('admin_menu', function() {
    echo '<pre>';
    print_r($GLOBALS['menu']); // メニュー配列を出力して内容を確認
    echo '</pre>';
    // 必要に応じて exit; などで処理を停止して確認すると良い
});
?>
// 管理画面にメニュー配列の内容が整形されて表示されます。
// 出力例:
// Array
// (
//     [0] => Array ( [0] => 'Dashboard' [2] => 'index.php' ... )
//     [1] => Array ( [0] => 'Posts' [2] => 'edit.php' ... )
//     ...
// )

関連関数との比較

remove_submenu_page() との相違点

remove_menu_page() は管理画面の最上位メニューを削除するための関数です。

一方、サブメニューの削除には remove_submenu_page() を利用する必要があります。

たとえば、投稿メニュー内の「新規追加」などのサブメニューを非表示にする場合は、remove_submenu_page() を用いて個別に削除処理を記述します。

このように、用途によって最上位メニューとサブメニューで異なる関数を選択することで、より柔軟な管理画面のカスタマイズが可能となります。

まとめ

この記事では、WordPress管理画面の不要なメニューを非表示にするための remove_menu_page() の基本仕様と使い方について学ぶことができます。

関数の動作、引数や返り値の確認、グローバル変数 $menu の役割、admin_menu フックの適切な利用方法、単一および複数のメニュー削除、ユーザー権限に基づく制御、プラグイン環境での注意点、エラー対処とデバッグ手法、ならびに remove_submenu_page() との違いについて具体例とともに解説しています。

関連記事

Back to top button
目次へ