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

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

  1. add_menu_page(
  2. string $page_title,
  3. string $menu_title,
  4. string $capability,
  5. string $menu_slug,
  6. callable $function = '',
  7. string $icon_url = '',
  8. int $position = null
  9. );

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

最初のステップは、HTMLを出力する関数を作成することです。この関数では、必要なセキュリティチェックを行い、Settings APIを使用して登録したオプションをレンダリングします。

HTMLを<div>でラップし、wrapクラスを付けることをお勧めします。

  1. function wporg_options_page_html() {
  2. ?>
  3. <div class="wrap">
  4. <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
  5. <form action="options.php" method="post">
  6. <?php
  7. // output security fields for the registered setting "wporg_options"
  8. settings_fields( 'wporg_options' );
  9. // output setting sections and their fields
  10. // (sections are registered for "wporg", each field is registered to a specific section)
  11. do_settings_sections( 'wporg' );
  12. // output save settings button
  13. submit_button( __( 'Save Settings', 'textdomain' ) );
  14. ?>
  15. </form>
  16. </div>
  17. <?php
  18. }

2番目のステップは、WPOrgメニューを登録することです。登録はadmin_menuアクションフックの間に行う必要があります。

  1. add_action( 'admin_menu', 'wporg_options_page' );
  2. function wporg_options_page() {
  3. add_menu_page(
  4. 'WPOrg',
  5. 'WPOrg Options',
  6. 'manage_options',
  7. 'wporg',
  8. 'wporg_options_page_html',
  9. plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
  10. 20
  11. );
  12. }

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

HTML用のPHPファイルの使用

ポータブルコードのベストプラクティスは、PHPファイルをrequire/includeするコールバックを作成することです。

完全性のため、レガシーコードを理解する手助けとして、別の方法を示します:PHP file path$menu_slugパラメータとして渡し、null $functionパラメータを使用します。

  1. add_action( 'admin_menu', 'wporg_options_page' );
  2. function wporg_options_page() {
  3. add_menu_page(
  4. 'WPOrg',
  5. 'WPOrg Options',
  6. 'manage_options',
  7. plugin_dir_path(__FILE__) . 'admin/view.php',
  8. null,
  9. plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
  10. 20
  11. );
  12. }

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

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

  1. remove_menu_page(
  2. string $menu_slug
  3. );

メニューを削除しても、ユーザーが直接アクセスするのを防ぐことはできません。

これはユーザーの権限を制限する方法として使用すべきではありません。

「ツール」メニューを削除したいとしましょう。

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

削除を試みる前に、メニューがadmin_menuフックで登録されていることを確認し、add_action()のためにより高い優先度番号を指定してください。

フォームの送信

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

  • 1. フォームのaction属性としてページのURLを使用します。
  • 2. add_menu_pageによって返されるスラッグでフックを追加します。

    バックエンドで手動でフォームを作成する場合にのみ、これらの手順に従う必要があります。Settings APIが推奨される方法です。

フォームアクション属性

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

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

フォームの処理

ページを追加する際に指定した$functionは、ページを表示する時にのみ呼び出されるため、ヘッダー(例:リダイレクト)をブラウザに返す必要がある場合には不適切です。

  1. `````"load-$hookname"`````は、オプションページが表示される前に毎回実行されます。フォームが送信されていない場合でもです。
  2. 戻りパラメータとアクションを考慮すると、上記の例は次のようになります:
  3. ``````bash
  4. add_action( 'admin_menu', 'wporg_options_page' );
  5. function wporg_options_page() {
  6. $hookname = add_menu_page(
  7. 'WPOrg',
  8. 'WPOrg Options',
  9. 'manage_options',
  10. 'wporg',
  11. 'wporg_options_page_html',
  12. plugin_dir_url(__FILE__) . 'images/icon_wporg.png',
  13. 20
  14. );
  15. add_action( 'load-' . $hookname, 'wporg_options_page_submit' );
  16. }
  17. `

ニーズに応じてwporg_options_page_submitをプログラムできますが、次のすべての必要なチェックを手動で実行する必要があることを忘れないでください:

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