トップレベルメニューの追加
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を出力する関数を作成することです。この関数では、必要なセキュリティチェックを行い、Settings APIを使用して登録したオプションをレンダリングします。
HTMLを<div>
でラップし、wrap
クラスを付けることをお勧めします。
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
}
2番目のステップは、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 file path
を$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
によって返されるスラッグでフックを追加します。バックエンドで手動でフォームを作成する場合にのみ、これらの手順に従う必要があります。Settings APIが推奨される方法です。
フォームアクション属性
オプションページの$menu_slug
パラメータをmenu_page_url()
の最初のパラメータとして使用します。この関数は自動的にURLをエスケープし、デフォルトでエコーしますので、<form>
タグ内で直接使用できます:
<form action="<?php menu_page_url( 'wporg' ) ?>" method="post">
フォームの処理
ページを追加する際に指定した$function
は、ページを表示する時にのみ呼び出されるため、ヘッダー(例:リダイレクト)をブラウザに返す必要がある場合には不適切です。
`````"load-$hookname"`````は、オプションページが表示される前に毎回実行されます。フォームが送信されていない場合でもです。
戻りパラメータとアクションを考慮すると、上記の例は次のようになります:
``````bash
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. サニタイズ