トップレベルメニュー

トップレベルメニューの追加

WordPress の管理画面に新しいトップレベルメニューを追加するには、add_menu_page() 関数を使用します。

add_menu_page(
  string $page_title,
  string $menu_title,
  string $capability,
  string $menu_slug,
  callable $function = '',
  string $icon_url = '',
  int $position = null
);

たとえば、「WPOrg」という新しいトップレベルメニューを追加したいとします。

第一のステップ では、HTML を出力する関数を作成します。この関数では、必要なセキュリティチェックを行い、設定 API を使って登録したオプションを書き出します。

HTML をラップするには、クラスが wrap の <div> を使用することをおすすめします。
function wporg_options_page_html() {
?>
  <div class="wrap">
    <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
    <form action="options.php" method="post">
      <?php
      // output security fields for the registered setting "wporg_options"
      settings_fields( 'wporg_options' );
      // output setting sections and their fields
      // (sections are registered for "wporg", each field is registered to a specific section)
      do_settings_sections( 'wporg' );
      // output save settings button
      submit_button( __( 'Save Settings', 'textdomain' ) );
      ?>
    </form>
  </div>
<?php
}

第二のステップ では、WPOrg メニューを登録します。この登録は admin_menu アクションフックで行う必要があります。

add_action( 'admin_menu', 'wporg_options_page' );
function wporg_options_page() {
  add_menu_page(
    'WPOrg',
    'WPOrg Options',
    'manage_options',
    'wporg',
    'wporg_options_page_html',
    plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
    20
  );
}

パラメータのリストとそれぞれの役割については、リファレンスの add_menu_page() を参照してください。

HTML 用 PHP ファイルの使用

移植可能なコードを作成するためのベストプラクティスは、PHP ファイルを require/include するコールバックを作成することです。

完璧を期すため、またレガシーコードを理解してもらうため、別の方法を示しましょう: これは、PHP ファイルパス を $menu_slug パラメータとして渡し、null $function パラメータを渡すものです。

add_action( 'admin_menu', 'wporg_options_page' );
function wporg_options_page() {
  add_menu_page(
    'WPOrg',
    'WPOrg Options',
    'manage_options',
    plugin_dir_path(__FILE__) . 'admin/view.php',
    null,
    plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
    20
  );
}

トップレベルメニューの削除

WordPress の管理画面から登録したメニューを削除するには、remove_menu_page() 関数を使用します。

remove_menu_page(
  string $menu_slug
);
メニューを削除しても、ユーザーが直接メニューにアクセスすることは防げません。 ユーザーの権限を制限する方法として、これは決して使用されるべきではありません。

たとえば、「ツール」メニューを削除したいとします。

add_action( 'admin_menu', 'wporg_remove_options_page', 99 );
function wporg_remove_options_page() {
  remove_menu_page( 'tools.php' );
}

メニューが admin_menu フックに登録されていることを確認してから削除を試み、add_action() に高い優先順位を指定してください。

フォームの送信

オプションページでフォームの送信を処理するには、2つのものが必要です:

  1. フォームの action 属性としてページの URL を使用する。
  2. add_menu_page が返すスラッグをフックに追加する。
バックエンドでフォームを手動で作成する場合のみ、これらの手順を踏む必要があります。設定 API を使用することをおすすめします。

フォームのアクション属性

オプションページの $menu_slug パラメータを menu_page_url() の最初のパラメータとして使用します。この関数はデフォルトで自動的に URL をエスケープして出力するので、<form> タグ内で直接使用できます:

<form action="<?php menu_page_url( 'wporg' ) ?>" method="post">

フォームの処理

ページを追加するときに指定した $function は、ページを表示するときに初めて呼び出されるため、ブラウザーにヘッダー (リダイレクトなど) を送り返す必要がある場合には不適切です。

add_menu_page は $hookname を返し、WordPress は HTML が出力される前に "load-$hookname" アクションをトリガーします。これを利用して、フォームを処理する関数を割り当てることができます。

"load-$hookname" は、フォームが送信されていないときでも、オプションページが表示される前に毎回実行されます。

リターン・パラメータとアクションを念頭に置くと、上記の例は次のようになります:

add_action( 'admin_menu', 'wporg_options_page' );
function wporg_options_page() {
  $hookname = add_menu_page(
    'WPOrg',
    'WPOrg Options',
    'manage_options',
    'wporg',
    'wporg_options_page_html',
    plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
    20
  );

  add_action( 'load-' . $hookname, 'wporg_options_page_submit' );
}

wporg_options_page_submit は、必要に応じてプログラムできますが、以下のような必要なチェックをすべて手動で行わなければならないことを覚えておいてください:

  1. フォームが送信されているかどうか ('POST' === $_SERVER['REQUEST_METHOD'])
  2. CSRF 検証
  3. バリデーション
  4. サニタイゼーション

原文 / 日本語訳

s
検索
c
新規投稿を作成する
r
返信
e
編集
t
ページのトップへ
j
次の投稿やコメントに移動
k
前の投稿やコメントに移動
o
コメントの表示を切替
esc
投稿やコメントの編集をキャンセル