在由ADD_FILTER调用的函数中添加操作

时间:2017-03-01 作者:Kristoffer M

我正在尝试调用函数woocommerce_custom_surcharge. 我需要在过滤器中调用它woocommerce_checkout_fields, 如我所需$fields[\'billing\'][\'forhandler_kode\'] 在我的IF语句中,我不知道如何在过滤器之外使用它。此外,我还尝试了在函数外添加\\u操作,在那里效果很好。

正在调用我的echo,这意味着if语句返回true,所以这不是问题所在。出于某种原因,add_action 在我的职能范围内不起作用

add_filter( \'woocommerce_checkout_fields\' , \'call_my_add_action\' );
function call_my_add_action($fields) {


    if ($fields[\'billing\'][\'forhandler_kode\']) {
         add_action( \'woocommerce_cart_calculate_fees\',\'woocommerce_custom_surcharge\' );
         echo "I am being called";
     }



     return $fields;
}

function woocommerce_custom_surcharge() {
        global $woocommerce;

        if ( is_admin() && ! defined( \'DOING_AJAX\' ) ) {
            return;
        }

        $percentage = -0.1;
        $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;    
        $woocommerce->cart->add_fee( \'Forhandlerkode Rabat\', $surcharge, true, \'\' );
}
我的问题不是针对woocommerce的,因为它的解决方案有助于更全面地了解操作和过滤器。提前感谢您提供的任何帮助!

编辑:

可能是这个问题的一个有点老套的解决方案(我最终做了一些完全不同的事情,所以我不再有这个问题了,但有人可能会发现这一点,所以这里是这样的):

如果必须再次启动钩子,而不改变调用钩子的时间或使用jQuery,那么只需使用do_action

用上面的代码,我又一次上钩了,就像这样:

if ($fields[\'billing\'][\'forhandler_kode\']) {
     add_action( \'woocommerce_cart_calculate_fees\',\'woocommerce_custom_surcharge\' );
     do_action(\'woocommerce_cart_calculate_fees\');
     echo "I am being called";
 }

HOWEVER, PLEASE NOTE

这是可行的,但正如奥托指出的那样,这是一种愚蠢的做法。更好的解决方案是简单地调用如下函数:

if ($fields[\'billing\'][\'forhandler_kode\']) {
         woocommerce_custom_surcharge();
         echo "I am being called";
     }

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

当问题是关于挂钩时,答案总是要么:时机、优先级,要么两者兼而有之。

考虑以下代码:

add_action( \'shutdown\', \'wpse_258451_shutdown\' );
function wpse_258451_shutdown() {
  add_action( \'init\', \'wpse_258451_init\' );
}
function wpse_258451_init() {
  wp_die( \'I will never be called.\' );
}
显然,功能wpse_258451_init() 永远不会被呼叫。这是因为init 每个页面请求只触发一次,这非常接近请求的开头。进一步的shutdown 每个页面请求只触发一次,这非常接近请求的结尾。

我们的代码中到底发生了什么?WordPress获得第一个add_action() 并向shutdown hook标记添加回调。WordPress在最终到达请求的末尾并触发之前,会触发所有类型的钩子shutdown. 在默认优先级为10时,WordPress将尝试调用回调函数wpse_258451_shutdown().

内部wpse_258451_shutdown() 函数,我们添加另一个操作。这次到init 通过回调wpse_258451_init(). 这将添加到全局$wp_filter 很好。然而,因为我们已经过去了init 如果关闭请求,则此回调永远不会触发。

这与你的问题有什么关系

如果“我被召唤”被回应,但你的行为似乎没有被激发,那么只有两个可能的原因。

钩子已经触发,并且不会在此请求上再次触发钩子此请求根本没有触发钩子如何确定钩子的时间以下内容将响应请求期间触发的每个钩子(操作和筛选器)。

add_filter( \'all\', function( $a ) { 
  echo $a . "\\\\n";
  return $a; 
}, 10, 1 );
另一种选择是使用Query Monitor 作者:约翰·布莱克本。

相关推荐

Too many actions/filters!

这里是wordpress的新成员。动作/过滤器的概念本身并不难理解。令我不知所措的是大量可用的操作和过滤器。当我阅读教程/指南时,他们会说“只需将此功能添加到wp\\U head操作或after\\U setup\\u主题”。如果没有这些教程,我究竟如何知道将该函数与该操作挂钩?作为一个初学者,我怎么会知道什么是合适的操作?有没有关于如何导航的建议?谢谢