Wordpress 如何在插件功能中使用 add_action

问题描述 投票:0回答:3

我需要在 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 中无法做到?

php wordpress woocommerce hook-woocommerce
3个回答
2
投票

不,你应该这样做。
您可以将动作挂钩添加到

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

0
投票

我可以使用会话来解决这个问题。我所做的是,如果我的

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

希望这对某人有帮助。


0
投票

使用瞬态而不是设置会话

set_transient('_wdm_my_key_value', '条件匹配', 30 * MINUTE_IN_SECONDS); // 瞬态持续 30 分钟

然后在下面的函数中使用如下:

if (get_transient('_wdm_my_key_value')) { //你的代码

// 使用完瞬态后将其删除 delete_transient('_wdm_my_key_value'); }

© www.soinside.com 2019 - 2024. All rights reserved.