【问题标题】:How do do_action and add_action work?do_action 和 add_action 是如何工作的?
【发布时间】:2015-01-03 02:24:39
【问题描述】:

我正在尝试找出 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 更像是包含一个文件???如果没有,请告诉我。

谢谢。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    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;
    }
    

    参考

    编辑(更新参考链接)

    【讨论】:

    • 感谢您的回复 :) 从我的情况来看,它更像是 do_action 钩子在函数内部,所以请您帮我从上面的代码中制定一个可行的解决方案
    • 嗨@diggy 我试过你的过滤器代码看起来它正在工作,是在过滤器中使用该功能而不是操作的唯一方法吗?
    • 如果您尝试修改返回值,过滤器是最好的选择。动作钩子通常用于打印/插入内容,或执行功能。
    • 不是反过来吗? “do_action 创建一个动作挂钩,add_action 执行挂钩...”这与您链接的页面相矛盾。
    • 我同意@akinuri。 do_action 听起来更像是执行钩子,而 add_action 创建钩子
    【解决方案2】:

    //使用 do_action 我们创建自己的标签(钩子)在 wordpress 中使用 前任。在这里,我添加了 1 个自定义函数来调用它 在 add_action 我添加了带有任何自定义标签名称的函数名称 使用 do_action(我的自定义标签名称)

    function mywork()
    {
        echo "display my name";
    }
    
    add_action('mytag','mywork');
    
    do_action('mytag');
    

    ---add_action()---

    函数()

    影响的特定钩子
     add_action( hook, **function**() )
    

    它将通过特定的“钩子”改变wordpress的功能和行为,我们可以改变它和函数方法。

    【讨论】:

      【解决方案3】:

      它没有打印100 的原因是$regularpriceanothertest() 函数中是该函数的本地函数。父mainplugin_test()函数中使用的变量$regularpriceanothertest()函数中使用的变量不同,它们在不同的范围内。

      因此您需要在全局范围内定义$regularprice(这不是一个好主意),或者您可以将参数作为参数传递给do_action_ref_arraydo_action_ref_arraydo_action 相同,但它接受第二个参数作为参数数组。

      作为参数传递:

      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');
      

      【讨论】:

      • 谢谢@Rahil,我试过那个代码仍然打印 50 你知道它为什么不工作的原因吗?
      • 谢谢它很好用。我认为我可以通过使用 do_action 本身来完成,我没有通过 do_action_ref_array 再次感谢。
      【解决方案4】:

      实际上,add_action 是一个动作挂钩,用于根据动作在某个点上调用动作(注册的处理程序),do_action 用于手动调用该注册的动作。例如:

      add_action('some_hook', 'handler_for_some_hook');
      

      当您采取或脚本执行some_action 时将调用此处理程序,但如果您愿意,您可以使用do_action 手动调用该操作。因此,基本上do_action 在您调用它时会调用已注册的操作挂钩。在Codex 上查看更多信息。

      【讨论】:

      • 您好,感谢您的回复,但我的情况是您发现我使用 do_action 调用该操作有什么错误吗?
      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多