【问题标题】:Set a custom cart item price value from a GET variable In Woocommerce 3在 Woocommerce 3 中从 GET 变量设置自定义购物车项目价格值
【发布时间】:2018-05-09 12:13:57
【问题描述】:

我的 Woocommerce 网站上有一个功能,可让客户根据我通过 URL 传递的值设置自定义金额以支付特定产品的费用。

我正在使用 woocommerce_before_calculate_totals 挂钩,直到我升级到 WC 3.3.5,它工作正常。现在,当我运行代码时,结帐最初会显示自定义金额。

但是,加载程序完成更新后,会将价格重置为“0”(即显示结帐页面的总字段为 0.00 英镑)。

代码如下:

add_action( 'woocommerce_before_calculate_totals', 'pay_custom_amount', 99);

function pay_custom_amount() {
    $payment_value = $_GET['amount'];

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        if($cart_item['data']->id == 21 ){
            $cart_item['data']->set_price($payment_value);
        }
    }
}

好吧,让我感到困惑。我已经在 Stack Overflow 上寻找解决方案,但看不到任何类似的问题。我看到钩子运行了多次,但认为这是正常的。

如果有人知道这里可能发生的事情,如果你能分享一下,那就太好了。

【问题讨论】:

    标签: php wordpress woocommerce get cart


    【解决方案1】:

    您无法从 URL 获取价格并将其设置在 woocommerce_before_calculate_totals 操作挂钩中。这需要以不同的方式进行。

    在下面的代码中:

    • 第一个挂钩函数将从 URl 获取该“金额”并将其设置(注册)到购物车项目对象中作为自定义数据。
    • 第二个挂钩函数将从自定义购物车商品数据中读取该金额并将其设置为新价格。

    现在您代码中的目标产品 ID 需要与添加到购物车产品的 ID 相同。

    代码:

    // Get the custom "amount" from URL and save it as custom data to the cart item
    add_filter( 'woocommerce_add_cart_item_data', 'add_pack_data_to_cart_item_data', 20, 2 );
    function add_pack_data_to_cart_item_data( $cart_item_data, $product_id ){
        if( ! isset($_GET['amount']) )
            return $cart_item_data;
    
        $amount = esc_attr( $_GET['amount'] );
        if( empty($amount) )
            return $cart_item_data;
    
        // Set the custom amount in cart object
        $cart_item_data['custom_price'] = (float) $amount;
        $cart_item_data['unique_key'] = md5( microtime() . rand() ); // Make each item unique
    
        return $cart_item_data;
    }
    
    // Alter conditionally cart item price based on product ID and custom registered "amount"
    add_action( 'woocommerce_before_calculate_totals', 'change_conditionally_cart_item_price', 30, 1 );
    function change_conditionally_cart_item_price( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // HERE set your targeted product ID
        $targeted_product_id = 21;
    
        foreach ( $cart->get_cart() as $cart_item ) {
            // Checking for the targeted product ID and the registered "amount" cart item custom data to set the new price
            if($cart_item['data']->get_id() == $targeted_product_id && isset($cart_item['custom_price']) )
                $cart_item['data']->set_price($cart_item['custom_price']);
        }
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

    【讨论】:

    • 很棒的东西,谢谢 Loic - 很有魅力。非常感谢您的帮助,并将研究您将来执行此类操作的方法。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2019-02-17
    • 2018-08-29
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多