apply_filters()を理解できない


19

apply_filters()で

apply_filters( $tag, $value, $var ... );

との周りに頭を包むのに問題が$valueあり$varます。私はコーデックスを読んで、$value修正できるように聞こえますが$var、実際にはこれの例は見つかりませんでした。変数を渡す方法として使用されるようです。その場合、それとの違いは何$varですか?

回答:


35

より良い名前の関数を見てみてください:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

そのため、その関数が次のように呼び出された場合:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

次を使用できます…

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

…そして、その関数に渡される2つの変数を取得します。最初のものを返し、2番目のものはより多くのコンテキストを提供します:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

追加の変数は、決定を容易にするためのものであり、変更するためのものではありません。


正しく理解できたら。$ value_to_changeに自動的に適用されるため、apply_filtersから返された値を収集する変数を追加しませんか?
r00tAcc3ss

@ r00tAcc3ss自動的には何も起こりません。コールバックの値を変更する必要があります。コンテキストに応じて、必要に応じて変更せずに返すこともできます。
FUXIA

そうそう。つまり、返された値を別の変数に受け入れて$ valueに割り当てる必要はありません。フックされた関数の$ valueを変更し、「自動的に」返された場合、それは完了です。
r00tAcc3ss

11

フィルターとは何ですか?

フィルターは、WordPressが特定の実行ポイントでデータを処理する直前にデータを渡す機能です(データベースへの追加やブラウザー画面への送信など)。フィルターは、データベースとブラウザーの間(WordPressがページを生成しているとき)、およびブラウザーとデータベースの間(WordPressがデータベースに新しい投稿とコメントを追加しているとき)にあります。WordPressのほとんどの入出力は、少なくとも1つのフィルターを通過します。WordPressはデフォルトでいくつかのフィルタリングを行い、プラグインは独自のフィルタリングを追加できます。

フィルターへのフック

ユーザーが特定のデータ(値、関数の出力など)を変更できるようにするために、フィルターフックはapply_filters関数を介して提供されます。
これらのフィルターフックには、フィルターの名前(またはtag)と、少なくともデータのフィルター処理(つまり、何らかの変更)に使用される関数名が含まれます。

投稿のタイトルを変更するにthe_titleは、次のように定義されているフィルターフックを使用できます。

apply_filters( 'the_title', $title, $id );

つまり、フィルターにはtag / nameがthe_titleあり、最初のパラメーター$titleは変更されるデータ(つまり、投稿タイトル)であり、2番目のパラメーター$idは追加情報(この場合は投稿ID)です。

たとえば、すべての投稿タイトルを大文字表示するには、次の行を使用できます。

add_filter('the_title', 'strtoupper');

私たちが見て取る場合add_filterの機能を、我々は次のように定義されて参照してください。

add_filter( $tag, $function_to_add, $priority, $accepted_args );

最初と2番目(必須)のパラメーターのみを指定し、3番目と4番目のパラメーターはそれぞれのデフォルト値(つまり10および1)に設定されています。

より複雑なフィルター

特定の投稿のみフィルタリングする場合は、追加情報を使用できます(このフィルターの場合:ID)。そのためには、パラメーターの数(この場合は2)を指定する必要があり、これを再度行うには、priorityパラメーター(引数の数の前に来る)を指定する必要があります。

ID 42の投稿のタイトルのみに影響を与えたい場合、次のようになります。

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

この場合、使用可能な4つのパラメーターすべてを指定する必要があります。

どんなパラメーターがありますか?

特定のフィルターの使用可能なパラメーター(の数)を識別するには、定義されている場所(この場合はhere)を検索する必要があります。


参考文献


2
徹底した対応と申し分のないクラス(素敵なフォーマットブローチャチョ)のために+1!
ボスコ

おかげで、それは非常に徹底的ですが、私が尋ねていたものを実際に説明していません。例えば。フィルター内の$ value変数と$ var変数の違い。
r00tAcc3ss

うーん、そうだとは思いますが、それはもちろん私の主観的な感覚です。ただし、フィルターとそのパラメーターに関する情報を追加します。
tfrommen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.