WordPressの管理画面の特定のページを指定して一番早いタイミングのフック

通常、管理画面の表示時にリダイレクトがしたいなど、なんらかの出力の前に処理を追加したい場合には、add_action( ‘admin_init’, ‘func_name’ ); などを利用しますが、その場合、管理画面内のすべてのページで発火(Fire!)してしまいます。特定のページのみでフックしたいときにはどのような方法があるのかをまとめました。

デフォルトのページの場合は、do_action( 'load-' . $pagenow );でシンプル

do_action( ‘load-‘ . $pagenow ); は、デフォルトで存在する管理画面ページ(つまり、プラグインによって追加されたのではないページ)を表示する際に使えるフックです。

たとえば、「あなたのプロフィール」ページの場合には、URLがwp-admin/profile.phpなので、以下のように書きます。

add_action( 'load-profile.php', 'nskw_func_name' );

プラグインによって追加されたページの場合は、do_action( 'load-' . $page_hook );ですごく分かりにくい

wp-admin/admin.php?page=nskwというトップレベルに追加されたページの場合には、

add_action( 'load-toplevel_page_nskw', 'nskw_func_name' );

トップレベルではないページの場合は、

add_action( 'load-親_page_nskw_settings', 'nskw_func_name' );

などになります。

つまり、add_action( 'load-xxxx', '' );のxxxxの部分に何かを入れましょうということなのですが、このxxxxがすこぶる分かりにくいです。宮内さんが、init近くではなく特定のページでのみスクリプトやスタイルシートをenqueueするときの方法を書いてくれていますので、そちらを参照してください。

このload-xxxxのxxxx部分(hook-suffixという)の作られ方についてのルールがコアのコメントに入っていましたので、一応翻訳しておこうと思います。

コメントは以下(3.9.1ではwp-admin/admin.phpの180行目)

/**
* Fires before a particular screen is loaded.
*
* The load-* hook fires in a number of contexts. This hook is for plugin screens
* where a callback is provided when the screen is registered.
*
* The dynamic portion of the hook name, $page_hook, refers to a mixture of plugin
* page information including:
* 1. The page type. If the plugin page is registered as a submenu page, such as for
* Settings, the page type would be ‘settings’. Otherwise the type is ‘toplevel’.
* 2. A separator of ‘_page_’.
* 3. The plugin basename minus the file extension.
*
* Together, the three parts form the $page_hook. Citing the example above,
* the hook name used would be ‘load-settings_page_pluginbasename’.
*
* @see get_plugin_page_hook()
*
* @since 2.1.0
*/

手抜き翻訳は以下。

/**
* 特定の画面が読み込まれる前に処理が行われます。
*
* load-* フックは複数の文脈をふまえて白化します。このフックはプラグインによって追加されたページのためのもの。
* where a callback is provided when the screen is registered.
*
* フック名の動的に作られる部分($page_hook)は、以下のプラグインの情報によってできあがります。
*
* 1. ページのタイプ。何かの(たとえばSettingsの)サブページならsettingだし、トップレベルなら、toplevel
* 2. ‘_page_’というセパレータ
* 3. plugin basename から the file extension をひいたもの
*
* この3でできあがります。上記の例では、
* ‘load-settings_page_pluginbasename’ になるでしょう。
*
* @see get_plugin_page_hook()
*
* @since 2.1.0
*/

読んでもまだ分かりにくいですね。。。上記で紹介している宮内さんのページの、hook-suffix表示用プラグインを使うのがいいと思います。

僕はこのポストに気がつく前は、wp-admin/admin.phpの中で$page-hookとかをvar_dumpして値を取得していました。

↓ プラグインを作る方々への本、書きました。 ↓

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です