我需要在 AJAX 响应函数中执行/调用
woocommerce_cart_calculate_fees
操作,如下所示,
要求是在购物车中添加一定条件下的折扣。
add_action( 'wp_ajax_tcf_et_add_estimate_to_cart', 'my_function' );
my_function()
{
// ADD SOME PRODUCTS TO THE CART
if( certain condition )
{
add_action( 'woocommerce_cart_calculate_fees', 'add_discount', 1, 1 );
function add_discount( $cart )
{
global $woocommerce;
$cart->add_fee( 'Discount' , -100 );
return $cart;
}
}
// some code
}
我知道这是完全错误的,但正在寻求一种以 WordPress 方式做到这一点的方法吗?就像将
woocommerce_cart_calculate_fees
写在 my_function
之外,并在需要时调用它。
是否有任何技巧或技术可以执行此操作,否则在 Wordpress 中无法做到?
不,你应该这样做。
您可以将动作挂钩添加到
woocommerce_cart_calculate_fees
,如下所示:
add_action( 'woocommerce_cart_calculate_fees', 'add_discount', 1, 1 );
function add_discount( $cart )
{
if ( certain condition )
{
$cart->add_fee( 'Discount' , -100 );
}
}
if
语句就在里面。
对于 ajax 请求,它是相同的,但这次你没有
$cart
变量,而是使用 WC()->cart
。
add_action( 'wp_ajax_tcf_et_add_estimate_to_cart', 'my_function' );
function my_function()
{
if ( certain condition )
{
WC()->cart->add_fee( 'Discount' , -100 );
}
}
我可以使用会话来解决这个问题。我所做的是,如果我的
certain condition
为 true,则向会话添加一个键值,然后在 woocommerce_cart_calculate_fees
中检查会话是否有,然后将折扣添加到购物车。
add_action( 'wp_ajax_tcf_et_add_estimate_to_cart', 'my_function' );
function my_function()
{
if ( certain condition )
{
session_start();
$_SESSION['_my_key_value'] = 'certain condition is true';
}
}
在
add_discount
功能中,我们检查会话并向购物车添加折扣。
add_action( 'woocommerce_cart_calculate_fees', 'add_discount', 1, 1 );
function add_discount( $cart )
{
if ( isset( $_SESSION['_my_key_value'] ) )
{
$cart->add_fee( 'Discount' , -100 );
// it is important to remove data from session once it is used
unset( $_SESSION['_my_key_value'] );
}
return $cart;
}
希望这对某人有帮助。
使用瞬态而不是设置会话
set_transient('_wdm_my_key_value', '条件匹配', 30 * MINUTE_IN_SECONDS); // 瞬态持续 30 分钟
然后在下面的函数中使用如下:
if (get_transient('_wdm_my_key_value')) { //你的代码
// 使用完瞬态后将其删除 delete_transient('_wdm_my_key_value'); }