関数リファレンス
メニューページ
サブメニューページ
WordPress管理メニュー
すべてのプロットにはフックが必要
管理メニューを追加するには、次の3つのことを行う必要があります:
- 1. メニュー構築コードを含む関数を作成します。
- 2. 上記の関数を
admin_menu
アクションフックを使用して登録します – または、ネットワーク用のメニューを追加する場合はnetwork_admin_menu
を使用します。 - 3. メニュー項目がクリックされたときに表示される画面のHTML出力を作成します。
ほとんどの開発者はこのリストの2番目のステップを見落とします。単にメニューコードを呼び出すことはできません。関数の中に入れる必要があります、そしてこの関数を登録します。
以下は、これらの3つのステップを説明する簡単な例です。これにより、設定のトップレベルメニューの下にサブレベルメニュー項目が追加されます。選択すると、そのメニュー項目は非常に基本的な画面を表示します。
<?php
/** Step 2 (from text above). */
add_action( 'admin_menu', 'my_menu' );
/** Step 1. */
function my_menu() {
add_options_page(
'My Options',
'My Menu',
'manage_options',
'my-unique-identifier',
'my_options'
);
}
/** Step 3. */
function my_options() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
echo 'Here is where I output the HTML for my screen.';
echo '</div><pre>';
}
この例では、関数 my_menu()
が add_options_page()
関数を介して設定管理メニューに新しい項目を追加します。
注: ステップ2の add_action() 呼び出しは、admin_menu フックの下で my_menu() 関数を 登録します。それがなければ、未定義の関数に対するPHPエラーが発生します。最後に、add_options_page()
呼び出しは、メニュー項目がクリックされたときに表示される実際のページを含む my_options()
関数を参照します。
これらのステップは、以下のセクションでより詳細に説明されています。メニューとページの作成を関数に囲むことを忘れず、admin_menu
フック を使用して、適切なタイミングで全プロセスを開始します。
新しいメニューの位置を決定する
新しいメニューを作成する前に、そのメニューがトップレベルメニューであるべきか、サブレベルメニュー項目であるべきかを最初に決定します。トップレベルメニューは、管理メニューの新しいセクションとして表示され、サブレベルメニュー項目を含みます。これは、サブレベルメニュー項目が既存のトップレベルメニューのメンバーであることを意味します。
テーマが新しいトップレベルメニューの作成を必要とすることは稀です。テーマがWordPressにまったく新しい概念を導入し、それを実現するために多くの画面が必要な場合、そのテーマは新しいトップレベルメニューを必要とするかもしれません。トップレベルメニューの追加は、WordPressが元々設計されていないことを実現するために、関連する複数の画面が本当に必要な場合にのみ考慮すべきです。新しいトップレベルメニューの例には、ジョブ管理や会議管理が含まれるかもしれません。ネイティブの post type 登録により、WordPressはこの種の機能を管理するために自動的にトップレベルメニューを作成しますのでご注意ください。
トップレベルメニューの作成が必要ない場合は、新しいサブレベルメニュー項目をどのトップレベルメニューの下に配置するかを決定する必要があります。参考までに、いくつかのテーマは既存のWordPressトップレベルメニューの下にサブレベルメニュー項目を追加します。
サブレベルメニュー項目の正しい位置を決定するために、WordPressのトップレベルメニューのガイドを使用してください:
- ダッシュボード – サイトの情報センターで、WordPressコア、プラグイン、テーマの更新オプションを含みます。
- 投稿 – 投稿を書くためのツールを表示します(時間指向のコンテンツ)。
- メディア – 画像、動画、音声をアップロードおよび管理します。
- リンク – 他のブログや興味のあるサイトへの参照を管理します。
- ページ – 静的コンテンツであるページを書くためのツールを表示します。
- コメント – 投稿に対する読者の反応を制御および規制します。
- 外観 – テーマ/スタイルファイル、サイドバーなどの操作のためのコントロールを表示します。
- プラグイン – プラグイン管理に関するコントロールを表示し、プラグイン自体の設定オプションではありません。
- ユーザー – ユーザー管理のためのコントロールを表示します。
- ツール – ブログデータのエクスポート、インポート、バックアップを管理します。
- 設定 – 管理者のみが表示すべきプラグインオプションを表示します。
- ネットワーク管理 – ネットワーク上で設定されたプラグインオプションを表示します。
admin_menu
の代わりにnetwork_admin_menu
を使用する必要があります(ネットワークの作成も参照)。
トップレベルメニュー
テーマが新しいトップレベルメニューを必要とすることが決定した場合、最初に行うべきことは add_menu_page()
関数を使用してそれを作成することです。注: トップレベルメニューが必要ない場合は、サブレベルメニューにスキップしてください。
パラメータ値:
page_title
– メニューが選択されたときにページのタイトルタグに表示されるテキスト。menu_title
– メニューの画面上の名前テキスト。capability
– このメニューがユーザーに表示されるために必要な権限。設定APIを使用してフォームを処理する場合は、ここでmanage_options
を使用する必要があります。ユーザーレベルは非推奨であり、ここでは使用すべきではありません。menu_slug
– このメニューを参照するためのスラッグ名(このメニューに対して一意である必要があります)。バージョン3.0以前は、これをファイル(またはハンドル)パラメータと呼んでいました。関数パラメータが省略された場合、menu_slug
はメニューページのコンテンツを表示するPHPファイルである必要があります。function
– メニューページのコンテンツを表示する関数。icon_url
– このメニューに使用されるアイコンのURL。このパラメータはオプションです。position
– メニューの順序でこのメニューが表示される位置。デフォルトでは、このパラメータが省略されると、メニューはメニュー構造の下部に表示されます。現在のメニュー位置を確認するには、メニューが読み込まれた後にprint_r( $GLOBALS[ 'menu' ] )
を使用します。- サブレベルメニュー – トップレベルメニューが定義されたら、または既存のWordPressトップレベルメニューを使用することを選択したら、
add_submenu_page()
関数を使用して1つ以上のサブレベルメニュー項目を定義する準備が整います。
サブレベルメニュー
新しいメニュー項目をサブメニュー項目にしたい場合は、代わりに add_submenu_page()
関数を使用して作成できます。
パラメータ値:
parent_slug
– 親メニューのスラッグ名、またはサブメニューを挿入したいトップレベルメニューを提供する標準のWordPress管理ファイルのファイル名、またはこのサブメニューがカスタムトップレベルメニューに入る場合はプラグインファイル。例:- ダッシュボード –
add_submenu_page('index.php', ...)
- 投稿 –
add_submenu_page('edit.php', ...)
- メディア –
add_submenu_page('upload.php', ...)
- リンク –
add_submenu_page('link-manager.php', ...)
- ページ –
add_submenu_page('edit.php?post_type=page', ...)
- コメント –
add_submenu_page('edit-comments.php', ...)
- カスタム投稿タイプ –
add_submenu_page('edit.php?post_type=your_post_type', ...)
- 外観 –
add_submenu_page('themes.php', ...)
- プラグイン –
add_submenu_page('plugins.php', ...)
- ユーザー –
add_submenu_page('users.php', ...)
- ツール –
add_submenu_page('tools.php', ...)
- 設定 –
add_submenu_page('options-general.php', ...)
- ダッシュボード –
page_title
– サブメニューがアクティブなときにページのHTMLページタイトルに入るテキスト。menu_title
– メニューが選択されたときにページのタイトルタグに表示されるテキスト。capability
– このメニューがユーザーに表示されるために必要な権限。ユーザーレベルは非推奨であり、ここでは使用すべきではありません。menu_slug
– 既存のWordPressメニューの場合、メニューページのコンテンツを表示するPHPファイル。カスタムトップレベルメニューのサブメニューの場合、このサブメニューページの一意の識別子。function
– メニューページのコンテンツを表示する関数。技術的には、add_menu_page
関数のように、関数パラメータはオプションですが、提供されない場合、WordPressは基本的にPHPファイルを含めることで管理画面を生成することを想定します。
ラッパー関数の使用
ほとんどのサブレベルメニューは設定、ツール、または外観メニューの下に属するため、WordPressはこれらのトップレベルメニューにサブレベルメニュー項目を追加するのを容易にするラッパー関数を提供します。関数名は、時間の経過とともに変更されているため、管理UIで見られる名前と一致しない場合があります。
ダッシュボード
<?php
add_dashboard_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
投稿
<?php
add_posts_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
メディア
<?php
add_media_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
リンク
<?php
add_links_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
ページ
<?php
add_pages_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
コメント
add_comments_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
外観
<?php
add_theme_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
プラグイン
<?php
add_plugins_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
ユーザー
<?php
add_users_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
ツール
<?php
add_management_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
設定
<?php
add_options_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
また、テーマオプションを参照して、Customizer APIを介してオプションを作成するための現在推奨される方法を確認してください。
例
ここでは、トップレベルメニューページとサブメニューページを挿入する方法を示す簡単な例を示します。サブメニューページのタイトルはトップレベルページとは異なります。この例では、register_my_theme_more_settings_menu
は最初のサブメニューページを表示する関数の名前です:
<?php
function register_my_theme_settings_menu() {
add_menu_page(
"My Theme's Settings",
'My Theme',
'manage_options',
'my-theme-settings-menu'
);
}
function register_my_theme_more_settings_menu() {
add_submenu_page(
'my-theme-settings-menu',
'More Settings for My Theme',
'More Settings',
'manage_options',
'my-theme-more-settings-menu'
);
}
add_action( 'admin_menu', 'register_my_theme_settings_menu' );
add_action( 'admin_menu', 'register_my_theme_more_settings_menu' );
カスタム投稿タイプメニューブロックの下にオプションページを追加する例です(こちらも参照):
ページの挿入
さまざまな場所に複数のメニューを挿入する方法の例を示します:
<?php
// Hook for adding admin menus
add_action( 'admin_menu', 'mt_add_pages' );
// Action function for hook above
function mt_add_pages() {
// Add a new submenu under Settings:
add_options_page( __( 'Test Settings', 'menu-test' ), __( 'Test Settings', 'menu-test' ), 'manage_options', 'testsettings', 'mt_settings_page' );
// Add a new submenu under Tools:
add_management_page( __( 'Test Tools', 'menu-test' ), __( 'Test Tools', 'menu-test' ), 'manage_options', 'testtools', 'mt_tools_page' );
// Add a new top-level menu (ill-advised):
add_menu_page( __( 'Test Toplevel', 'menu-test' ), __( 'Test Top-level', 'menu-test' ), 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' );
// Add a submenu to the custom top-level menu:
add_submenu_page( 'mt-top-level-handle', __( 'Test Sub-Level', 'menu-test' ), __( 'Test Sub-Level', 'menu-test' ), 'manage_options', 'sub-page', 'mt_sublevel_page' );
// Add a second submenu to the custom top-level menu:
add_submenu_page( 'mt-top-level-handle', __( 'Test Sub-Level 2', 'menu-test' ), __( 'Test Sub-Level 2', 'menu-test' ), 'manage_options', 'sub-page2', 'mt_sublevel_page2' );
}
// mt_settings_page() displays the page content for the Test settings sub-menu.
function mt_settings_page() {
echo '</pre><h2>' . __( 'Test Settings', 'menu-test' ) . '</h2><pre>';
}
// mt_tools_page() displays the page content for the Test Tools sub-menu.
function mt_tools_page() {
echo '</pre><h2>' . __( 'Test Tools', 'menu-test' ) . '</h2><pre>';
}
// mt_toplevel_page() displays the page content for the custom Test Top-Level menu.
function mt_toplevel_page() {
echo '</pre><h2>' . __( 'Test Top-Level', 'menu-test' ) . '</h2><pre>';
}
// mt_sublevel_page() displays the page content for the first sub-menu of the custom Test Toplevel menu.
function mt_sublevel_page() {
echo '</pre><h2>' . __( 'Test Sub-Level', 'menu-test' ) . '</h2><pre>';
}
// mt_sublevel_page2() displays the page content for the second sub-menu of the custom Test Top-Level menu.
function mt_sublevel_page2() {
echo '</pre><h2>' . __( 'Test Sub-Level 2', 'menu-test' ) . '</h2><pre>';
}
サンプルメニューページ
注: 設定ページを作成するための情報は Settings API を参照してください。
前の例には、mt_settings_page()
のようなダミー関数がいくつか含まれており、実際のページコンテンツのプレースホルダーとして機能します。サイト所有者が設定ページを介してお気に入りの色を入力できるようにする mt_favorite_color
というオプションを作成したい場合はどうでしょうか? mt_options_page()
関数は、画面にデータ入力フォームを出力し、入力されたデータを処理する必要があります。
これを行う関数は次のとおりです:
<?php
// mt_settings_page() displays the page content for the Test settings sub-menu.
function mt_settings_page() {
// Must check that the user has the required capability.
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
// Variables for the field and option names
$opt_name = 'mt_favorite_color';
$hidden_field_name = 'mt_submit_hidden';
$data_field_name = 'mt_favorite_color';
// Read in existing option value from database
$opt_val = get_option( $opt_name );
// See if the user has posted us some information. If they did, this hidden field will be set to 'Y'.
if ( isset( $_POST[ $hidden_field_name ] ) && $_POST[ $hidden_field_name ] == 'Y' ) {
// Read their posted value.
$opt_val = $_POST[ $data_field_name ];
// Save the posted value in the database.
update_option( $opt_name, $opt_val );
// Put a "Settings updated" message on the screen
?>
<div class="updated"></div><!-- .updated -->
<div class="wrap">
<?php echo '<h2>' . __( 'Menu Test Settings', 'menu-test' ) . '</h2>'; ?>
<form action="" method="post" name="form1"></form>
<?php _e( 'Favorite Color:', 'menu-test' ); ?>
<hr />
</div><!-- .wrap -->
<?php
}
}
いくつかの注意事項:
add_menu_page()
やadd_submenu_page()
のようなWordPress関数は、トップレベルまたはサブレベルメニューが表示されるかどうかを判断するために使用される権限を取ります。- ページの出力を処理するためにフックされた関数は、ユーザーが必要な権限を持っていることを確認する必要があります。
- WordPressの管理関数はユーザーログインの検証を処理するため、関数内で心配する必要はありません。
- 上記の関数例は国際化されており、詳細については WordPress開発者のためのI18n を参照してください。
- 関数は、データ入力フォームを画面に表示する前に、入力されたデータを処理するため、新しい値がフォームに表示されます(データベースの値ではなく)。
- これが最初に機能することを心配する必要はありません。WordPressの
update_option
関数は、存在しない場合に自動的にデータベースにオプションを追加します。 - これらの管理メニュー追加手順は、管理ページに移動するたびに解析されます。したがって、オプションページがないテーマを作成している場合でも、後で追加することができ、上記の手順を使用して再アップロードし、調整して満足するまで行うことができます。言い換えれば、メニューは「永続的に追加」されたり、テーマを有効にしたときにデータベースに入れられたりすることはありません。動的に解析されるため、メニュー項目を自由に追加または削除でき、再アップロードすると、変更がすぐに反映されます。
ページフックサフィックス
新しい管理メニューを追加するすべての関数 – add_menu_page()
、add_submenu_page()
およびその特殊バージョン(add_options_page()
など)は、ページフックサフィックスと呼ばれる特別な値を返します。これは、特定のページでのみアクションを登録できるフックとして後で使用できます。
そのようなアクションフックの1つは load-{page_hook}
で、{page_hook}
はこれらの add_*_page()
関数の1つによって返される値です。このフックは、特定のページが読み込まれたときに呼び出されます。以下の例では、プラグインのオプションページを除くすべての管理ページに「テーマが構成されていません」という通知を表示するために使用されます:
<?php
add_action( 'admin_menu', 'my_menu' );
// Here you can check if plugin is configured (e.g. check if some option is set). If not, add new hook.
// In this example hook is always added.
add_action( 'admin_notices', 'my_admin_notices' );
function my_menu() {
// Add the new admin menu and page and save the returned hook suffix
$hook_suffix = add_options_page( 'My Options', 'My Theme', 'manage_options', 'my-unique-identifier', 'my_options' );
// Use the hook suffix to compose the hook and register an action executed when plugin's options page is loaded
add_action( 'load-' . $hook_suffix, 'my_load_function' );
}
function my_load_function() {
// Current admin page is the options page for our plugin, so do not display the notice
// (remove the action responsible for this)
remove_action( 'admin_notices', 'my_admin_notices' );
}
function my_admin_notices() {
echo '<pre><div class="updated fade" id="notice">My Plugin is not configured yet. Please do it now.</div></pre>';
}
function my_options() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
echo '</pre><div class="wrap">';
echo 'Here is where the form would go if I actually had options.';
echo '</div><pre>';
}