web-dev-qa-db-ja.com

フィルターとフックの説明

私は最初のWordPressプロジェクトを開始しようとしています。コアをオーバーライドするカスタマイズされたコアコードを別々の関数/ファイルに移動するタスクがあります(これにより、将来アップグレードするときに保守しやすくなります)。

私は研究をしてきました、そしてそれはadd_filterapply_filterdo_actionadd_actionが行くべき道であるように見えます。私はまだそれらがどのように機能するのかについてまだ確信が持てません。これらのメソッドは、コアメソッドを上書きするために使用しますか?誤解しない限り、addまたはreplaceの行にあると感じたときはadd_filteroverwriteという単語を使用しているため、私は混乱しています。

this (タコスに関するもの)の最初の答えを読みました。

そのため、著者がadd_filterの使い方を説明するのに使用した3つのステップがありました。

ステップ1:$ taco変数の静的な値

<?php $taco = 'chicken'; ?>

ステップ2:

    <?php
    $taco = apply_filters( 'get_taco', 'chicken' );
    ?>

ステップ3:

    <?php
    add_filter( 'get_taco', 'my_special_order' );
    function my_special_order( $content ) {
        return 'shredded beef';
    }
    ?>

それで、この状況ではapply_filterは動的メソッドをその場で作成してchicken文字列を返させるだけなのでしょうか?それとも、ここではget_tacoと呼ばれるコアWordPressメソッドがあり、apply_filterを使用することが元の機能が何であっても上書きするのに役立つだろうという仮定はありますか?

また、あなただけのapply_filterがあなたがadd_filterしたことができるのか?つまり、最初にapply_filter('get_taco'); AND add_filter('get_taco', 'my_special_order');を定義しなかった場合、function my_special_order ($content) ...は機能しませんか。

これらのフィルタをfunctions.phpファイルに入れますか?質問であなたを砲撃してすみません、私はRailsからRubyから来ているので、私はWordPressで完全に無知です。

7
Edmund

誤解がない限り、add_filterは置換または上書きの行にあると感じるとadd_filterがWord addを使用するため、混乱します。

あなたは誤解しています。 add_actionadd_filterはどちらも関数コールバックを一種のキューに挿入します。同じフックに多くのコールバックを追加することができ、それらは優先順位が3番目のパラメータとして含まれている場合を除いて追加された順序で起動します。

それで、この状況では、apply_filterは動的メソッドをその場で作成し、それをチキンストリングを返させるだけなのでしょうか。

apply_filters - 's'に注意してください - 多かれ少なかれフィルタを作成しますが、通常それは文字列ではなく変数に渡され、その変数はそれを変更してそれを返します。

フィルタ 'slugs'は、原則としてWordPress Coreの関数やメソッドの名前ではありませんが、一部の関数には同じ名前のフィルタがあります。たとえば、the_content()the_contentフィルタを呼び出します。

フックは通常関数全体をオーバーライドするのではなく、それらの一部だけをオーバーライドしますが、例外とほぼ例外があります。

また、add_filteredしたものだけをapply_filterできますか?

いいえ、その逆です。 add_filterなのはapply_filterなものだけです。あなたはadd_filter('whatever','abc');を使うことができますが、どこかにapply_filter('whatever',...がなければ何も起こりません。

ほとんど同じことがadd_action/do_actionにも当てはまりますが、アクションは値を返すのではなく、何かをするためのものです。

フックはページロードのさまざまな時点で、また関数やメソッドのさまざまな場所で実行されます。たとえば、save_postwp_insert_post の末尾付近で実行され、pre_get_postsget_postsクラスの WP_Query メソッドの先頭付近で実行されます。他のものは ページロードの途中で そして関数やメソッドではまったく実行されません。それらは、情報を変更または追加する、あるいは他の機能を実行する、ページをリダイレクトするなどの必要性がある場合はいつでも(開発者によって決定されるように)実行します。

詳しくは

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

7
s_ha_dum

私はあなたがそれが少し間違っていると思います。

フィルタとアクションは、フックに「割り当てる」機能です。多くの場所でWordPressはdo_actionまたはapply_filter関数を呼び出します。これらの関数の最初のパラメータはフック名です。

例えばあなたが見るとき

do_action('blabla');

これは、 'blabla'フックに割り当てられているすべてのアクションが呼び出されることを意味します。

add_filteradd_actionは何も上書きしません。それはまさにそれが言うことをします - それは与えられたフックにあなたの機能を割り当てます。

だからあなたのステップ2。フィルタget_tacoを静的な値chickenに適用する。そしてフィルタを適用することによって、私はそれがget_tacoフックに割り当てられたすべての関数を呼び出すことを意味します。

あなたのステップ3.は新しい関数my_special_orderを作成し、それをget_tacoフックに割り当てます。 apply_filter('get_taco')呼び出しがあるたびに、あなたの関数が呼び出されます。

与えられたフックに割り当てられたフィルタ/アクションがなければ、なにもしません。

あなたはここでこのトピックについてもっと読むことができます: http://codex.wordpress.org/Plugin_API

0