当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

「管理メニューの追加」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(ページの挿入)
(和訳完了 en:Adding Administration Menus 22:02, 7 February 2016‎ Atachibana版)
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
{{Old}}
+
== はじめに<span id="Introduction"></span> ==
{{NeedTrans|一部}}
+
  
(注: ユーザーレベルは 3.0 以降非推奨。原文は更新されている。--[[利用者:Mizuno|Mizuno]] 2011年7月23日 (土) 03:29 (UTC))
+
一般にプラグインやテーマの作者は、カスタマイズ用の設定画面、オプション画面を提供する必要があります。もっとも良い設定画面の提供方法は管理メニュー項目を作成することでしょう。ユーザーは[[管理画面]]を使用して設定画面にアクセスできます。この記事ではプラグインの作者を対象に、管理メニューや管理画面の追加方法について説明します。注意 : ここでは[[プラグインの作成]]、およびアクションやフィルターの [[プラグイン API]] について基本的な知識を仮定します。
== はじめに ==
+
  
多くのプラグインはユーザに設定項目を提供することで、プラグインの使用法をカスタマイズできるようにしています。プラグイン作者として、あなたにはいくつかのセットアップ方法があります。一つはプラグインのPHPファイルをユーザに編集させることです。しかし、これは多くのユーザにとって、不愉快です(控えめに言って、ですよ)。したがって、通常考えられるもっと良い方法というのは、ユーザがやり慣れた方法で設定を編集できる管理画面を用意することです。
+
== 関数リファレンス<span id="Function_Reference"></span> ==
 
+
この記事では、プラグインがWordPressにカスタム管理画面を追加する方法について説明します。すでに[[プラグインの作成]]とアクション・フィルターという[[プラグイン API]]の基本的な部分は理解している読者を想定しています。
+
 
+
== 関数リファレンス ==
+
  
 
{| cellspacing="10" width="68%"
 
{| cellspacing="10" width="68%"
21行目: 15行目:
 
|
 
|
 
'''メニュー'''
 
'''メニュー'''
* <tt>[[関数リファレンス/add_menu_page | add_menu_page()]] /[[:en:Function Reference/add_menu_page | en]]</tt>
+
* <tt>[[関数リファレンス/add_menu_page | add_menu_page()]]</tt>
* <tt>[[関数リファレンス/add_object_page | add_object_page()]] /[[:en:Function Reference/add_object_page | en]]</tt>
+
* <tt>[[関数リファレンス/add_object_page | add_object_page()]]</tt>
 
* <tt>[[関数リファレンス/add_utility_page | add_utility_page()]] /[[:en:Function Reference/add_utility_page | en]]</tt>
 
* <tt>[[関数リファレンス/add_utility_page | add_utility_page()]] /[[:en:Function Reference/add_utility_page | en]]</tt>
* <tt>[[関数リファレンス/remove_menu_page | remove_menu_page()]] /[[:en:Function Reference/remove_menu_page | en]]</tt>
+
* <tt>[[関数リファレンス/remove_menu_page | remove_menu_page()]]</tt>
 
'''サブメニュー'''
 
'''サブメニュー'''
 
* <tt>[[関数リファレンス/add_submenu_page | add_submenu_page()]] /[[:en:Function Reference/add_submenu_page | en]]</tt>
 
* <tt>[[関数リファレンス/add_submenu_page | add_submenu_page()]] /[[:en:Function Reference/add_submenu_page | en]]</tt>
46行目: 40行目:
 
* <tt>[[関数リファレンス/add_users_page | add_users_page()]] /[[:en:Function Reference/add_users_page | en]] </tt>
 
* <tt>[[関数リファレンス/add_users_page | add_users_page()]] /[[:en:Function Reference/add_users_page | en]] </tt>
 
* <tt>[[関数リファレンス/add_management_page | add_management_page()]] /[[:en:Function Reference/add_management_page | en]] </tt>
 
* <tt>[[関数リファレンス/add_management_page | add_management_page()]] /[[:en:Function Reference/add_management_page | en]] </tt>
* <tt>[[関数リファレンス/add_options_page | add_options_page()]] /[[:en:Function Reference/add_options_page | en]] </tt>
+
* <tt>[[関数リファレンス/add_options_page | add_options_page()]]</tt>
 
|}
 
|}
 
|}
 
|}
  
== どんな文脈でもHookが必要 ==
+
== どこでもフックが必要<span id="Every_Plot_Needs_a_Hook"></span> ==
  
管理メニューを作るには、次の三つを行う必要があります:
+
管理メニューを追加するには、次の3つのステップが必要です。
#メニューを作成するコードを含んだ関数を作る
+
# メニュー作成用のコードを含む関数を作成する
#"admin_menu"フックに上で作った関数を登録する
+
# [[プラグイン_API/アクションフック一覧/admin_menu|admin_menu]]/[[:en:Plugin_API/Action_Reference/admin_menu|en]] アクションフックを使用してステップ1で作成した関数を登録する。[[ネットワークの作成|ネットワーク]] に管理メニューを追加する場合は、代わりに[[プラグイン_API/アクションフック一覧/network_admin_menu|network_admin_menu]]/[[:en:Plugin_API/Action_Reference/network_admin_menu|en]] を使用する。
#メニューがクリックされたときに表示されるページのHTML出力を作る
+
# メニュー項目をクリックした際に表示されるページ、または画面の HTML 出力を作成する
  
コードはプラグインの主要なPHPファイルに含まれるか、別のPHPからインクルードされなくてはいけません。
+
新米プラグイン開発者が見落としがちなのがステップ2です。メニュー作成用のコードは単純に呼び出せません。コードは'''関数の中'''に入れ、この関数を登録する必要があります。
  
二番目のステップは、新米プラグイン開発者には見過ごされがちです。次に述べるメニュー作成コードを単に呼び出すだけではいけません;あなたはそれを'''関数の中'''に入れ、それから関数を登録するのです。
+
上の3つのステップの非常に簡単な例を示します。このプラグインは[[管理画面]]のトップレベルメニュー「設定」の下に、サブレベルのメニュー項目を追加します。メニュー項目をクリックするとシンプルな画面を表示します。注意: このコードは[[プラグインの作成|メインのプラグイン PHP ファイル]]、または個別の PHP インクルードファイルに追加します。
  
上記の三ステップを簡単な例にしてみましょう:
 
 
<pre>
 
<pre>
 
<?php
 
<?php
/** Step 2 (from text above). */
+
/** 上のテキストのステップ2 */
 
add_action( 'admin_menu', 'my_plugin_menu' );
 
add_action( 'admin_menu', 'my_plugin_menu' );
  
/** Step 1. */
+
/** ステップ1 */
 
function my_plugin_menu() {
 
function my_plugin_menu() {
 
add_options_page( 'My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options' );
 
add_options_page( 'My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options' );
 
}
 
}
  
/** Step 3. */
+
/** ステップ3 */
 
function my_plugin_options() {
 
function my_plugin_options() {
 
if ( !current_user_can( 'manage_options' ) )  {
 
if ( !current_user_can( 'manage_options' ) )  {
78行目: 71行目:
 
}
 
}
 
echo '<div class="wrap">';
 
echo '<div class="wrap">';
echo '<p>Here is where the form would go if I actually had options.</p>';
+
echo '<p>オプション用のフォームをここに表示する。</p>';
 
echo '</div>';
 
echo '</div>';
 
}
 
}
84行目: 77行目:
 
</pre>
 
</pre>
  
ご覧のように、管理画面に新しいアイテムを追加する<tt>my_plugin_menu</tt>関数がありますよね(次節で述べる<tt>add_options_page</tt>関数を使えば、もっと複雑な複数のメニューアイテムを追加できます。もうちょっと読んでみましょう)。それでは、この関数を"登録"するためのWordPressフックを呼び出しましょう。''これを行わないと、プラグインを有効化しようとしたときに"undefined function"というPHPエラーが投げられます。''最後に、ユーザがクリックしたときに表示されるページ(と、処理されるPHPコード)を含む関数を作りましょう。
+
この例では、関数 <tt>my_plugin_menu()</tt> <tt>[[関数リファレンス/add_options_page|add_options_page()]]</tt> 関数を使用して管理画面の''設定''メニューに新しい項目を追加します。注意: より複雑な複数のメニュー項目も追加できます。後半を参照してください。
  
終わりの二つのステップの具体的な処理内容は、これから説明します。コードを関数の中に入れ、すべての処理を開始するために<tt>admin_menu</tt>フックを呼び出す、ということだけは忘れないでください!
+
''ステップ2''の <tt>[[関数リファレンス/add_action|add_action()]]</tt> 呼び出しにより、[[プラグイン_API/アクションフック一覧/admin_menu|admin_menu]]/[[:en:Plugin_API/Action_Reference/admin_menu|en]] フックに関数 <tt>my_plugin_menu()</tt> が''登録''される点に注意してください。'''<tt>add_action()</tt> 呼び出しを忘れると、プラグインを有効化した際に PHP エラー ''undefined function(未定義の関数)'' が投げられます。'''最後に <tt>add_options_page()</tt> 呼び出しは関数 <tt>my_plugin_options()</tt> を参照します。<tt>my_plugin_options()</tt> にはユーザーがメニュー項目をクリックした際に表示される実際のページ、および処理用の PHPコードが含まれます。
  
