tag:crieit.net,2005:https://crieit.net/tags/$hook_suffix/feed
「$hook_suffix」の記事 - Crieit
Crieitでタグ「$hook_suffix」に投稿された最近の記事
2021-11-17T00:01:52+09:00
https://crieit.net/tags/$hook_suffix/feed
tag:crieit.net,2005:PublicArticle/17764
2021-11-17T00:01:52+09:00
2021-11-17T00:01:52+09:00
https://crieit.net/posts/wordpress-survey-hook-suffix-20211117
(WordPress) 自作プラグインの設定ページの $hook_suffix を調べる
<p>WordPress で自作プラグインの設定画面にアクションフックを引っかけたかったのですが、引っかからなかったので <code>$hook_suffix</code> について調べました。</p>
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p>自作プラグインの設定画面で処理を走らせるため、アクションフックを引っかけようとしました。</p>
<p>イメージとしては以下の流れを想定しています。</p>
<ol>
<li>自作プラグインの設定画面(サブメニュー)でボタンをクリック</li>
<li>POSTパラメータを投げた先のページで処理を実行 (アクションフック)
<ul>
<li>ただしDBにオプションの値としてデータを保存したいわけではない</li>
<li>そのため、 <code>options.php</code> 経由はしないと想定</li>
</ul></li>
<li>2.より、1.と同じ自作プラグインの設定画面(サブメニュー)に2.POSTパラメータがセットされたリクエストがあった場合は処理をする、としたい</li>
</ol>
<p>そこで</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/hooks/admin_head-hook_suffix/">admin_head-{$hook_suffix} | Hook | WordPress Developer Resources</a></li>
</ul>
<p>このアクションフックを使おうとしました。</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://wp-doctor.jp/blog/2020/04/01/%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%E3%81%AE%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%AB%E9%81%A9%E5%BF%9C%E3%81%99%E3%82%8B%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%B7%E3%83%BC/">ワードプレスの管理画面に適応するスタイルシートを読み込む方法 | ワードプレスドクター</a></li>
</ul>
<p><code>$hook_suffix</code> は該当ページの名前、とのこと。</p>
<p>今回は <code>wp-admin/admin.php?myplugin_settings_submenu_page</code> というようなURLだったので安直に以下のように書いてみました。</p>
<pre><code class="php">function hoge()
{
echo "HOGEEEEEEEE";
}
add_action( 'admin_head-admin.php?myplugin_settings_submenu_page', 'hoge' );
</code></pre>
<p>が、実行されず。そもそもGETパラメータ付きの名前は許容されているのか、というところも含めて調べることにしました。</p>
<h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2>
<p>調査した結果、やはり <code>$hook_suffix</code> は異なる値でした。</p>
<p>今回のように自作プラグインで設定画面を設けている場合は、次のようなルールになります。</p>
<h3 id="独自追加プラグイントップメニュー"><a href="#%E7%8B%AC%E8%87%AA%E8%BF%BD%E5%8A%A0%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%88%E3%83%83%E3%83%97%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC">独自追加プラグイントップメニュー</a></h3>
<pre><code>toplevel_page_<メニュースラッグ>
</code></pre>
<h3 id="独自追加プラグインサブメニュー"><a href="#%E7%8B%AC%E8%87%AA%E8%BF%BD%E5%8A%A0%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%96%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC">独自追加プラグインサブメニュー</a></h3>
<pre><code><トップレベルのメニュー名を sanitize_title() した値>_page_<メニュースラッグ名>
</code></pre>
<p>今回は後者のパターンですね。そして地味に厄介なのは「トップレベルのメニュー名を <code>sanitize_title()</code> した値」という部分。メニュー名はサイドバーのメニューの表示文字列なので、日本語でメニューを作ったプラグインの場合はサニタイズの結果パーセントエンコードされたものになります。</p>
<p>かといってここを小文字の半角英数字とハイフンのみにすると名前がよく分からないことになってしまうので微妙なところ。</p>
<p>例えば、メニュー名を「マイプラグイン 設定」として、サブメニューのスラッグを <code>myplugin_settings_submenu_page</code> としていた場合、 <code>$hook_suffix</code> は <code>%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</code> となります。</p>
<p>そして、冒頭のアクションフックは次のようになります。</p>
<pre><code class="php">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' );
</code></pre>
<p>気持ち的には小文字の半角英数字とハイフンのみにしたいところですが、止む無し。</p>
<h2 id="検証用コード"><a href="#%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%82%B3%E3%83%BC%E3%83%89">検証用コード</a></h2>
<p><code>$hook_suffix</code> を通知バーに表示させるコード。分かりやすいのでこの表示のさせ方は良いですね。</p>
<pre><code class="php">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' );
</code></pre>
<p>※<a target="_blank" rel="nofollow noopener" href="https://digipress.info/wordpress/tips/how-to-load-script-and-css-in-specific-admin-page/">特定のWordPress管理画面でのみ独自のCSSやJavaScriptを読み込む方法 | WordPress テーマ DigiPress</a>より</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/hooks/admin_head-hook_suffix/">admin_head-{$hook_suffix} | Hook | WordPress Developer Resources</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://wp-doctor.jp/blog/2020/04/01/%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%E3%81%AE%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%AB%E9%81%A9%E5%BF%9C%E3%81%99%E3%82%8B%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%B7%E3%83%BC/">ワードプレスの管理画面に適応するスタイルシートを読み込む方法 | ワードプレスドクター</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://plugin.gritt.jp/customize-topic/hook_suffix/">$hook_suffix | WordPressのプラグインを作ろう</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://free-leaf.org/tomorrow/wordpres-enqueue-srcipt-guide/">WordPressの管理画面に独自のスクリプトやスタイルを読み込ませる方法まとめ | 明日のための記録</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://digipress.info/wordpress/tips/how-to-load-script-and-css-in-specific-admin-page/">特定のWordPress管理画面でのみ独自のCSSやJavaScriptを読み込む方法 | WordPress テーマ DigiPress</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://elearn.jp/wpman/function/add_submenu_page.html">add_submenu_page - WordPress私的マニュアル</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://elearn.jp/wpman/function/add_menu_page.html">add_menu_page - WordPress私的マニュアル</a></li>
</ul>
arm-band