れいぶろぐゲームをプレイしたり、作ったりしてる人、LABEのブログ『れいぶろぐ』。創作のこと、PCのこと、その他趣味のことを広く浅く。(3)WordPressのサイトをカスタマイズする時にお世話になるアクション/フィルターフック。これに自作の関数をフックする(追加する)ことで様々な処理を追加することができる。プラグインなどはその機能としてフックを利用していることも多い。場合によっては、プラグインなどがフックした関数を外したい場合もある。フックするのは簡単でも、外すとなると一筋縄ではいかない場合もある。)から外す方法を調べてみた。まとめ普通の関数の場合まず参考までに、普通の関数を普通にフックした場合の外し方を以下に示す。同じ値を指定しなければならないという点だ。この値はフックする関数の優先順位で、初期値は「10」となっている。以下の各例では優先順位の指定を省略する。クラスによる変数のフックとはクラスについての詳しい説明はここでは省略するが、WordPressのプラグインには関数ではなくクラスによって作られているものが少なくない。そんなクラスの内部で関数として働くのがメソッドであり、クラスの内部でメソッドを以下のようにフックすることができる。第2引数には関数名の代わりに配列を使う。この配列は、一つ目の要素がクラスのインスタンス、二つ目の要素はフックするメソッドの名前である。このようにフックされたメソッドを、クラスの外側から外すにはどうすればよいのだろう。検索するとよく出てくるのが、以下の方法。);配列にクラス名とメソッド名を指定するというものだ。この方法はとてもシンプルだが、この方法が使えない場合もあるようだ。Codex筆者による和訳:もしアクションがプラグインなどによりクラスの内部で追加されたのなら、これを除去するにはそのクラスのインスタンスを含む変数を通じて、そのクラスにアクセスする必要があるだろう。その関数(訳注:メソッドのこと)がstatic(静的)であり、クラスと関数を直接コールすることができる、という場合でない限り。staticメソッドがフックされている場合ならこの方法が使える、ということ。クラス情報を含むグローバル変数プラグインがクラスのインスタンスを生成した時、それをグローバル変数に格納していれば、そのグローバル変数を利用できる。);しかし、そのようなグローバル変数を使用しないプラグインもあり、俺が今回遭遇したのはそういう場合だった。「シングルトン」なクラスこのブログではプラグイン「Jetpack」の「Notifications」という機能を使っているのだが、こいつがHTML内に追加する多数のCSSやJavaScriptを除去しようとしていた。管理ページ(ダッシュボード)以外ではヘッダーメニュー(ログイン中にWPサイトのページ上端に表示される黒いやつ)を表示しない設定にしているのに、これらは常に読み込まれてしまうのだ。その元凶のコードが存在することがわかった。staticメソッドでもない。}}Jetpack_Notifications::init();で、さらに調べていると以下の情報が見つかった。Overflowリンク先にあるこの投稿に、答えがあった。class”(シングルトンなクラス)とは、インスタンスを変数に格納せずとも、メソッドにより常に一意のインスタンスを得られる仕組みをもつクラスのこと、だと思う。ようなstaticメソッドをもつクラスのことだ。このメソッドは最初にコールした時は自身のインスタンスを生成し、その後はどこで何度コールしても、最初に生成したのと同じインスタンスを返してくれる。グローバル変数を使わずに、外部からでもアクセス可能なインスタンスを保持できるというわけで、現状ではベストプラクティスであると目されている。このメソッドを使えば、以下のようにフックを外すことができる。);最初の例のようなクラスところで、この記事で最初の例として挙げたクラスを思い出してほしい。あのクラスはグローバル変数にインスタンスが格納されておらず、かといってstaticでもなく、シングルトンでもない。この場合、どうすればいいのだろう。いや、どうすることもできない。(反語)すなわち、このように外部から参照できないような実装は、問題なく動作するが、決して真似するべきではないということだ。......と思ったら、実はまだ方法があるらしい。Exchangeリンク先にあるこの投稿に示されている関数を使えば、力技だがどんなフックでもクラス名とメソッド名だけで外せるようだ。格納されているようで、この中からクラス名やメソッド名を探し出してフックを外すことができるのだという。世の中には詳しい人がいるものだ......まとめ調べてみて、クラスのメソッドによって追加されたフックを解除するには以下の方法があることがわかった。実は俺、WordPressにはけっこう詳しくなったが、PHPのクラスについてはまだ勉強中だ。将来的にプラグインを自作するようになったら、クラスにはシングルトンパターンを使うようにしたいと思う。テーマ関数のクラス化を手がけるのもいいかもな。(2016/01/17)こめんとコメントはまだありません。こめんとする本文のみ必須。メールアドレスは公開されないよ。お名前メアド名前とメアドを記憶する数式の空欄を正しく埋めてね。※本文には日本語を“数文字”以上含めてね。(詳細)コメントを投稿すると、メールアドレスを含む投稿内容と、投稿者を識別するIPアドレスなどが当サイトのサーバーに送信され、保持される。これらの情報は当サイトのサービスの提供やコンテンツの改善のために利用される。あなたは、当サイトによるこれらの情報の取り扱い(取得・処理・利用)に同意しなければ、コメントを投稿することはできない。この同意の要件は法的な要件として追加されたもので、当サイトによるこれらの情報の取り扱いは従来から変わっていない。当サイトの個人情報の取り扱いについて詳しくは、プライバシー・ポリシーを読んでね。(871)※過去30日間の閲覧数データによる。