【问题标题】:Set a custom calculated item price in Woocommerce mini-cart / Cart在 Woocommerce 迷你购物车/购物车中设置自定义计算项目价格
【发布时间】:2018-01-06 10:35:48
【问题描述】:

目前我根据不同情况对产品价格进行了一些自定义计算。当客户将产品添加到购物车时,自定义价格在会话数据中设置,cart_item_data['my-price'] 并且我使用add_filter( 'woocommerce_add_cart_item') 函数实现了,现在一切似乎都正常了。

现在查看购物车页面中的价格,结帐页面与我的cart_item_data['my-price']. 是正确的

但我面临的唯一问题是菜单中出现的 woocommerce 迷你购物车中的价格未更新,我该如何更改?

当我用谷歌搜索时,我看到了一个过滤器

add_filter('woocommerce_cart_item_price');

但我不明白如何使用它,我执行以下操作

    add_filter('woocommerce_cart_item_price','modify_cart_product_price',10,3);

function modify_cart_product_price( $price, $cart_item, $cart_item_key){
  if($cart_item['my-price']!==0){
      $price =$cart_item['my-price'];
    }
    return $price;
    //exit;
}

这里是individual price is getting correct,但是total price is wrong

【问题讨论】:

    标签: php wordpress woocommerce cart hook-woocommerce


    【解决方案1】:

    更新 (2021 年 10 月)

    为了成功测试(因为我不知道您是如何计算的),我在产品添加到购物车表单中添加了一个自定义隐藏字段,其中包含以下内容:

    // The hidden product custom field
    add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' );
    function add_gift_wrap_field() {
        global $product;
        // The fake calculated price
        ?>
            <input type="hidden" id="my-price" name="my-price" value="115">
        <?php
    }
    

    当产品被添加到购物车时,这个my-price 自定义字段也被提交(发布)。要在购物车对象中设置此值,我使用以下函数:

    add_filter( 'woocommerce_add_cart_item', 'custom_cart_item_prices', 20, 2 );
    function custom_cart_item_prices( $cart_item_data, $cart_item_key ) {
        // Get and set your price calculation
        if( isset( $_POST['my-price'] ) ){
            $cart_item_data['my-price'] = $_POST['my-price'];
    
            // Every add to cart action is set as a unique line item
            $cart_item_data['unique_key'] = md5( microtime().rand() );
        }
    
        return $cart_item_data;
    }
    

    现在将新的计算价格my-price 应用(设置)到购物车项目,我使用最后一个函数:

    // For mini cart *(cart item displayed price)*
    add_action( 'woocommerce_cart_item_price', 'filter_cart_item_price', 10, 2 );
    function filter_cart_item_price( $price, $cart_item ) {
        if ( ! is_checkout() && isset($cart_item['my-price']) ) {
            $args = array( 'price' => floatval( $cart_item['my-price'] ) );
    
            if ( WC()->cart->display_prices_including_tax() ) {
                $product_price = wc_get_price_including_tax( $cart_item['data'], $args );
            } else {
                $product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
            }
            return wc_price( $product_price );
        }
        return $price;
    }
    
    add_action( 'woocommerce_before_calculate_totals', 'set_calculated_cart_item_price', 20, 1 );
    function set_calculated_cart_item_price( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // Loop through cart items
        foreach ( $cart->get_cart() as $cart_item ){
            if( isset( $cart_item['my-price'] ) && ! empty( $cart_item['my-price'] ) || $cart_item['my-price'] != 0 ){
                // Set the calculated item price (if there is one)
                $cart_item['data']->set_price( $cart_item['my-price'] );
            }
        }
    }
    

    所有代码都在您的活动子主题(或活动主题)的 function.php 文件中。

    经过测试并且可以工作

    【讨论】:

    • +1 为您提供帮助。但我已经使用了这段代码,但由于某种原因这不起作用。 $cart_item['data']->set_price($cart_item['my-price']);不管用 。所以现在我使用 add_filter('woocommerce_cart_subtotal') 更新 mincart 中的价格,使用 add_action('woocommerce_review_order_before_order_total') 更新结帐页面中的价格。但不好的是,对于一些简单的作品,我必须使用很多钩子。现在我看到,当付款发送到贝宝时,它仍然采用旧价格而不是我的自定义价格。所以现在我必须使用其他钩子......
    • 您能否通过适当的检查更新您的答案
    • @abilasher 好的,我已经用一些代码和解释完成了我的答案……请尝试一下。
    • @musabaltaci 抱歉,由于$cart_item_data['unique_key'] = md5( microtime().rand() );,这可以使项目分开
    • @musabaltaci 单独的项目仅与具有自定义价格的项目相关,这些项目具有作为自定义购物车项目数据的唯一键。结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2018-08-29
    • 2019-12-21
    相关资源
    最近更新 更多