提问者:小点点

在WooCommerce 3中更改购物车项目价格


我正在尝试使用以下功能更改购物车中的产品价格:

    add_action( 'woocommerce_before_shipping_calculator', 'add_custom_price' 
     );
      function add_custom_price( $cart_object ) {
         foreach ( $cart_object->cart_contents as $key => $value ) {
         $value['data']->price = 400;
        } 
     }

它在WooCommerce 2.6版中正常工作。但在3.0版中不再工作

如何使其在WooCommerce 3.0版中工作?

谢谢


共2个答案

匿名用户

更新2021(处理迷你车自定义项目价格)

使用WooCommerce 3.0版本,您需要:

  • 改为使用woocommerce_before_calculate_totals钩子。
  • 改为使用WC_Cartget_cart()方法
  • 改为使用WC_productset_price()方法

代码如下:

// Set custom cart item price
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);
function add_custom_price( $cart ) {
    // This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetition (when using price calculations for example | optional)
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        $cart_item['data']->set_price( 40 );
    }
}

对于迷你购物车(更新):

// Mini cart: Display custom price 
add_filter( 'woocommerce_cart_item_price', 'filter_cart_item_price', 10, 3 );
function filter_cart_item_price( $price_html, $cart_item, $cart_item_key ) {

    if( isset( $cart_item['custom_price'] ) ) {
        $args = array( 'price' => 40 );

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

代码进入函数。活动子主题(或活动主题)的php文件。

这段代码已经过测试并运行正常(在WooCommerce 5.1.x上仍然有效)。

注意:当使用一些特定插件或其他定制时,可以将钩子优先级从20增加到1000(甚至2000)。

相关:

  • 从Woocommerce 3中的隐藏输入字段自定义价格设置购物车项目价格
  • 根据Woocommerce中的自定义购物车项目数据更改购物车项目价格
  • 在单一产品页面上有条件地设置特定产品价格

匿名用户

使用WooCommerce 3.2版。6,@LoicTheAztec的答案对我来说很有用,如果我将优先级增加到1000。

add_操作('woocommerce_-before_-calculate_-total','add_-custom_-price',1000,1)

我尝试了1099999的优先级值,但是我的购物车中的价格和总数没有改变(即使我能够用get_price()确认set_price()>实际上设定了项目的价格。

我有一个自定义的钩子,可以为我的购物车增加费用,我正在使用一个添加产品属性的第三方插件。我怀疑这些WooCommerce“附加组件”引入了延迟,需要我延迟自定义操作。