web-dev-qa-db-ja.com

フック、フィルタ、アクションの違いは何ですか?

フック、フィルタ、アクションという用語は同じ意味で使用されているようです。それらの違いは何ですか?彼らは何をしますか?どうやって使うの?

1
cjbj

Hooksfiltersactions の総称です。どちらも、通常の機能の動作を変更するためのものです。 WPソースコード内 _アクションを追加することは、フィルタを追加することと同じであるという事実からわかるように、プログラム的に言えば大きな違いはありません。

違いは使い方にあります。アクションを使用して、機能の動作を完全に変更したり、既存の機能に何かを追加したりします。関数や変数の結果を変更するには、フィルタを使います。ちょっと こちらの理論の詳細 を読んでください。

これがあなたのテーマテンプレートファイルindex.phpだとしましょう:

$me = 'I love Star Wars';
$you = 'I love Star Trek';
$me = apply_filters ('do_force', $me);
$you = apply_filters ('do_force', $you);
do_action ('echo_me_you', $me, $you);

その後、あなたのテーマのfunctions.phpまたはあなたのプラグインのメインのphpファイルで、フィルタとアクションを定義することができます。例えば:

add_filter ('do_force','wpse_do_force');
function wpse_do_force ($string) {
  str_replace ('Trek','Wars', $string); // change all occurences of 'Trek ' to 'Wars'
  return $string;
  }

フィルタは$meには効果がありませんが、文字列で 'Trek'を検索し、それを 'Wars'に変更するため、$youを変更します。だから、フィルタが適用された後、私たちは両方ともスターウォーズが大好きです。

今、コードは行動に行きます。これはとても簡単です。

add_action ('echo_me_you', 'wpse_echo_neutral');
function wpse_echo_neutral ($me, $you) {
  echo $me;
  echo $you;
  }

しかし、アクションはあなたが望むように強力にすることができます。たとえば、 'Wars'の発生をすべて 'Trek'に戻すことで、フィルタを無効にすることができます。

add_action ('echo_me_you', 'wpse_echo_trek');
function wpse_echo_trek ($me, $you) {
  str_replace ('Wars','Trek', $me);
  str_replace ('Wars','Trek', $you);
  echo $me;
  echo $you;
  }

この機能はどのように機能しますか?

WordPressがページの組み立てを開始すると、まずあなたのfunctions.phpを読みます。そこにはあなたが追加したすべてのアクションとフィルタが集められています。これらをキューに入れます。次に、do_actionまたはapply_filtersが見つかると、対応するキューを取り出して、見つかった順にアクション/フィルタを1つずつ実行します。

したがって、上記の例では、フィルターdo_forceでトリガーされる関数が1つ定義されており、アクションecho_me_youでトリガーされる関数が2つ定義されています。まず、$meにフィルタを適用し、次に$youにフィルタを適用し、次に関数wpse_echo_neutralを実行し、最後にwpse_echo_trekを実行します。

優先順位

あなたの(子)テーマがロードされた後、プラグイン(そして親テーマ)も同様にロードされます。それらはアクションとフィルタも追加します。そのため、 あなたがthe_titleのために書いたフィルタ は機能しないように見えるかもしれません、なぜならフィルタはプラグインの中の他のフィルタによって無効にされているからです。これが優先事項の役に立つところです。

優先順位により、キュー内のフィルタ/アクションの場所を決定できます。あなたがこれを定義するならば:

add_filter ('the_title', 'wpse_the_title', 999, 2);

優先度999は、このフィルタがキューの最後のフィルタとして実行されるようにします(2はフィルタ/アクションに渡されたパラメータの数です)。

動作しません!

ええ、それが起こるか、それでそうです。上記の例からわかるように、フィルタを無効にするアクションがある場合は、自分のフィルタで何でもできますが、効果はありません。子/親およびプラグインの設定は非常に複雑なので、慎重にデバッグする必要があります。

最初のステップは、関数の最初の行としてecho 'GOT HERE'のようなものを含めることです。これはあなたのフィルタ/アクションがまったく呼び出されたかどうかを教えてくれます。そうでなければ、あなたは遅すぎて夢中になっています。あなたのfunctions.phpにあるかもしれないこのコードを見てください:

add_action ('wp_footer','wpse_footer');
function wpse_footer() {
  add_action ('wp_head', 'wpse_head');
  }
function wpse_head() {
  echo 'GOT HERE';
  }

do_action (wp_head)は、do_action (wp_footer)に遭遇したときに既にWPによって実行されているので、これはうまくいきません。そのため、その時点でwp_headキューにアクションを追加しても効果はありません。ネイティブのWordPressフックにアクションを追加するときは常に hook order を見直してください。通常の間違いは、ウィジェットからスクリプト/スタイルファイルをエンキューしようとしていることです。フック順からわかるように、ウィジェットがWordPressページにフックされているdynamic_sidebarは、wp_enqueue_scriptsの後に実行されます。

フィルタ/アクションがまったく実行されない理由は他にもあります。たとえば、WPは特定の状況下でフィルタをスキップするためです。ここでは、ソースコードを詳しく調べる以外に選択肢はありません(またはWPSEでここで質問してください)。

2番目のステップは、フィルターが呼び出されたことを確認したら、それを優先度が非常に高い優先順位に変更して、それが無効にされないようにすることです。また、干渉を排除するためにすべてのプラグインを無効にしてください。

3番目のステップ、あなたの関数が呼ばれて干渉が排除されていてもそれでもうまくいかない場合は、おそらくあなた自身のコーディングスキルと関係があります。タイプミスをチェックしたり、中間結果をエコーし​​たりするなどして、問題のあった場所を見つけます。

まとめ

フックシステムは、WordPress自体またはプラグイン/テーマの動作を変更するための強力ではあるが混乱を招くシステムです。誰もが人気のあるフックを使用しているので、結果は予想外のものになる可能性があります。ただし、ほとんどの問題は、フックの順序と優先順位を注意深く見れば整理できます。

3
cjbj