我正在尝试调用函数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";
}
最合适的回答,由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 作者:约翰·布莱克本。