web-dev-qa-db-ja.com

do_actionとadd_actionはどのように機能しますか?

Do_actionとadd_actionが正確に機能するものを見つけようとしています。私はすでにadd_actionで調べていますが、do_actionについては、今は新しいものとして試しています。これは私が試したものです。

function mainplugin_test() {

$regularprice = 50;

if(class_exists('rs_dynamic')) {
$regularprice = 100;
}

// and doing further
//like i echoing the regular price
echo $regularprice; //It print 100 from this code

}

現在、メインファイルにいくつかのコードを配置する代わりに、コードの混乱の問題を回避するためにdo_actionを作成する予定です。

    function mainplugin_test() {

    $regularprice = 50;

    do_action('testinghook');

// and doing further
//like i echoing the regular price
echo $regularprice; //It should print 100 but it print 50

    }

だから私はそのようなフックを次のようなものとして指摘する別の関数を作成しました

function anothertest() {
if(class_exists('rs_dynamic')) {
$regularprice = 100;
}
}
add_action('testinghook','anothertest');

上記の関数が機能する可能性のあるフックにコード行を追加する方法がわからないのですか?私のテスト環境で試したところ、何も役に立ちません。正しいdo_actionがファイルをインクルードするようなものだと理解できたら?そうでない場合は私に助言してください。

ありがとう。

14

anothertest()関数内の_100_関数はその関数に対してローカルであるため、_$regularprice_を出力しなかった理由。親mainplugin_test()関数で使用される変数_$regularprice_は、anothertest()関数で使用される変数とは異なります。これらは別のスコープにあります。

そのため、グローバルスコープで_$regularprice_を定義する必要があります(これはお勧めできません)。または引数をパラメーターとして _do_action_ref_array_ に渡すことができます。 _do_action_ref_array_は_do_action_と同じですが、2番目のパラメーターをパラメーターの配列として受け入れます。

引数として渡す:

_function mainplugin_test() {

    $regularprice = 50;

    // passing as argument as reference
    do_action_ref_array('testinghook', array(&$regularprice));

    echo $regularprice; //It should print 100

}

// passing variable by reference
function anothertest(&$regularprice) {
    if(class_exists('rs_dynamic')) {
        $regularprice = 100;
    }
}
// remain same
add_action('testinghook','anothertest');
_
5
Rahil Wazir

do_actionはアクションフックを作成し、add_actionフックが呼び出されると、フックされた関数を実行します。

たとえば、テーマのフッターに次を追加した場合:

do_action( 'my_footer_hook' );

Functions.phpまたはカスタムプラグインからその場所のコンテンツをエコーできます。

add_action( 'my_footer_hook', 'my_footer_echo' );
function my_footer_echo(){
    echo 'hello world';
}

変数をフックに渡すこともできます:

do_action( 'my_footer_hook', home_url( '/' ) );

コールバック関数で使用できるもの:

add_action( 'my_footer_hook', 'my_footer_echo', 10, 1 );
function my_footer_echo( $url ){
    echo "The home url is $url";
}

あなたの場合、おそらく条件に基づいて値をフィルタリングしようとしています。それがフィルターフックの目的です。

function mainplugin_test() {
    echo apply_filters( 'my_price_filter', 50 );
}

add_filter( 'my_price_filter', 'modify_price', 10, 1 );
function modify_price( $value ) {
    if( class_exists( 'rs_dynamic' ) )
        $value = 100;
    return $value;
}

参照

27
diggy

実際、add_actionはアクションフックで、アクションとdo_actionは、その登録済みアクションを手動で呼び出すために使用されます。例えば:

add_action('some_hook', 'handler_for_some_hook');

このハンドラは、取得するか、スクリプトがsome_actionただし、必要に応じて、do_action。したがって、基本的にはdo_actionを呼び出すと、登録済みアクションフックが呼び出されます。 Codex の詳細を確認してください。

2
The Alpha

// do_actionを使用して独自のtag(hook)を作成しますwordpress例:これを呼び出すカスタム関数を1つ追加しましたadd_actionで任意のカスタムタグ名で関数名を追加しましたタグ名)

function mywork()
{
    echo "display my name";
}

add_action('mytag','mywork');

do_action('mytag');

--- add_action()---

function()の影響を受けるフック固有のフック

 add_action( hook, **function**() )

wordpressの機能と動作を変更します。特定の「フック」により、それを変更でき、メソッドを変更できます。

0
Dhruv