web-dev-qa-db-ja.com

フィルタとフックは実際にどのように機能するのか PHP

フィルタとフックは実際にWordPressでどのように機能しますか?

進んだものについて質問しています。 PHPではどのように実装されていますか?たとえば、どのようにしてさまざまなプラグインからすべてのフックを収集し、それらをコアフックなどに「アタッチ」するか.

21
Aaron Lee

概要

基本的に、FiltersとHooksを呼び出す " Plugin API "は、以下の関数で構成されています。

  1. apply_filters() - 実行
  2. do_action - 実行
  3. apply_filters_ref_array() - 実行
  4. do_action_ref_array() - 実行
  5. add_filter() - スタックに追加
  6. add_action() - スタックに追加

基本的な内部

全体的には、いくつかのグローバル(WordPressの世界では他にもあります)が関係しています。

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

最初のもの$wp_filterは、すべてのフィルタ名をサブ配列として保持するグローバルなArrayです。これらの各サブ配列は、優先順位配列の下で呼び出されたコールバックであるサブ配列をさらに多く保持します。

簡単な詳細

したがって、 execute 関数が呼び出されると、WordPressはそれらのグローバル配列を検索してその名前のキーを探します。それからアタッチされたコールバックは優先順位の後に実行されます。前もって起こる唯一のことはallフィルタに付随するコールバックです。

add_actionまたはadd_filterを使用してコールバックを追加すると、WordPressは最初に「固有の」IDを計算して、すでに添付されているコールバックを上書きしません。

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

それから、コールバックをglobal $wp_filterスタックに追加します。

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

メインのサブ配列が$tag(またはaction/filter name)であることがわかるように、すべてが特定の優先度の下で召喚され、そして "ユニークな"コールバック/ ID文字列がキーとして使われます。

その後、フィルタが呼び出されたとき - $tag/action-/filter-nameが発生したとき - 配列が検索され、コールバックが呼び出されます。 call_user_func_arrayを使用しているので、実際にはいくつの引数が添付されていてもかまいません。 WordPressはそれを単独で解決します。

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
33
kaiser

フック はWordPressコアファイルといくつかの親テーマファイルの両方に含まれています。ファイル内の特定の場所にコンテンツをフックすることができます。

例はWordPressのwp_headフックです。あなたはあなたの子供のテーマでこのフックを使ってその場所にコンテンツを追加することができます。

例:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

いくつかのプレミアムテーマには action hooks が含まれます。これが ビジュアルマップ です。これには、すべてのアクションフックと、それらがGenesisテーマフレームワーク内でコンテンツを出力する位置が含まれています。

例:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Genesisテーマフレームワークでheader.phpファイルを開いた場合、フックは次のようになります。

do_action( 'genesis_header' );

これが WordPressフックのリストです あなたはいろいろな方法で使うことができます。

フィルタ 既存の関数の出力を修正することを可能にし、WordPressコアファイルとGenesisのようないくつかの親テーマフレームワークの両方に含まれています。

これが フィルタのリストです あなたはGenesis Design Frameworkで使うことができます

これがWordPressに含まれる フィルタのリストです

これは、Genesisのようなテーマフレームワークでフィルタを使用する方法の例です。

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

上記のコードは、作成者があなたのコメントにテキストを言うのを変更するために子テーマで使用することができます。どんなテーマでも使えます。

これは、抜粋の長さを50語にカスタマイズする別の例です。

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

The_excerpt()関数は wp-includes/post-template.phpファイルにあります。

これは次のようなものです。

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

プラグインでフックやフィルタを使用してまったく同じことを実行することもでき、親テーマまたはWordPressを更新してもコードが失われることはありません。

基本的に、フックとフィルタを使用すると、WordPressのコアファイルや親テーマファイルを編集せずに、WordPressと親テーマの両方をカスタマイズおよび変更できます。

親テーマのテンプレートファイルを編集する必要がないため、親テーマのフレームワークにフックとフィルタが含まれている場合、子テーマをカスタマイズする方がはるかに簡単です。これにより、安全にテーマを変更することができます。

5
Brad Dalton