web-dev-qa-db-ja.com

どのように私はフィルタ/アクションで渡される変数とそれらの意味が何であるかを知るのですか?

これまで何度か見たことがあるが理解できないことは次のとおりです。テーマのfunctions.phpでは、次のように関数が定義されてフックにアタッチされています(簡単な例)。

function do_stuff($a, $b) {
    // Do stuff with $a and $b
}
add_filter( 'bloginfo_url', 'do_stuff', 10, 2 );

基本的に私はそこで何が起こっているのか理解していると思いますが、どうすれば$a$bがわかりますか?
"伝統的な" PHPの方法では、関数は次のようになるでしょう。

do_stuff("var a content", $var_b_content);

$a$bに何が含まれているのかは明らかですが、それをWordpressでどうやって知ることができるでしょうか。

実生活の例として、次の関数を取ります( FrankBültge のクレジット)。

if ( ! function_exists( 'fb_css_cache_buster' ) ) {
        function fb_css_cache_buster( $info, $show ) {
                if ( ! isset($pieces[1]) )
                        $pieces[1] = '';
                if ( 'stylesheet_url' == $show ) {

                        // Is there already a querystring? If so, add to the end of that.
                        if ( strpos($pieces[1], '?' ) === FALSE ) {
                                return $info . "?" . filemtime( WP_CONTENT_DIR . $pieces[1] );
                        } else {
                                $morsels = explode( "?", $pieces[1] );
                                return $info . "&" . filemtime( WP_CONTENT_DIR . $morsles[1] );
                        }
                } else {
                        return $info;
                }
        }

        add_filter( 'bloginfo_url', 'fb_css_cache_buster', 9999, 2 );
}

この関数は、最後の変更の日付(filemtimeを使用)をクエリ文字列としてCSS呼び出しに添付することでCSSのバージョン管理に使用できます。

ご覧のとおり、その関数に渡される変数として$info$showが使用されています。しかし、これらの変数に何が含まれているのか、どうすればわかりますか?彼は条件付き論理('stylesheet_url' == $show)でこれらの変数を使うことさえします、それではどういうわけかそこに何かが自動的に渡されなければなりませんか?

2
Sven

基本的にすべてのフィルタは元の機能コードに登録されなければなりません(フィルタは単にデフォルト機能で起こっていることを上書きすることができる方法ですから)。 add_filter()を使ってカスタム関数をフィルタに追加する前に、そのフィルタをapply_filters()で登録しなければなりません(同じことをする関数が他にもありますが、これが最も重要なものです)。

したがって、 元の関数 で指定した例では、apply_filters()への呼び出しがあります(533行目)。

$output = apply_filters('bloginfo_url', $output, $show);

ご覧のとおり、元の関数コンテキストの2つのパラメータは$output$showです。

要約すると、フィルタのパラメータが何であるかを見つけるための最良の方法は次のとおりです。

  • コーデックス でパラメータの説明を調べてください(ただし、すべてのフィルタが完全に文書化されているわけではありません)。
  • 元の関数のソースコードを調べて、どのパラメータがフィルタに渡されるかを確認してください。

あなたのコメントに答えるために編集してください

$ infoは$ outputの単なる別名ですか?

あなたが正しいです。変数の名前は、フィルタを通過するときに変わる可能性があります。これは単にPHPで関数を宣言する方法によるものです。

my_function($output);

function my_function($info) {
    // in the context of this function the content of $output is now inside the variable $info.
}

また、 'bloginfo_url'という名前のフィルタではどうなりますか?私はそれをコアの中で見つけようとしましたが、そこにはありませんでした。

デフォルトではbloginfo_urlには何も起こりません。 WordPress Coreは、このフィルタに機能を追加しません。それはあなたのためにこのフィルタを提供するだけなので、あなたはどんなコアファイルも修正する必要なしにネイティブのWordPressのふるまいを変えることができます。 (これはこのフィルタの場合だけです、他のフィルタのいくつかはWordPress自身によって使用されます。)

これらのフィルタを使用する際に常に注意しなければならないことの1つは、他のもの(プラグインまたはWordPress自体)が、自分の機能で達成したいものと競合する機能を添付できることです。 $priorityパラメータを使用して、同じフィルタにアタッチされている他の関数に関して自分の関数をいつ実行するかを制御できます。

5
s1lv3r