プラグインごとでメニュー項目が異なる

WordPressのプラグインメニューで、インストールしているプラグインごとにメニューが違うことに気付く。デフォルトでは、「有効化/停止」と「編集」の2つがあるだけなのに、「設定」という項目を出しているプラグインがあって、クリックするとそのプラグインの設定画面に一発でいける!
これは良い( ・∀・)イイ!!自分のプラグインにも実装したいなと思い調査を開始。

plugin_action_linksフィルターフック

探したらやっぱりあったフィルターフック。さすがWordPress。plugin_action_linksというフィルターフックを発見しました。これにフックさせればいいのか。まずは、プラグインのコンストラクタで以下のように記述。

add_filter( 'plugin_action_links', array( $this, 'plugin_action_links' ) );

よし、次は関数を作ろう。

plugin_action_linksフィルターフックの引数

WordPressのコアファイルを見ると、どうやら第一引数に「有効化/停止」と「編集」リンクの内容を渡している模様。ちょっとダンプして中身を見てみます。

public function plugin_action_links( $links ) {
	var_dump( $links );
	return $links;
}

すると、以下のような情報を取得できました。

array (size=2)
  'deactivate' => string '<a href="plugins.php?action=deactivate&amp;plugin=wp-frequently-searched-words%2Fwp-frequently-searched-words.php&amp;plugin_status=all&amp;paged=1&amp;s&amp;_wpnonce=bb5ca1af5a" aria-label="Frequently Searched Words を無効化">停止</a>' (length=241)
  'edit' => string '<a href="plugin-editor.php?file=wp-frequently-searched-words/wp-frequently-searched-words.php" class="edit" aria-label="Frequently Searched Words を編集">編集</a>' (length=167)

なるほど、ではこの配列に「設定」リンクを追加してreturnしてあげれば良いのか……と思ったのですが、plugin_action_linksフィルターフックだと、全てのプラグインをフックしてしまうことが判明。これは、関数内で自分のプラグインの設定だった〜というような分岐を入れるかと考えたのですが、さすがWordPress。あった、プラグインごとにフックさせることができるフィルター。

plugin_action_links_(plugin_file_name)でフィルターフック

plugin_action_linksフィルターフックにプラグインファイル名を指定することで、実現できるplugin_action_links_(plugin_file_name)というフィルターフックが存在しました。これはステキだ。ということで、あらためて、コンストラクタにフィルターフックを定義。

add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_action_links' ) );

plugin_basename( __FILE__ )でプラグインファイル名を取得して文字列結合します。これで、自分のプラグインのときにだけフックしてくれるようになりました。

関数で「設定」リンクをセット

では、あらためて関数で設定リンクを実装します。関数を以下のように設定しました。

public function plugin_action_links( $links ) {
	$url = admin_url( 'admin.php?page=' . xxxxxx.php' );
	$url = '<a href="' . esc_url( $url ) . '">' . __( 'Settings' ) . '</a>';
	array_unshift( $links, $url );
	return $links;
}
  1. 2行目:変数に管理画面の設定画面のリンク文字列を生成します。(xxxxxx.phpの箇所は任意です)
  2. 3行目:生成したURLをa要素に設定しています。(エスケープしましょう)
  3. 4行目:配列に追加しています。「設定」は先頭に出したいので、array_unshiftメソッドで先頭に追加。
  4. 5行目:値を追加した配列をリターン。

これで確認してみると……

プラグイン「設定」リンク追加完了

できた!\(^o^)/
他のプラグインにも実装しよう。WordPressはあらゆるところにフックポイントを持っているので、コアを触らず解決するところがステキだ。