[WordPress]プラグイン画面に「設定」を出したい

PHP
この記事は約6分で読めます。

外部リンクを「はてなブログカード」に置き換えて表示させるWordPressプラグイン「Pz-HatenaBlogCard」を公式プラグインディレクトリにて公開しています。

「サブメニュー」からだけでは無く、「プラグイン画面」のプラグイン名のところのメニューにも「設定」を追加したいです。

プラグイン画面の小さいメニュー

プラグイン画面のプラグイン名のところに小さいメニューがあって、無効化されているときには「有効化|編集|削除」の3つが表示されています。

plugin-act-edt-del

有効化したときには通常は「停止|編集」となります。

plugin-deact-edt

有効化したときに設定画面へ飛ぶ「設定」を追加したいと思いました。

フィルターの追加でいけそう

WordPress プラグイン 一覧 設定へのリンク」とかで検索しても、見つかりません(^-^;

他のプラグインさんとかを見たところ、「add_filter ()」を使うようです。

add_filter('plugin_action_links','add_action_links');

「plugin_action_links」が「プラグインのページに表示するリンクのリストに適用」ということらしいので、ここが「停止編集」とかの設定のようです。

このプログラムだと、第二パラメータと自身のプログラム名を確認して、一緒だったら「Settings」を追加しているようです。

function add_action_links ( $links , $file ) {
if ($file == plugin_basename(dirname(__FILE__).'/sample.php')) {
$add_link = '<a href="options-general.php?page=sample_options">Settings</a>';
array_unshift( $links, $add_link);
}
return $links;
}

array_unshift()を使っているので、一番前に追加されて「Setting停止編集」と表示されていました。

これからすると、プラグインを表示して小さいメニューを表示させる度にフックされて、配列の中身はそのプラグインのメニューだけが入っているようです。

実際に、print_rで出力してみたところ。

file=pz-hatenablogcard/pz-hatenablogcard.php
link=Array ( [deactivate] => 停止 [edit] => 編集 )
file=pz-linkcard/pz-linkcard.php
link=Array ( [activate] => 有効化 [edit] => 編集 [delete] => 削除 )

登録されているプラグインの数だけフックされてきました。

有効化されていても、無効化されていてもフックされてきます。

自分かどうか確認して、一緒だったら配列に「<a href=”options-general.php?page=プラグイン名“>設定</a>」を加えてあげれば良い、ということのようです。

(「自分かどうか」の確認をしっかりしないと、全プラグインに自分のプラグインの設定ページへのリンクが付いてしまいます。ver1.1.2では誤った実装をしてしまい、全プラグインのところにPz-HatenaBlogCardの設定へのリンクが表示されてしまいました。)

自分のプラグイン名を表示するときだけフック

「plugin_action_links」でフックをすると、全てのプラグイン名が表示されるときにフックがかかります。

これでは間違って、ほかのプラグインのところに何か表示してしまったりしそうです。(実際、してしまいました。)

「plugin_action_links_プラグインベース名」でフックすれば、そのプラグインのときだけフックがかかるようです。

add_filter('plugin_action_links_'.plugin_basename(__FILE__) , 'add_action_links');

これで、配列の最後にオプションページへのリンクを追加すれば、「停止編集Settings」という感じに表示されます。

function add_action_links ( $links ) {
$links[] = '<a href="options-general.php?page=sample_options">Settings</a>';
return $links;
}

配列の最初に追加した方が見栄えは良いかも知れません。

function add_action_links ( $links ) {
$add_link = '<a href="options-general.php?page=pz-test">Settings</a>';
array_unshift( $links, $add_link);
return $links;
}

クラス化しているときは、array($this, … )を忘れずに

「Pz-HatenaBlogCard」は、クラスとして定義しているので、呼び出す関数名のところには「array($this, …)」が付いています。

add_filter('plugin_action_links','add_action_links');

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

プラグイン名でフックするときも。

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

 

初めて「設定」にサブメニューを追加して設定画面を作ったところでいったん満足したつもりだったのですが、今度はプラグイン一覧のところにも「設定」が欲しいと思ってしまいました。

 

調べていたら「結構簡単に実装できそう!」と思ってやってみたところ、全てのプラグインに「設定」が付いてしまいました。(しかも全部「Pz-HatenaBlogCard」の設定画面)

settings-settings-settings-settings-settings

「『設定』付いたー(^-^)o」→「さっそく公開!(^-^)o」

嬉しくなってさくさく公開してしまったところで、

「ぎゃ、ぎゃー!Σ(゚ロ゚)o゙」

「全部にPz-HBCの設定が付いてるー!Σ(゚ロ゚)o゙」

ちょっと倒れそうになってしまいました。

検証大事…。

コメント

タイトルとURLをコピーしました