[WordPress]アクションとフィルタの違い

Last Updated: 2016 年 08 月 02 日 2のコメント

アクションとフィルタフック

WordPressで、アクション(action)とフィルタ(filter)フックを使用して WordPress 機能を大幅に拡張することができます。 プログラムを学んだ方は、 WordPressにアクセスするときに、ソースファイルを変更しようとするものです。 (私も初めて接するとき、ソースをたくさん修正しました。)

しかし、これは望ましいアプローチはありません。 ソースの変更を最小限に抑える必要があり、特に WordPressでもプラグインでも、コアファイルは変更しないでください。 コアファイルを変更する場合 WordPressやプラグインが更新されるたびに修正を繰り返す必要があります。 しかし、時間が経つにつれて、どこを修正したのか覚えていない場合が多く、床を見ることもあるでしょう。 フックを使用して変更したり、機能を追加することにより、このような問題を回避することができます。

前へでadd_filterの基本的な内容を説明しました。 時間になると、アクションとフィルタを扱ったかった状況が不如意ですね。

アクションとフィルタの違い

アクションとフィルタは用途と宣言され、使用されている方法に違いがあります。 およそ整理すると、次のとおりです(参照).

アクション(Action)

  • 何かを追加するときに使用
  • 宣言: add_action()
  • 使用: do_action()

フィルタ(Filter)

  • 何かを変更する必要があるときに使用
  • 宣言: ADD_FILTER()
  • 使用: apply_filters()

簡単に理解を理解簡単な例を挙げてみましょう。

WordPress アクションのサンプル

アクションは、次のような形式で作成することができます。

add_action('my_action_hook_name', 'my_action_function_name', $priority);
function my_action_function_name() {
// 함수가 수행할 작업
}

ここで、$priority はオプションで、デフォルトは「10」です。

このブログに多くのアクションが記載されており、 WordPressを使用していると、様々なアクションとフィルタフックに会うでしょう。 WordPressで、基本的に提供するためのフックがあれば、個々のプラグインでも提供しています。 そして必要に応じて、ユーザーが直接作ってもされます。

例えば、 WordPressでは、「クエリオブジェクトが作成された後に実際のクエリが実行される前に呼び出されます」 pre_get_posts アクションがあります(WordPress Codexページこのアクションについて説明しています)。

Codex書を見れこのフックは、次のように使用することができます。

<?php add_action( 'pre_get_posts', 'your_function_name' ); ?>

そして、様々な使い方が出ています。 例えば、次のような例を見ると、アクションが、具体的にどのように使用されるかを理解して、これを応用することができます。

function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-1,-1347' );
}
}
add_action( 'pre_get_posts', 'exclude_category' );

WordPressこの関数に会えば、アクションのリストから pre_get_postsを検索します。 pre_get_postsが検出されると $ priorityを使用して、いつ実行するかを決定しようと試みます。 数値が低いほど優先順位が与えられます。

参考までに、上記のコードでは、関数 exclude_categoryのみを作成して、実際のコードで使用していないか、またはアクションまたはフィルタにフックをしてくれないと、この関数を実行できません。 上記のコードでフックをしてくれない場合は、 add_action( 'pre_get_posts', 'exclude_category' ); パートだけコメントアウトしてくれればされます。

実行は do_action( 'my_action_hook_name');を介して行われます。 do_actionWordPress マニュアルを見ると、 do_actionは、次のような形式で使用されます。

do_action ( string $tag,  $arg = '' );
  • $ tag:(文字列)(必須)実行アクションの名前
  • $arg,...: (mixed) (オプション) アクションにフックされる関数に渡される追加の引数。 デフォルトでは空です。

アクションが呼び出されると、そのアクションにフックされたすべての関数が実行されます。

参考情報

フィルタの基本的な事項は、 この記事を参考にしてみてください。 そして WordPress コーデックスページを見てみると詳細な説明を見ることができます。

そして、次の文等も参考にしてみてください。

 


2のコメント

コメント

  1. 記事では、WordPressでこの関数に会うと、アクションリストでpre_get_postsを探します」というフレーズがあります。 関数に会う、do_action( 'pre_get_posts'、ブラブラ)。 このコードに会うことを教えてください。

    応答
    • こんにちは?

      WordPressこの関数に会えば、アクションのリストからpre_get_postsを検索します。 pre_get_postsが検出されると$ priorityを使用して、いつ実行するかを決定しようと試みます。 数値が低いほど優先順位が与えられます。

      アクションは、関数ファイルに追加されます。 その後、テーマ関数ファイルをロードして実行されます。 ところが、同じアクションに複数の関数を指定することができます。

      上記のフレーズはexclude_category関数をいつ実行するかについて説明することで理解すればいいようです。

      例えば、
      function search_filter($query) {
      if ( !is_admin() && $query->is_main_query() ) {
      if ($query->is_search) {
      $query->set('post_type', array( 'post', 'movie' ) );
      }
      }
      }

      add_action('pre_get_posts','search_filter');

      このアクションを実行すると、検索結果にカスタムポストタイプが含まれます。 function search_filter関数もpre_get_postsアクションがかかっています。 ここでは、priorityを指定しないくれた。 もし、最初に実行する必要が関数があり、遅く実行する関数がある場合はpriorityを指定してくれればとなります。

      예:
      add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

      アクションの動作原理は、以下を参照してください。

      function wpdocs_who_is_hook($ a、$ b){
      echo ' ';
      print_r($ a); // `print_r` the array data inside the 1st argument
      echo '';

      echo ' '.$b; // echo linebreak and value of 2nd argument
      }

      // then add it to the action hook、matching the defined number(2)of arguments in do_action
      // see [https:// codex。wordpress.org / Function_Reference / add_action] in the Codex

      // add_action($ tag、$ function_to_add、$ priority、$ accepted_args);
      add_action( 'wpdocs_i_am_hook'、 'wpdocs_who_is_hook'、10、2);

      // Define the arguments for the action hook
      $ a = array(
      'eye patch' => 'yes',
      'parrot' => true,
      'wooden leg' => 1
      );
      $b = __( 'And Hook said: "I ate ice cream with Peter Pan."', 'textdomain' );

      // Executes the action hook named 'i_am_hook'
      do_action( 'wpdocs_i_am_hook', $a, $b );

      応答