== メニューとサブメニュー ==
+
これらのプロセスについては以下の節で詳細に説明します。繰り返しになりますが、プロセス全体を適切なタイミングで始めるには、必ずメニューやページを作成するコードを関数内に定義し、''admin_menu'' [[Plugin_API#Current_Hooks_For_Actions|フック]] を使用してください。
  
カスタムの管理画面を作る前に、WordPressの管理メニューのどこにそれが属するのかを指定しなくてはいけません。ほとんどのプラグインはWordPressの既存トップレベルメニュー下にサブメニューとして登録されます。
+
== 新しいメニュー位置の決定<span id="Determining_Location_for_New_Menus"></span> ==
  
Before creating a new menu, first decide if the menu should be a '''top-level''' menu, or a '''sub-level''' menu item.  A top-level menu displays as new section in the administration menus and contains sub-level menu items.  A sub-level menu means the menu item is a member of an existing menu.
+
新しいメニューを作成する前に、まずメニューを '''トップレベル''' のメニューにするか、'''サブレベル''' のメニュー項目にするかを決めます。トップレベルメニューは管理画面の新しいセクションとして表示され、サブレベルメニュー項目を含みます。サブレベルメニューは、既存のメニュー内のメンバーとなるメニュー項目です。
  
It is rare that a plugin would require the creation of a top-level menu.  If the plugin introduces an entirely new concept or feature to WordPress, and needs many screens to do it, then that plugin may warrant a new top-level menu.  Adding a top-level menu should only be considered if you really need multiple, related screens to make WordPress do something it was not originally designed to accomplish.  Examples of new top-level menus might include job management or conference management.  Please note with the native [[Glossary#Post Type|post type]] registration, WordPress automatically creates top-level menus to manage those features.
+
プラグインでトップレベルメニューの作成が必要となることはまれです。仮にプラグインが WordPress にまったく新しいコンセプトや機能を導入し、その実現に多くの画面が必要であれば、新しいトップレベルメニューが必要でしょう。トップレベルメニューの追加は、WordPress に元々設計に組み込まれていない機能の実現に複数の関連する画面が本当に必要な場合にのみ検討すべきです。新しいトップレベルメニューの例としては業務の管理や会議の管理などがあります。なお標準の [[用語集#.E6.8A.95.E7.A8.BF.E3.82.BF.E3.82.A4.E3.83.97|投稿タイプ]] の登録により、その機能管理のため WordPress は自動的にトップレベルメニューを作成することに注意してください。
  
If the creation of a top-level menu is not necessary, decide under what top-level menu to place your sub-level menu item.  As a point of reference, most plugins add sub-level menu items underneath existing WordPress top-level menus.  For example, the [http://wordpress.org/extend/plugins/wp-db-backup/WP-DB Backup plugin] adds a sub-level menu option to the Tools top-level menu.  Please note with the [[Function_Reference/register_taxonomy|taxonomy]] registration, WordPress automatically creates sub-level menus under the applicable top-level menu to manage those features.
+
トップレベルメニューの作成が不要な場合は、次にどのトップレベルメニューの下にサブレベルメニュー項目を置くかを決めます。参考までにほとんどのプラグインは既存の WordPress トップレベルメニューの下にサブレベルメニュー項目を追加します。たとえば [http://ja.wordpress.org/plugins/wp-db-backup/WP-DB Backup プラグイン]はトップレベルメニュー「ツール」にサブレベルメニューオプションを追加します。なお [[関数リファレンス/register_taxonomy|タクソノミー]] の登録により、その機能管理のため WordPress は自動的に適切なトップレベルメニューの下にサブレベルメニューを作成することに注意してください。
  
もしあなたの作ったプラグインがWordPressにとってまったく新しい機能を提供するならば、たくさんの管理画面が必要でしょう。あなたのプラグイン用に新しいトップレベルメニューを作るという道もあります。WordPressにまったく独自の新しいことを行わせるために複数の連携した管理画面が必要だというときだけ、この方法をとるようにしてください。たとえば、画像ギャラリーの管理、データベース管理、コメント管理などです。
+
次の WordPress トップレベルメニューのガイドを使用して正しい位置にサブレベルメニュー項目を置いてください。
  
以下はそれぞれのトップレベルメニューの属性です:
+
;[[管理画面/ダッシュボード/ダッシュボード|ダッシュボード]] : サイトに関する情報のセンター。WordPressのコア、プラグイン、およびテーマを更新する「更新」オプションが含まれる。
 +
;[[管理画面#Posts|投稿]] : 時系列コンテンツの「投稿」を書くためのツールを表示
 +
;[[管理画面#Media|メディア]] : 画像、動画、オーディオのアップロードと管理
 +
;[[管理画面#Pages|固定ページ]] : 「固定ページ」と呼ばれる静的コンテンツを書くためののツールを表示
 +
;[[管理画面#Comments|コメント]] : コメントの管理と、投稿に返信可能なユーザーの制御
 +
;[[管理画面#Appearance|外観]] : テーマやスタイルファイル、サイドバーなどを編集するコントロールの表示
 +
;[[管理画面#Plugins|プラグイン]] : プラグイン管理を扱うコントロールの表示。プラグインそのものの構成オプションは含まれない。
 +
;[[管理画面#Users|ユーザー]] : ユーザー管理のコントロールを表示
 +
;[[管理画面#Tools|ツール]] : エクスポート、インポート、ブログデータのバックアップの管理
 +
;[[管理画面#Settings|設定]] : 管理者だけが参照可能なプラグインのオプションを表示。「[[設定ページの作成]]」も参照
 +
;[[ネットワーク管理]] : ネットワークに配置されるプラグインのオプションを表示。"admin_menu" の代わりに "network_admin_menu" を使用する必要がある。[[ネットワークの作成]] も参照
  
;[[Dashboard_SubPanel|ダッシュボード]] : WordPressのコア、プラグイン、およびテーマを更新するための更新オプションなどの情報が中心に集められています。
+
== admin_menu 関数 <span id="Admin_Menu_Functions"></span>==
;[[管理パネル#Posts|投稿]] : 投稿を書くための管理画面を表示。(time oriented content).
+
;[[管理パネル#Media|メディア]] : 画像、動画、オーディオのアップロードと管理画面を表示する。
+
;[[管理パネル#Pages|固定ページ]] :静的コンテンツと呼ばれるページを書くためののツールを表示します。
+
;[[管理パネル#Comments|コメント]] : Controlling and regulation reader to responses to posts.
+
;[[管理パネル#Appearance|外観]]:テーマやサイドバーなどを編集する管理画面を表示する。
+
;[[管理パネル#Plugins|プラグイン]]:プラグインの初期設定以外を行う管理画面を表示する。
+
;[[管理パネル#Users|ユーザー]]:ユーザ管理画面を表示。
+
;[[管理パネル#Tools|ツール]] : エクスポート、インポート、ブログデータのバックアップの管理画面。
+
;[[管理パネル#Settings|設定]] : Displays plugin options that only administrators should view (also see [[Creating_Options_Pages|Creating Settings Pages]]).
+
;ネットワーク管理者 : Displays plugin options that are set on the Network. Instead of "admin_menu", you should use "network_admin_menu" (see also [[Create A Network]])
+
  
 +
トップレベルメニュー、サブレベルメニューのどこに追加するかが決まったら、次に WordPress に対して新しいページを伝えます。これは <tt>'admin_menu'</tt> アクションに登録する関数によって行われます。動作可能な例については節末尾を参照してください。
  
<!--旧版
 
;[[管理パネル#Settings|設定]]:プラグイン設定を表示し、管理者だけに見える([[Creating_Options_Pages|設定ページを作る]]も参考のこと)。
 
;[[管理パネル#Manage_-_Change_your_content|管理]]:リンク、投稿、カテゴリー、画像などの管理ページを表示する。〔訳注:トップレベルメニュー「管理」はバージョン2.7より廃止されました〕
 
;[[管理パネル#Plugins|プラグイン]]:プラグインの初期設定以外を行う管理画面を表示する。
 
;[[管理パネル#Appearance|外観]]:テーマやサイドバーなどを編集する管理画面を表示。
 
;[[管理パネル#Posts|投稿]]:コンテンツ(投稿やページ)を書くための管理画面を表示。
 
;[[管理パネル#Users|ユーザ]]:ユーザ管理画面を表示。
 
-->
 
  
== admin_menu 関数 ==
+
=== トップレベルメニュー<span id="Top-Level_Menus"></span> ===
  
どこにメニュー・サブメニューを追加するのかを決定したら、次はWordPressに対して新しいページのことを知らせましょう。これはすべて<tt>'admin_menu'</tt>アクションに登録した関数の中に入れてください(この節の最後にある例を参照のこと)
+
プラグインに新規のトップレベルメニューが必要と決定した場合、まず初めに <tt>[[関数リファレンス/add_menu_page|add_menu_page]]</tt> を使用してメニューページを作成する必要があります。注意: トップレベルメニューが必要ない場合は「[[#Sub-Level_Menus|サブレベルメニュー]]」に進んでください。
  
=== トップレベルメニュー ===
+
<?php add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); ?>
  
なんらかの理由により、あなたの作るプラグインには新しいトップレベルメニューが必要だということになったら、あなたがまずしなくてはならないのは、それを作ることです。それが嫌ならば、下のサブメニューまで進んでください。
+
パラメータの値 :
 +
;page_title : メニューが選択された際にページのタイトルタグに表示されるテキスト
 +
;menu_title:管理画面のメニュー上での表示名
 +
;capability : ユーザーがこのメニュー表示する際に必要な[[ユーザーの種類と権限|権限]]。フォームの処理に [[Settings API]] を使用している場合は 'manage_options' を使用してください。ユーザーがオプションを保存できません。
  
新しいトップレベルメニューを追加するには、<tt>add_menu_page</tt>関数を使います:
+
;menu_slug: このメニューを参照するスラッグ名。このメニュー固有の必要があります。[[Version 3.0]] 以前は ''file'' パラメータ、または ''handle'' パラメータと呼ばれていました。''function'' パラメータを省略する場合、menu_slug にはメニューページコンテンツの表示を処理する PHP ファイルを指定する必要があります。
  
<?php add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); ?>
+
;function: メニューページのコンテンツを表示する関数
 +
:技術的には ''function''パラメータはオプションですが、指定されていない場合、WordPress は基本的にインクルードされた PHP ファイルが、関数の呼び出しなしで管理画面を生成するものと仮定します。ページ生成コードはメインのプラグインファイル内の関数に実装できます。
 +
:''function'' パラメータを指定する場合は ''menu_slug'' パラメータに任意の文字列を使用できます。''?page=my-super-plugin/admin-options.php'' の代わりに ''?page=my_super_plugin_page'' のようなページを使用できます。
  
パラメータ:
+
:function は次の2つのどちらかの方法で参照する必要があります:
;page_title:メニューが有効になった時に表示されるHTMLのページタイトル用テキスト。
+
:# 関数がプラグイン内のクラスのメンバーである場合、<tt>array( $this, 'function_name' )</tt> として参照する必要があります。
;menu_title:管理画面のメニュー上での表示名。
+
:# その他のすべての場合、関数名を使用すれば十分です。
;access_level/capability:このメニューページを閲覧・使用するために最低限必要な[[ユーザーレベル]]または[[ユーザーの種類と権限]] 。
+
;file:メニューページのコンテンツを表示するPHPファイル。
+
;function: メニューページにコンテンツを表示する関数。
+
  
技術的に言うと''function''パラメータはオプションですが、指定されていない場合、WordPressは基本的にインクルードされたPHPファイルが管理画面を出力するものと仮定し、関数を呼び出しません。ほとんどのプラグイン作者はページ生成コードを持つ関数をメインのプラグインファイル内に書いています。
+
;icon_url: このメニューで使用されるアイコンの URL 。このパラメータはオプション。
 +
;position: このメニューが表示されるメニュー順の位置。このパラメータを省略すると、デフォルトではメニュー構造の一番下に表示されます。現在のメニュー位置について参照するには、メニューがロードされた後で <tt>print_r($GLOBALS['menu'])</tt> を使用してください。
  
;icon_url:これはWordPress 2.7においてのみ有効です。メニューにカスタムアイコンを追加します。
 
;position: The position in the menu order this menu should appear.  By default, if this parameter is omitted, the menu will appear at the bottom of the menu structure. To see the current menu positions, use <tt>print_r($GLOBALS['menu'])</tt> after the menu has loaded.
 
  
=== サブメニュー ===
+
=== サブレベルメニュー<span id="Sub-Level_Menus"></span> ===
  
トップレベルメニューを決定するか、既存のWordPressトップレベルメニューを使うことを選んだら、<tt>add_submenu_page</tt>関数を使ってサブメニューを定義する準備ができました。表示したい順番に追加していくようにしてください。
+
トップレベルメニューを定義するか、既存の WordPress トップレベルメニューの使用を選択したら、次に <tt>add_submenu_page</tt> 関数を使用して 1つ以上のサブレベルメニュー項目を定義します。サブレベルメニュー項目は表示する順番に追加してください。
 +
 
 +
==== add_submenu_page の使用<span id="Using_add_submenu_page"></span> ====
  
 
<pre>
 
<pre>
add_submenu_page(''parent'', ''page_title'', ''menu_title'', ''access_level/capability'', ''file'', ''[function]'');
+
<?php add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function); ?>
 
</pre>
 
</pre>
  
パラメータ:
+
パラメータの値 :
;parent:サブメニューを挿入したいトップレベルメニューを提供するWordPressのコアadminファイル名。プラグインがトップレベルメニューをなしている場合は、そのプラグインファイル。
+
;parent_slug : 親メニューのスラッグ名。またはサブメニューを追加する先のトップレベルメニューを実装する標準 WordPress 管理ファイルのファイル名。またはサブメニューを追加する先のカスタムトップレベルメニューを実装するプラグインファイル
よくある例:
+
#''投稿''用: add_submenu_page('post-new.php',...)
+
#''管理''用: add_submenu_page('edit.php',...)
+
#''外観''用: add_submenu_page('themes.php',...)
+
#''コメント''用: add_submenu_page('edit-comments.php',...)
+
#''設定''用: add_submenu_page('options-general.php',...)
+
#''プラグイン''用: add_submenu_page('plugins.php',...)
+
#''ユーザ''用: add_submenu_page('users.php',...)
+
;page_title:サブメニューがクリックされたときにHTMLページタイトルになるテキスト。
+
;menu_title:サブメニューの管理画面上での名前。
+
;access_level/capability:このメニューページを閲覧・使用するために最低限必要な[[ユーザーレベル]]または[[ユーザーの種類と権限]] 。
+
;file:既存のWordPressメニュー用には、メニューページのコンテンツを表示するPHPファイル。カスタムのトップレベルメニュー下においては、'''ユニーク'''なこのサブメニューページの識別子。
+
''プラグインがトップレベルメニューを持つ場合、最初のサブメニューはトップレベルメニューと同じ名前を持ち、従ってリンクは複製されます。リンクの複製を避けるには、はじめにadd_submenu_page関数を呼び出し、parentとfileパラメータを同じ名前にします。''
+
;function: メニューページのコンテンツを出力する関数。
+
  
<tt>add_menu_page</tt>関数と同じく、技術的に言うと''function''パラメータはオプションですが、指定されていない場合、WordPressは基本的にインクルードされたPHPファイルが管理画面を出力するものと仮定し、関数を呼び出しません。ほとんどのプラグイン作者はページ生成コードを持つ関数をメインのプラグインファイル内に書いています。
+
:例:
 +
:#''ダッシュボード''用: add_submenu_page('index.php',...)
 +
:#''投稿''用: add_submenu_page('post-new.php',...)
 +
:#''メディア''用: add_submenu_page('upload.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',...)
  
以下はトップレベルメニューページとサブメニューページを挿入する簡単な例です。サブメニューのタイトルはトップレベルページと異なるものになっています。この例では、'my_magic_function'が最初のサブメニューページを表示する関数になります:
+
;page_title:サブメニューが有効化された際にHTMLページタイトルに表示されるテキスト
<pre>
+
;menu_title : サブメニューの管理画面上での名前。
add_menu_page('Page title', 'Top-level menu title', 8, __FILE__, 'my_magic_function');
+
add_submenu_page(__FILE__, 'Page title', 'Sub-menu title', 8, __FILE__, 'my_magic_function');
+
</pre>
+
  
ほとんどのサブメニューはWordPressの設定、管理、外観メニューに加わるため、WordPressはこのメニューに簡単に追加するためのラッパー関数を三つ用意しています:
+
;capability : ユーザーがこのメニュー表示する際に必要な[[ユーザーの種類と権限|権限]]。
  
;トップレベルメニュー「設定」用 ([[Creating Options Pages]]を参照のこと):
+
;menu_slug : 既存の WordPress メニューの場合、メニューページコンテンツ表示を処理する PHP ファイル。カスタムトップレベルメニューのサブメニューの場合、このサブメニューページの'''一意の'''識別子
<pre>
+
add_options_page(''page_title'', ''menu_title'', ''access_level/capability'', ''file'', ''[function]'');
+
</pre>
+
;トップレベルメニュー「管理」用:
+
<pre>
+
add_management_page(''page_title'', ''menu_title'', ''access_level/capability'', ''file'', ''[function]'');
+
</pre>
+
;トップレベルメニュー「外観」用:
+
<pre>
+
add_theme_page( ''page_title'', ''menu_title'', ''access_level/capability'', ''file'', ''[function]'');
+
</pre>
+
  
===== 例 =====
+
:''プラグインが専用のトップレベルメニューを作成する場合、先頭のサブメニューは通常、トップレベルメニューと同じタイトルへのリンクを持つため、リンクが重複します。重複したリンクタイトルを回避するには、最初に parent_slug パラメータと menu_slug パラメータに同じ値を指定して add_submenu_page を呼び出します。''
  
Here's a quick example illustrating how to insert a top-level menu page and a sub-menu page, where the title on the sub-menu page is different from the top-level page. In this example, 'my_magic_function' is the name of the function that displays the first sub-menu page:
+
;function: メニューページのコンテンツを表示する関数
  
<?php
+
:技術的には <tt>add_menu_page</tt> 関数同様、''function''パラメータはオプションですが、指定されていない場合、WordPress は基本的にインクルードされた PHP ファイルが、関数の呼び出しなしで管理画面を生成するものと仮定します。ほとんどのプラグインの作者はメインのプラグインファイル内の関数で、ページ生成コードを実装します。
  add_menu_page('Page title', 'Top-level menu title', 'manage_options', 'my-top-level-handle', 'my_magic_function');
+
  add_submenu_page( 'my-top-level-handle', 'Page title', 'Sub-menu title', 'manage_options', 'my-submenu-handle', 'my_magic_function');
+
?>
+
  
Here's an example of adding an option page under a '''custom post type''' menu block ([http://www.billrobbinsdesign.com/custom-post-type-admin-page/ see also here]):
+
:''function'' パラメータを指定する場合は ''menu_slug'' パラメータに任意の文字列を使用できます。''?page=my-super-plugin/admin-options.php'' の代わりに ''?page=my_super_plugin_page'' のようなページを使用できます。
  
<?php add_submenu_page('edit.php?post_type=wiki', 'Options', 'Options', 'manage_options', 'wiki-options', array(&$this, 'options_page') ); ?>
+
: ''function'' パラメータとしてクラスのメンバーを使用する方法については「[[#Top-Level_Menus|トップレベルメニュー]]」節を参照してください。
  
 +
===== 例<span id="Example"></span> =====
  
==== ラッパー関数を用いる ====
+
以下はトップレベルメニューページとサブメニューページを挿入する簡単な例です。ここでサブメニューのタイトルはトップレベルページと異なります。この例では、'my_magic_function'が最初のサブメニューページを表示する関数です。
  
Since most sub-level menus belong under the Settings, Tools, or Appearance menus, WordPress supplies wrapper functions that make adding a sub-level menu items to those top-level menus easier. Note that the function names may not match the names seen in the admin UI as they have changed over time:
+
<pre>
 +
<?php
 +
add_menu_page('Page title', 'Top-level menu title', 'manage_options', 'my-top-level-handle', 'my_magic_function');
 +
add_submenu_page( 'my-top-level-handle', 'Page title', 'Sub-menu title', 'manage_options', 'my-submenu-handle', 'my_magic_function');
 +
?>
 +
</pre>
 +
 
 +
次の例は '''カスタム投稿タイプ'''メニューブロックの下にオプションページを追加します。[http://www.billrobbinsdesign.com/custom-post-type-admin-page/ こちら] も参照してください。
 +
 
 +
<pre><?php add_submenu_page('edit.php?post_type=wiki', 'Options', 'Options', 'manage_options', 'wiki-options', array(&$this, 'options_page') ); ?>
 +
</pre>
 +
 
 +
==== ラッパー関数の使用<span id="Using_Wrapper_Functions"></span> ====
 +
 
 +
ほとんどのサブレベルメニューは「設定」、「ツール」、「外観」メニューの下に属するため、これらのトップレベルメニューに簡単にサブレベルメニュー項目を追加できるよう、WordPress はラッパー関数を提供します。注意: [[管理画面]]で表示される名前は時間とともに変化したため、関数名と一致しないものがあります。
  
[[Dashboard_SubPanel|ダッシュボード]]
+
[[管理画面/ダッシュボード/ダッシュボード|ダッシュボード]]
<?php add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Administration_Panels#.E6.8A.95.E7.A8.BF_-_.E3.82.B3.E3.83.B3.E3.83.86.E3.83.B3.E3.83.84.E3.82.92.E4.BD.9C.E6.88.90.E3.81.99.E3.82.8B|投稿]]
+
[[管理画面#Posts|投稿]]
<?php add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#管理画面#.E3.83.A1.E3.83.87.E3.82.A3.E3.82.A2_-_.E7.94.BB.E5.83.8F.E3.82.84.E5.8B.95.E7.94.BB.E3.82.92.E6.8A.95.E7.A8.BF.E3.81.AB.E8.BF.BD.E5.8A.A0.E3.81.99.E3.82.8B|メディア]]
+
[[管理画面#Media|メディア]]
<?php add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#管理画面#.E5.9B.BA.E5.AE.9A.E3.83.9A.E3.83.BC.E3.82.B8_-_.E9.9D.99.E7.9A.84.E3.82.B3.E3.83.B3.E3.83.86.E3.83.B3.E3.83.84|固定ページ]]
+
[[管理画面#Pages|固定ページ]]
<?php add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#管理画面#.E3.82.B3.E3.83.A1.E3.83.B3.E3.83.88|コメント]]
+
[[管理画面#Comments|コメント]]
<?php add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Appearance_-_Change_the_Look_of_your_Blog|外観]]
+
[[管理画面#Appearance|外観]]
<?php add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Plugins_-_Add_Functionality_to_your_Blog|プラグイン]]
+
[[管理画面#Plugins|プラグイン]]
<?php add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Users_-_Your_Blogging_Family|ユーザー]]
+
[[管理画面#Users|ユーザー]]
<?php add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Tools - Managing your Blog|ツール]]
+
[[管理画面#Tools|ツール]]
<?php add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
[[Administration_Panels#Settings_-_Configuration_Settings|設定]]
+
[[管理画面#Settings|設定]]
<?php add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
+
<pre><?php add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?></pre>
  
あわせて [[Creating Options Pages]] もご覧ください。
+
[[設定ページの作成]]」も参照してください。
  
=== ページの挿入 ===
+
=== ページの挿入<span id="Inserting_the_Pages"></span> ===
  
以下は色々な場所に新しいメニューを挿入するWordPressプラグインの例です:
+
以下はさまざまな場所に新しいメニューを挿入する WordPress プラグインの例です。
  
 
<pre>
 
<pre>
254行目: 238行目:
 
/*
 
/*
 
Plugin Name: Menu Test
 
Plugin Name: Menu Test
Plugin URI: http://wordpress.org
+
Plugin URI: http://codex.wordpress.org/Adding_Administration_Menus
 
Description: Menu Test
 
Description: Menu Test
Author: Nobody
+
Author: Codex authors
 
Author URI: http://example.com
 
Author URI: http://example.com
 
*/
 
*/
263行目: 247行目:
 
add_action('admin_menu', 'mt_add_pages');
 
add_action('admin_menu', 'mt_add_pages');
  
// 上のフックに対するaction関数
+
// 上のフックに対する action 関数
 
function mt_add_pages() {
 
function mt_add_pages() {
     // 設定メニュー下にサブメニューを追加:
+
     // 「設定」下に新しいサブメニューを追加
     add_options_page('Test Options', 'Test Options', 8, 'testoptions', 'mt_options_page');
+
     add_options_page(__('Test Settings','menu-test'), __('Test Settings','menu-test'), 'manage_options', 'testsettings', 'mt_settings_page');
  
     // 管理メニュー下にサブメニューを追加
+
     // 「ツール」下に新しいサブメニューを追加
     add_management_page('Test Manage', 'Test Manage', 8, 'testmanage', 'mt_manage_page');
+
     add_management_page( __('Test Tools','menu-test'), __('Test Tools','menu-test'), 'manage_options', 'testtools', 'mt_tools_page');
  
     // 新しいトップレベルメニューを追加(分からず屋):
+
     // 新しいトップレベルメニューを追加 (あれだけ言ったのに...)
     add_menu_page('Test Toplevel', 'Test Toplevel', 8, __FILE__, 'mt_toplevel_page');
+
     add_menu_page(__('Test Toplevel','menu-test'), __('Test Toplevel','menu-test'), 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' );
  
     // カスタムのトップレベルメニューにサブメニューを追加:
+
     // カスタムトップレベルメニューにサブメニューを追加
     add_submenu_page(__FILE__, 'Test Sublevel', 'Test Sublevel', 8, 'sub-page', 'mt_sublevel_page');
+
     add_submenu_page('mt-top-level-handle', __('Test Sublevel','menu-test'), __('Test Sublevel','menu-test'), 'manage_options', 'sub-page', 'mt_sublevel_page');
  
     // カスタムのトップレベルメニューに二つ目のサブメニューを追加:
+
     // カスタムトップレベルメニューに2番目のサブメニューを追加
     add_submenu_page(__FILE__, 'Test Sublevel 2', 'Test Sublevel 2', 8, 'sub-page2', 'mt_sublevel_page2');
+
     add_submenu_page('mt-top-level-handle', __('Test Sublevel 2','menu-test'), __('Test Sublevel 2','menu-test'), 'manage_options', 'sub-page2', 'mt_sublevel_page2');
 
}
 
}
  
// mt_options_page() はTest Optionsサブメニューのページコンテンツを表示
+
// mt_settings_page() は Test Settings サブメニューのページコンテンツを表示
function mt_options_page() {
+
function mt_settings_page() {
     echo "<h2>Test Options</h2>";
+
     echo "<h2>" . __( 'Test Settings', 'menu-test' ) . "</h2>";
 
}
 
}
  
// mt_manage_page()はTest Manageサブメニューにページコンテんツを表示
+
// mt_tools_page() は Test Tools サブメニューのページコンテンツを表示
function mt_manage_page() {
+
function mt_tools_page() {
     echo "<h2>Test Manage</h2>";
+
     echo "<h2>" . __( 'Test Tools', 'menu-test' ) . "</h2>";
 
}
 
}
  
// mt_toplevel_page()は カスタムのトップレベルメニューのコンテンツを表示
+
// mt_toplevel_page() はカスタムの Test Toplevel メニューのページコンテンツを表示
 
function mt_toplevel_page() {
 
function mt_toplevel_page() {
     echo "<h2>Test Toplevel</h2>";
+
     echo "<h2>" . __( 'Test Toplevel', 'menu-test' ) . "</h2>";
 
}
 
}
  
// mt_sublevel_page() はカスタムのトップレベルメニューの
+
// mt_sublevel_page() はカスタムの Test Toplevel メニューの
// 最初のサブメニューのコンテンツを表示
+
// 最初のサブメニューのページコンテンツを表示
 
function mt_sublevel_page() {
 
function mt_sublevel_page() {
     echo "<h2>Test Sublevel</h2>";
+
     echo "<h2>" . __( 'Test Sublevel', 'menu-test' ) . "</h2>";
 
}
 
}
  
// mt_sublevel_page2() はカスタムのトップレベルメニューの
+
// mt_sublevel_page() はカスタムの Test Toplevel メニューの
// 二番目のサブメニューを表示
+
// 2番目のサブメニューのページコンテンツを表示
 
function mt_sublevel_page2() {
 
function mt_sublevel_page2() {
     echo "<h2>Test Sublevel 2</h2>";
+
     echo "<h2>" . __( 'Test Sublevel2', 'menu-test' ) . "</h2>";
 
}
 
}
  
311行目: 295行目:
 
</pre>
 
</pre>
  
=== メニューページサンプル ===
+
=== メニューページのサンプル ===
  
上記の例ではいくつかのダミー関数を含んでいます。<tt>mt_options_page</tt>のような、実際のページコンテンツのプレース・ホルダーです。これを本物のメニューページに変更しましょう。それでは、我々のプラグインはmt_favorite_foodというオプションを持っており、サイトオーナーがプラグインのオプションページに好きな食べ物を記入できるようにしたいと仮定しましょう。<tt>mt_options_page</tt>関数がこれを実現するためには、管理画面上にデータ入力フォームがあり、入力されたデータを処理しなくてはいけません。以下がこれを実現する関数の例です:
+
<strong>注意: 設定ページの作成に関する情報については「[[Settings API]]」を参照してください。</strong>
 +
 
 +
上の例には実際のページコンテンツへのプレースホルダーとして <tt>mt_options_page</tt> のようないくつかのダミー関数が含まれています。これを実際のメニューページとして実装する必要があります。ここでプラグインにはオプション「mt_favorite_color」があり、サイト管理者は「設定」ページを使用して好きな色を入力できるものとします。関数 <tt>mt_options_page</tt> は画面にデータ入力用フォームを配置し、入力データを処理します。以下はこの関数の例です。
  
 
<pre>
 
<pre>
  
// mt_options_page()はTest Optionsサブメニューのコンテンツを表示する。
+
// mt_settings_page() は Test Settings サブメニューのページコンテンツを表示
function mt_options_page() {
+
function mt_settings_page() {
 +
 
 +
    // ユーザーが必要な権限を持つか確認する必要がある
 +
    if (!current_user_can('manage_options'))
 +
    {
 +
      wp_die( __('You do not have sufficient permissions to access this page.') );
 +
    }
  
     // フィールドと設定項目名のための変数
+
     // フィールドとオプション名の変数
     $opt_name = 'mt_favorite_food';
+
     $opt_name = 'mt_favorite_color';
 
     $hidden_field_name = 'mt_submit_hidden';
 
     $hidden_field_name = 'mt_submit_hidden';
     $data_field_name = 'mt_favorite_food';
+
     $data_field_name = 'mt_favorite_color';
  
     // データベースから既存の設定値を読み込む
+
     // データベースから既存のオプション値を取得
 
     $opt_val = get_option( $opt_name );
 
     $opt_val = get_option( $opt_name );
  
     // ユーザが何かの情報を投稿したかどうかをチェックする
+
     // ユーザーが何か情報を POST したかどうかを確認
     // 投稿していれば、このhiddenフィールドの値は'Y'にセットされる
+
     // POST していれば、隠しフィールドに 'Y' が設定されている
     if( $_POST[ $hidden_field_name ] == 'Y' ) {
+
     if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
         // 投稿された値を読む
+
         // POST されたデータを取得
 
         $opt_val = $_POST[ $data_field_name ];
 
         $opt_val = $_POST[ $data_field_name ];
  
         // データベースに値を設定する
+
         // POST された値をデータベースに保存
 
         update_option( $opt_name, $opt_val );
 
         update_option( $opt_name, $opt_val );
  
         // 画面に更新されたことを伝えるメッセージを表示
+
         // 画面に「設定は保存されました」メッセージを表示
  
 
?>
 
?>
<div class="updated"><p><strong><?php _e('Options saved.', 'mt_trans_domain' ); ?></strong></p></div>
+
<div class="updated"><p><strong><?php _e('settings saved.', 'menu-test' ); ?></strong></p></div>
 
<?php
 
<?php
  
 
     }
 
     }
  
     // 設定変更画面を表示する
+
     // ここで設定編集画面を表示
  
 
     echo '<div class="wrap">';
 
     echo '<div class="wrap">';
351行目: 343行目:
 
     // ヘッダー
 
     // ヘッダー
  
     echo "<h2>" . __( 'Menu Test Plugin Options', 'mt_trans_domain' ) . "</h2>";
+
     echo "<h2>" . __( 'Menu Test Plugin Settings', 'menu-test' ) . "</h2>";
  
 
     // 設定用フォーム
 
     // 設定用フォーム
357行目: 349行目:
 
     ?>
 
     ?>
  
<form name="form1" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>">
+
<form name="form1" method="post" action="">
 
<input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">
 
<input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">
  
<p><?php _e("Favorite Color:", 'mt_trans_domain' ); ?>  
+
<p><?php _e("Favorite Color:", 'menu-test' ); ?>  
 
<input type="text" name="<?php echo $data_field_name; ?>" value="<?php echo $opt_val; ?>" size="20">
 
<input type="text" name="<?php echo $data_field_name; ?>" value="<?php echo $opt_val; ?>" size="20">
 
</p><hr />
 
</p><hr />
  
 
<p class="submit">
 
<p class="submit">
<input type="submit" name="Submit" value="<?php _e('Update Options', 'mt_trans_domain' ) ?>" />
+
<input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes') ?>" />
 
</p>
 
</p>
  
376行目: 368行目:
 
</pre>
 
</pre>
  
注意点:
 
* WordPressの管理機能はユーザ認証に対する注意を十分に払っているので、その点を心配する必要はありません。
 
* 上記の例に挙げた関数は多言語化されています。詳しくは [[プラグインの作成#プラグインの多言語化|プラグインの多言語化]]を参照のこと。
 
* 関数は入力されたデータが画面の入力フォームに表示されるよりも前に処理するので、フォーム内の値は(データベースの中よりも)新しいものになります。
 
* 最初はこの働きについて心配する必要はありません。というのは、WordPressの<tt>update_option</tt>関数は、その値が存在しなければ、自動的にデータベースへ追加するからです。
 
* これらの管理メニュー追加の手順は管理画面でページに移動するたび発生します。もしも設定ページを持たず、後になって付け加えるようなことがあれば、上の指示に従ってページを追加し、アップロードし、しっくりくるまでチューニングしてください。言い換えれば、メニューは"恒常的に追加されてはいない"のであり、プラグインを有効にしたときにデータベースへ追加されたのでもありません。その都度忙しなく解析されているのであり、好きなときにメニューを付けたり外したりできます。アップロードしなおせば、すぐに変更が反映されます。
 
  
 +
注意点:
 +
* <tt>add_menu_page</tt> や <tt>add_submenu_page</tt> などの WordPress 関数には権限を指定し、トップレベルメニューやサブレベルメニューの表示の可否を決定できます。
 +
* ページの出力処理用にフックされる関数も同様に必要なユーザー権限を確認する必要があります。
 +
* ユーザーログインの検証に対してはWordPress 管理関数が責任を持ちます。このため作成する関数内で注意する必要はありません。
 +
* 上の例に挙げた関数は多言語化されています。詳細については [[プラグインの作成#.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.81.AE.E5.A4.9A.E8.A8.80.E8.AA.9E.E5.8C.96|プラグインの多言語化]]を参照してください。
 +
* 関数はすべての入力データを処理してから、画面にデータ入力フォームを表示するため、フォームにはデータベースから取得した値ではなく、新しい値が表示されます。
 +
* 関数名 <tt>update_option</tt> からデータベースに何もない状態での動作に不安を感じるかもしれませんが、安心してください。<tt>update_option</tt> 関数は値が存在しなければ、自動的にデータベースへ値を追加します。
 +
* この管理メニュー追加プログラムは、ユーザーが管理画面のページに移動するたびに解析されます。したがってプラグインの開発中、当初オプションページを持たなかったものにあとで追加する場合も、単純に上の手順を使用して追加し、アップロードし直し、満足の行くまで調整するだけで済みます。言い換えればメニューは「永久に追加」されたり、プラグインの有効化の際にデータベースに保存されるわけではありません。メニューは動的に解析されるため、メニュー項目は自由に追加、削除でき、変更も即座に反映されます。
  
== Page Hook Suffix ==
+
== Page Hook Suffix<span id="Page_Hook_Suffix"></span> ==
  
Every function that adds a new administration menu (<tt>add_menu_page()</tt>, <tt>add_submenu_page()</tt> and its specialized versions such as <tt>add_options_page()</tt>) returns a special value called ''Page Hook Suffix''. It can be used later as a hook to which an action called only on that particular page can be registered.
+
<tt>add_menu_page()</tt><tt>add_submenu_page()</tt> およびその特別版である <tt>add_options_page()</tt> など、新しい管理メニューを追加するすべての関数は特別な値「Page Hook Suffix」を返します。この値はあとで特定のページに対してのみ呼び出されるアクションを登録するフックとして使用できます。
  
One such action hook is ''load-'''{page_hook}''''', where ''{page_hook}'' is the value returned by one of these <tt>add_'''*'''_page()</tt> functions. This hook is called when the particular page is loaded. In the example below, it is used to display the "Plugin is not configured" notice on all admin pages except for plugin's options page:
+
このようなアクションフックの1つが''load-'''{page_hook}''''' です。このとき ''{page_hook}'' は関数 <tt>add_'''*'''_page()</tt> から返される値です。このフックは特定のページがロードされる際に呼ばれます。
 +
次の例では、すべての管理画面のページで注意「プラグインが未構成」を表示しますが、Page Hook Suffix を使用してプラグイン自身のオプションページでは表示しません。
  
 
<pre>
 
<pre>
394行目: 389行目:
 
add_action('admin_menu', 'my_plugin_menu');
 
add_action('admin_menu', 'my_plugin_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_plugin_admin_notices' );
 
add_action( 'admin_notices', 'my_plugin_admin_notices' );
  
 
function my_plugin_menu() {
 
function my_plugin_menu() {
// Add the new admin menu and page and save the returned hook suffix
+
    // 新しい管理メニュー、ページを追加し、戻り値の hook suffix を保存
 
$hook_suffix = add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
 
$hook_suffix = add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
// Use the hook suffix to compose the hook and register an action executed when plugin's options page is loaded
+
// hook suffix を使用してフックを構成し、プラグインオプションページが
 +
// ロードされた際に実行されるアクションを登録
 
add_action( 'load-' . $hook_suffix , 'my_load_function' );
 
add_action( 'load-' . $hook_suffix , 'my_load_function' );
 
}
 
}
  
 
function 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_plugin_admin_notices' );
 
remove_action( 'admin_notices', 'my_plugin_admin_notices' );
 
}
 
}
  
 
function my_plugin_admin_notices() {
 
function my_plugin_admin_notices() {
echo "<div id='notice' class='updated fade'><p>My Plugin is not configured yet. Please do it now.</p></div>\n";
+
echo "<div id='notice' class='updated fade'><p>My Plugin はまだ構成されていません。すぐに構成してください。</p></div>\n";
 
}
 
}
  
420行目: 417行目:
 
}
 
}
 
echo '<div class="wrap">';
 
echo '<div class="wrap">';
echo '<p>Here is where the form would go if I actually had options.</p>';
+
echo '<p>オプション用のフォームをここに表示する。</p>';
 
echo '</div>';
 
echo '</div>';
 
}
 
}
427行目: 424行目:
  
 
==関連情報==
 
==関連情報==
*[http://comox.textdrive.com/pipermail/wp-hackers/2009-February/024632.html Top Level Menu discussion on wp-hackers]
+
* [https://ja.wordpress.org/plugins/admin-menu-editor/ Admin Menu Editor プラグイン] - 管理項目の追加、削除、非表示、並べ替えが可能
  
{{原文|Adding Administration Menus|67603}}<!-- 15:04, February 20, 2009 Ronnie268 版 -->
+
{{原文|Adding Administration Menus|155575}}<!-- 22:02, 7 February 2016‎ Atachibana版 -->
  
 
{{DEFAULTSORT:かんりめにゆうのついか}}
 
{{DEFAULTSORT:かんりめにゆうのついか}}
437行目: 434行目:
  
 
[[en:Adding Administration Menus]]
 
[[en:Adding Administration Menus]]
 +
[[ja:管理メニューの追加]]
 
[[ru:Добавление административных меню]]
 
[[ru:Добавление административных меню]]
 +
[[zh-cn:Adding Administration Menus]]

2016年2月7日 (日) 22:22時点における最新版

はじめに

一般にプラグインやテーマの作者は、カスタマイズ用の設定画面、オプション画面を提供する必要があります。もっとも良い設定画面の提供方法は管理メニュー項目を作成することでしょう。ユーザーは管理画面を使用して設定画面にアクセスできます。この記事ではプラグインの作者を対象に、管理メニューや管理画面の追加方法について説明します。注意 : ここではプラグインの作成、およびアクションやフィルターの プラグイン API について基本的な知識を仮定します。

関数リファレンス

全般的な関数

メニュー

サブメニュー

WordPress 管理メニュー

どこでもフックが必要

管理メニューを追加するには、次の3つのステップが必要です。

  1. メニュー作成用のコードを含む関数を作成する
  2. admin_menu/en アクションフックを使用してステップ1で作成した関数を登録する。ネットワーク に管理メニューを追加する場合は、代わりにnetwork_admin_menu/en を使用する。
  3. メニュー項目をクリックした際に表示されるページ、または画面の HTML 出力を作成する

新米プラグイン開発者が見落としがちなのがステップ2です。メニュー作成用のコードは単純に呼び出せません。コードは関数の中に入れ、この関数を登録する必要があります。

上の3つのステップの非常に簡単な例を示します。このプラグインは管理画面のトップレベルメニュー「設定」の下に、サブレベルのメニュー項目を追加します。メニュー項目をクリックするとシンプルな画面を表示します。注意: このコードはメインのプラグイン PHP ファイル、または個別の PHP インクルードファイルに追加します。

<?php
/** 上のテキストのステップ2 */
add_action( 'admin_menu', 'my_plugin_menu' );

/** ステップ1 */
function my_plugin_menu() {
	add_options_page( 'My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options' );
}

/** ステップ3 */
function my_plugin_options() {
	if ( !current_user_can( 'manage_options' ) )  {
		wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
	}
	echo '<div class="wrap">';
	echo '<p>オプション用のフォームをここに表示する。</p>';
	echo '</div>';
}
?>

この例では、関数 my_plugin_menu()add_options_page() 関数を使用して管理画面の設定メニューに新しい項目を追加します。注意: より複雑な複数のメニュー項目も追加できます。後半を参照してください。

ステップ2add_action() 呼び出しにより、admin_menu/en フックに関数 my_plugin_menu()登録される点に注意してください。add_action() 呼び出しを忘れると、プラグインを有効化した際に PHP エラー undefined function(未定義の関数) が投げられます。最後に add_options_page() 呼び出しは関数 my_plugin_options() を参照します。my_plugin_options() にはユーザーがメニュー項目をクリックした際に表示される実際のページ、および処理用の PHPコードが含まれます。

これらのプロセスについては以下の節で詳細に説明します。繰り返しになりますが、プロセス全体を適切なタイミングで始めるには、必ずメニューやページを作成するコードを関数内に定義し、admin_menu フック を使用してください。

新しいメニュー位置の決定

新しいメニューを作成する前に、まずメニューを トップレベル のメニューにするか、サブレベル のメニュー項目にするかを決めます。トップレベルメニューは管理画面の新しいセクションとして表示され、サブレベルメニュー項目を含みます。サブレベルメニューは、既存のメニュー内のメンバーとなるメニュー項目です。

プラグインでトップレベルメニューの作成が必要となることはまれです。仮にプラグインが WordPress にまったく新しいコンセプトや機能を導入し、その実現に多くの画面が必要であれば、新しいトップレベルメニューが必要でしょう。トップレベルメニューの追加は、WordPress に元々設計に組み込まれていない機能の実現に複数の関連する画面が本当に必要な場合にのみ検討すべきです。新しいトップレベルメニューの例としては業務の管理や会議の管理などがあります。なお標準の 投稿タイプ の登録により、その機能管理のため WordPress は自動的にトップレベルメニューを作成することに注意してください。

トップレベルメニューの作成が不要な場合は、次にどのトップレベルメニューの下にサブレベルメニュー項目を置くかを決めます。参考までにほとんどのプラグインは既存の WordPress トップレベルメニューの下にサブレベルメニュー項目を追加します。たとえば Backup プラグインはトップレベルメニュー「ツール」にサブレベルメニューオプションを追加します。なお タクソノミー の登録により、その機能管理のため WordPress は自動的に適切なトップレベルメニューの下にサブレベルメニューを作成することに注意してください。

次の WordPress トップレベルメニューのガイドを使用して正しい位置にサブレベルメニュー項目を置いてください。

ダッシュボード 
サイトに関する情報のセンター。WordPressのコア、プラグイン、およびテーマを更新する「更新」オプションが含まれる。
投稿 
時系列コンテンツの「投稿」を書くためのツールを表示
メディア 
画像、動画、オーディオのアップロードと管理
固定ページ 
「固定ページ」と呼ばれる静的コンテンツを書くためののツールを表示
コメント 
コメントの管理と、投稿に返信可能なユーザーの制御
外観 
テーマやスタイルファイル、サイドバーなどを編集するコントロールの表示
プラグイン 
プラグイン管理を扱うコントロールの表示。プラグインそのものの構成オプションは含まれない。
ユーザー 
ユーザー管理のコントロールを表示
ツール 
エクスポート、インポート、ブログデータのバックアップの管理
設定 
管理者だけが参照可能なプラグインのオプションを表示。「設定ページの作成」も参照
ネットワーク管理 
ネットワークに配置されるプラグインのオプションを表示。"admin_menu" の代わりに "network_admin_menu" を使用する必要がある。ネットワークの作成 も参照

admin_menu 関数

トップレベルメニュー、サブレベルメニューのどこに追加するかが決まったら、次に WordPress に対して新しいページを伝えます。これは 'admin_menu' アクションに登録する関数によって行われます。動作可能な例については節末尾を参照してください。


トップレベルメニュー

プラグインに新規のトップレベルメニューが必要と決定した場合、まず初めに add_menu_page を使用してメニューページを作成する必要があります。注意: トップレベルメニューが必要ない場合は「サブレベルメニュー」に進んでください。

<?php add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); ?>

パラメータの値 :

page_title 
メニューが選択された際にページのタイトルタグに表示されるテキスト
menu_title
管理画面のメニュー上での表示名
capability 
ユーザーがこのメニュー表示する際に必要な権限。フォームの処理に Settings API を使用している場合は 'manage_options' を使用してください。ユーザーがオプションを保存できません。
menu_slug
このメニューを参照するスラッグ名。このメニュー固有の必要があります。Version 3.0 以前は file パラメータ、または handle パラメータと呼ばれていました。function パラメータを省略する場合、menu_slug にはメニューページコンテンツの表示を処理する PHP ファイルを指定する必要があります。
function
メニューページのコンテンツを表示する関数
技術的には functionパラメータはオプションですが、指定されていない場合、WordPress は基本的にインクルードされた PHP ファイルが、関数の呼び出しなしで管理画面を生成するものと仮定します。ページ生成コードはメインのプラグインファイル内の関数に実装できます。
function パラメータを指定する場合は menu_slug パラメータに任意の文字列を使用できます。?page=my-super-plugin/admin-options.php の代わりに ?page=my_super_plugin_page のようなページを使用できます。
function は次の2つのどちらかの方法で参照する必要があります:
  1. 関数がプラグイン内のクラスのメンバーである場合、array( $this, 'function_name' ) として参照する必要があります。
  2. その他のすべての場合、関数名を使用すれば十分です。
icon_url
このメニューで使用されるアイコンの URL 。このパラメータはオプション。
position
このメニューが表示されるメニュー順の位置。このパラメータを省略すると、デフォルトではメニュー構造の一番下に表示されます。現在のメニュー位置について参照するには、メニューがロードされた後で print_r($GLOBALS['menu']) を使用してください。


サブレベルメニュー

トップレベルメニューを定義するか、既存の WordPress トップレベルメニューの使用を選択したら、次に add_submenu_page 関数を使用して 1つ以上のサブレベルメニュー項目を定義します。サブレベルメニュー項目は表示する順番に追加してください。

add_submenu_page の使用

<?php add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function); ?>

パラメータの値 :

parent_slug 
親メニューのスラッグ名。またはサブメニューを追加する先のトップレベルメニューを実装する標準 WordPress 管理ファイルのファイル名。またはサブメニューを追加する先のカスタムトップレベルメニューを実装するプラグインファイル
例:
  1. ダッシュボード用: add_submenu_page('index.php',...)
  2. 投稿用: add_submenu_page('post-new.php',...)
  3. メディア用: add_submenu_page('upload.php',...)
  4. 固定ページ用: add_submenu_page('edit.php?post_type=page',...)
  5. コメント用: add_submenu_page('edit-comments.php',...)
  6. カスタム投稿タイプ用: add_submenu_page('edit.php?post_type=your_post_type',...)
  7. 外観用: add_submenu_page('themes.php',...)
  8. プラグイン用: add_submenu_page('plugins.php',...)
  9. ユーザ用: add_submenu_page('users.php',...)
  10. ツール用: add_submenu_page('tools.php',...)
  11. 設定用: add_submenu_page('options-general.php',...)
page_title
サブメニューが有効化された際にHTMLページタイトルに表示されるテキスト
menu_title 
サブメニューの管理画面上での名前。
capability 
ユーザーがこのメニュー表示する際に必要な権限
menu_slug 
既存の WordPress メニューの場合、メニューページコンテンツ表示を処理する PHP ファイル。カスタムトップレベルメニューのサブメニューの場合、このサブメニューページの一意の識別子
プラグインが専用のトップレベルメニューを作成する場合、先頭のサブメニューは通常、トップレベルメニューと同じタイトルへのリンクを持つため、リンクが重複します。重複したリンクタイトルを回避するには、最初に parent_slug パラメータと menu_slug パラメータに同じ値を指定して add_submenu_page を呼び出します。
function
メニューページのコンテンツを表示する関数
技術的には add_menu_page 関数同様、functionパラメータはオプションですが、指定されていない場合、WordPress は基本的にインクルードされた PHP ファイルが、関数の呼び出しなしで管理画面を生成するものと仮定します。ほとんどのプラグインの作者はメインのプラグインファイル内の関数で、ページ生成コードを実装します。
function パラメータを指定する場合は menu_slug パラメータに任意の文字列を使用できます。?page=my-super-plugin/admin-options.php の代わりに ?page=my_super_plugin_page のようなページを使用できます。
function パラメータとしてクラスのメンバーを使用する方法については「トップレベルメニュー」節を参照してください。

以下はトップレベルメニューページとサブメニューページを挿入する簡単な例です。ここでサブメニューのタイトルはトップレベルページと異なります。この例では、'my_magic_function'が最初のサブメニューページを表示する関数です。

<?php
add_menu_page('Page title', 'Top-level menu title', 'manage_options', 'my-top-level-handle', 'my_magic_function');
add_submenu_page( 'my-top-level-handle', 'Page title', 'Sub-menu title', 'manage_options', 'my-submenu-handle', 'my_magic_function');
?>

次の例は カスタム投稿タイプメニューブロックの下にオプションページを追加します。こちら も参照してください。

<?php add_submenu_page('edit.php?post_type=wiki', 'Options', 'Options', 'manage_options', 'wiki-options', array(&$this, 'options_page') ); ?>

ラッパー関数の使用

ほとんどのサブレベルメニューは「設定」、「ツール」、「外観」メニューの下に属するため、これらのトップレベルメニューに簡単にサブレベルメニュー項目を追加できるよう、WordPress はラッパー関数を提供します。注意: 管理画面で表示される名前は時間とともに変化したため、関数名と一致しないものがあります。

ダッシュボード

<?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_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>

コメント

<?php 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); ?>

設定ページの作成」も参照してください。

ページの挿入

以下はさまざまな場所に新しいメニューを挿入する WordPress プラグインの例です。

<?php
/*
Plugin Name: Menu Test
Plugin URI: http://codex.wordpress.org/Adding_Administration_Menus
Description: Menu Test
Author: Codex authors
Author URI: http://example.com
*/

// 管理メニューに追加するフック
add_action('admin_menu', 'mt_add_pages');

// 上のフックに対する action 関数
function mt_add_pages() {
    // 「設定」下に新しいサブメニューを追加
    add_options_page(__('Test Settings','menu-test'), __('Test Settings','menu-test'), 'manage_options', 'testsettings', 'mt_settings_page');

    // 「ツール」下に新しいサブメニューを追加
    add_management_page( __('Test Tools','menu-test'), __('Test Tools','menu-test'), 'manage_options', 'testtools', 'mt_tools_page');

    // 新しいトップレベルメニューを追加 (あれだけ言ったのに...)
    add_menu_page(__('Test Toplevel','menu-test'), __('Test Toplevel','menu-test'), 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' );

    // カスタムトップレベルメニューにサブメニューを追加
    add_submenu_page('mt-top-level-handle', __('Test Sublevel','menu-test'), __('Test Sublevel','menu-test'), 'manage_options', 'sub-page', 'mt_sublevel_page');

    // カスタムトップレベルメニューに2番目のサブメニューを追加
    add_submenu_page('mt-top-level-handle', __('Test Sublevel 2','menu-test'), __('Test Sublevel 2','menu-test'), 'manage_options', 'sub-page2', 'mt_sublevel_page2');
}

// mt_settings_page() は Test Settings サブメニューのページコンテンツを表示
function mt_settings_page() {
    echo "<h2>" . __( 'Test Settings', 'menu-test' ) . "</h2>";
}

// mt_tools_page() は Test Tools サブメニューのページコンテンツを表示
function mt_tools_page() {
    echo "<h2>" . __( 'Test Tools', 'menu-test' ) . "</h2>";
}

// mt_toplevel_page() はカスタムの Test Toplevel メニューのページコンテンツを表示
function mt_toplevel_page() {
    echo "<h2>" . __( 'Test Toplevel', 'menu-test' ) . "</h2>";
}

// mt_sublevel_page() はカスタムの Test Toplevel メニューの
// 最初のサブメニューのページコンテンツを表示
function mt_sublevel_page() {
    echo "<h2>" . __( 'Test Sublevel', 'menu-test' ) . "</h2>";
}

// mt_sublevel_page() はカスタムの Test Toplevel メニューの
// 2番目のサブメニューのページコンテンツを表示
function mt_sublevel_page2() {
    echo "<h2>" . __( 'Test Sublevel2', 'menu-test' ) . "</h2>";
}

?>

メニューページのサンプル

注意: 設定ページの作成に関する情報については「Settings API」を参照してください。

上の例には実際のページコンテンツへのプレースホルダーとして mt_options_page のようないくつかのダミー関数が含まれています。これを実際のメニューページとして実装する必要があります。ここでプラグインにはオプション「mt_favorite_color」があり、サイト管理者は「設定」ページを使用して好きな色を入力できるものとします。関数 mt_options_page は画面にデータ入力用フォームを配置し、入力データを処理します。以下はこの関数の例です。


// mt_settings_page() は Test Settings サブメニューのページコンテンツを表示
function mt_settings_page() {

    // ユーザーが必要な権限を持つか確認する必要がある
    if (!current_user_can('manage_options'))
    {
      wp_die( __('You do not have sufficient permissions to access this page.') );
    }

    // フィールドとオプション名の変数
    $opt_name = 'mt_favorite_color';
    $hidden_field_name = 'mt_submit_hidden';
    $data_field_name = 'mt_favorite_color';

    // データベースから既存のオプション値を取得
    $opt_val = get_option( $opt_name );

    // ユーザーが何か情報を POST したかどうかを確認
    // POST していれば、隠しフィールドに 'Y' が設定されている
    if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
        // POST されたデータを取得
        $opt_val = $_POST[ $data_field_name ];

        // POST された値をデータベースに保存
        update_option( $opt_name, $opt_val );

        // 画面に「設定は保存されました」メッセージを表示

?>
<div class="updated"><p><strong><?php _e('settings saved.', 'menu-test' ); ?></strong></p></div>
<?php

    }

    // ここで設定編集画面を表示

    echo '<div class="wrap">';

    // ヘッダー

    echo "<h2>" . __( 'Menu Test Plugin Settings', 'menu-test' ) . "</h2>";

    // 設定用フォーム
    
    ?>

<form name="form1" method="post" action="">
<input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">

<p><?php _e("Favorite Color:", 'menu-test' ); ?> 
<input type="text" name="<?php echo $data_field_name; ?>" value="<?php echo $opt_val; ?>" size="20">
</p><hr />

<p class="submit">
<input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes') ?>" />
</p>

</form>
</div>

<?php
 
}


注意点:

  • add_menu_pageadd_submenu_page などの WordPress 関数には権限を指定し、トップレベルメニューやサブレベルメニューの表示の可否を決定できます。
  • ページの出力処理用にフックされる関数も同様に必要なユーザー権限を確認する必要があります。
  • ユーザーログインの検証に対してはWordPress 管理関数が責任を持ちます。このため作成する関数内で注意する必要はありません。
  • 上の例に挙げた関数は多言語化されています。詳細については プラグインの多言語化を参照してください。
  • 関数はすべての入力データを処理してから、画面にデータ入力フォームを表示するため、フォームにはデータベースから取得した値ではなく、新しい値が表示されます。
  • 関数名 update_option からデータベースに何もない状態での動作に不安を感じるかもしれませんが、安心してください。update_option 関数は値が存在しなければ、自動的にデータベースへ値を追加します。
  • この管理メニュー追加プログラムは、ユーザーが管理画面のページに移動するたびに解析されます。したがってプラグインの開発中、当初オプションページを持たなかったものにあとで追加する場合も、単純に上の手順を使用して追加し、アップロードし直し、満足の行くまで調整するだけで済みます。言い換えればメニューは「永久に追加」されたり、プラグインの有効化の際にデータベースに保存されるわけではありません。メニューは動的に解析されるため、メニュー項目は自由に追加、削除でき、変更も即座に反映されます。

Page Hook Suffix

add_menu_page()add_submenu_page() およびその特別版である add_options_page() など、新しい管理メニューを追加するすべての関数は特別な値「Page Hook Suffix」を返します。この値はあとで特定のページに対してのみ呼び出されるアクションを登録するフックとして使用できます。

このようなアクションフックの1つがload-{page_hook} です。このとき {page_hook} は関数 add_*_page() から返される値です。このフックは特定のページがロードされる際に呼ばれます。 次の例では、すべての管理画面のページで注意「プラグインが未構成」を表示しますが、Page Hook Suffix を使用してプラグイン自身のオプションページでは表示しません。

<?php
add_action('admin_menu', 'my_plugin_menu');

// ここでプラグインが構成されているかどうかを確認し(例: オプションが設定
// されているかなど)、構成されていなければ、新しいフックを追加
// この例では常にフックを追加
add_action( 'admin_notices', 'my_plugin_admin_notices' );

function my_plugin_menu() {
    // 新しい管理メニュー、ページを追加し、戻り値の hook suffix を保存
	$hook_suffix = add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
	// hook suffix を使用してフックを構成し、プラグインオプションページが
	// ロードされた際に実行されるアクションを登録
	add_action( 'load-' . $hook_suffix , 'my_load_function' );
}

function my_load_function() {
	// 現在の管理ページはこのプラグインのオプションページのため、
	// 注意を表示しない (該当のアクションを削除)
	remove_action( 'admin_notices', 'my_plugin_admin_notices' );
}

function my_plugin_admin_notices() {
	echo "<div id='notice' class='updated fade'><p>My Plugin はまだ構成されていません。すぐに構成してください。</p></div>\n";
}

function my_plugin_options() {
	if (!current_user_can('manage_options'))  {
		wp_die( __('You do not have sufficient permissions to access this page.') );
	}
	echo '<div class="wrap">';
	echo '<p>オプション用のフォームをここに表示する。</p>';
	echo '</div>';
}
?>

関連情報

最新英語版: WordPress Codex » Adding Administration Menus最新版との差分