2021-11-17に投稿

(WordPress) 自作プラグインの設定ページの $hook_suffix を調べる

WordPress で自作プラグインの設定画面にアクションフックを引っかけたかったのですが、引っかからなかったので $hook_suffix について調べました。

経緯

自作プラグインの設定画面で処理を走らせるため、アクションフックを引っかけようとしました。

イメージとしては以下の流れを想定しています。

  1. 自作プラグインの設定画面(サブメニュー)でボタンをクリック
  2. POSTパラメータを投げた先のページで処理を実行 (アクションフック)
    • ただしDBにオプションの値としてデータを保存したいわけではない
    • そのため、 options.php 経由はしないと想定
  3. 2.より、1.と同じ自作プラグインの設定画面(サブメニュー)に2.POSTパラメータがセットされたリクエストがあった場合は処理をする、としたい

そこで

このアクションフックを使おうとしました。

$hook_suffix は該当ページの名前、とのこと。

今回は wp-admin/admin.php?myplugin_settings_submenu_page というようなURLだったので安直に以下のように書いてみました。

function hoge()
{
    echo "HOGEEEEEEEE";
}
add_action( 'admin_head-admin.php?myplugin_settings_submenu_page', 'hoge' );

が、実行されず。そもそもGETパラメータ付きの名前は許容されているのか、というところも含めて調べることにしました。

調査

調査した結果、やはり $hook_suffix は異なる値でした。

今回のように自作プラグインで設定画面を設けている場合は、次のようなルールになります。

独自追加プラグイントップメニュー

toplevel_page_<メニュースラッグ>

独自追加プラグインサブメニュー

<トップレベルのメニュー名を sanitize_title() した値>_page_<メニュースラッグ名>

今回は後者のパターンですね。そして地味に厄介なのは「トップレベルのメニュー名を sanitize_title() した値」という部分。メニュー名はサイドバーのメニューの表示文字列なので、日本語でメニューを作ったプラグインの場合はサニタイズの結果パーセントエンコードされたものになります。

かといってここを小文字の半角英数字とハイフンのみにすると名前がよく分からないことになってしまうので微妙なところ。

例えば、メニュー名を「マイプラグイン 設定」として、サブメニューのスラッグを myplugin_settings_submenu_page としていた場合、 $hook_suffix%E3%83%9E%E3%82%A4%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E8%A8%AD%E5%AE%9A_myplugin_settings_submenu_page となります。

そして、冒頭のアクションフックは次のようになります。

function hoge()
{
    echo "HOGEEEEEEEE";
}
add_action( 'admin_head-%E3%83%9E%E3%82%A4%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E8%A8%AD%E5%AE%9A_myplugin_settings_submenu_page', 'hoge' );

気持ち的には小文字の半角英数字とハイフンのみにしたいところですが、止む無し。

検証用コード

$hook_suffix を通知バーに表示させるコード。分かりやすいのでこの表示のさせ方は良いですね。

function current_pagehook()
{
    global $hook_suffix;
    if( !current_user_can( 'manage_options') ) return;
    echo '<div class="updated"><p>hook_suffix : ' . $hook_suffix . '</p></div>';
}
add_action( 'admin_notices', 'current_pagehook' );

特定のWordPress管理画面でのみ独自のCSSやJavaScriptを読み込む方法 | WordPress テーマ DigiPressより

参考

Originally published at labor.ewigleere.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

arm-band

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント