根据Woocommerce中的自定义汇率更改产品价格

时间:2018-12-22 17:06:21

标签: php wordpress woocommerce cart price

在Woocommerce中,我使用woocommerce_product_get_price来更改我的产品价格,并且效果很好……但是,当我向购物车中添加产品时,购物车总数和购物车项均为零。

那是我的代码:

add_filter( 'woocommerce_add_cart_item', 'set_custom_cart_item_prices', 20, 2 ); 
function set_custom_cart_item_prices( $cart_data, $cart_item_key ) {
    $new_price = $cart_data['data']->get_price() * 2;
    $cart_data['data']->set_price( $new_price );
    $cart_data['new_price'] = $new_price;
    return $cart_data;
}

add_filter( 'woocommerce_get_cart_item_from_session', 'set_custom_cart_item_prices_from_session', 20, 3 );
function set_custom_cart_item_prices_from_session( $session_data, $values, $key ) {
    if ( ! isset( $session_data['new_price'] ) || empty ( $session_data['new_price'] ) )
        return $session_data;

    $session_data['data']->set_price( $session_data['new_price'] );

    return $session_data;
}

它不起作用。我也曾尝试使用woocommerce_before_calculate_totals失败

如何避免购物车零价格?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

已更新:您没有使用正确的挂钩和正确的方式。以下内容将替换您的所有代码。价格变化将在简单产品,可变产品和产品变化上进行。

第一个功能是应用于产品价格的价格(因此您将在其中定义价格计算)

第二个功能将更改所有产品页面上所有产品的显示价格,而不是使用挂在woocommerce_product_get_price过滤器挂钩中的自定义功能。

第三个功能将同时更改购物车商品,购物车和结帐页面以及订单商品中的产品价格。

// The price rate to be applied
function get_product_price_rate() {
    // HERE define the price rate to be applied
    return 1.25; // +25%
}

// Change the product displayed price on product pages
add_filter( 'woocommerce_get_price_html', 'custom_price_html', 10, 2 );
function custom_price_html( $price, $product ){
    $rate = get_product_price_rate();

    // Simple products and product variations
    if( in_array( $product->get_type() , array(  'simple' , 'variation' ) ) ) {
        $regular_price = wc_get_price_to_display( $product, array( 'price' => ( $product->get_regular_price() * $rate ) ) );
        $active_price  = wc_get_price_to_display( $product, array( 'price' => ( $product->get_price() * $rate ) ) );

        if ( '' === $product->get_price() ) {
            $price = apply_filters( 'woocommerce_empty_price_html', '', $product );
        } elseif ( $product->is_on_sale() ) {
            $price = wc_format_sale_price( $regular_price, $active_price ) . $product->get_price_suffix();
        } else {
            $price = wc_price( $active_price ) . $product->get_price_suffix();
        }
    }
    // Variable products
    elseif ( 'variable' === $product->get_type() ) {
        $prices = $product->get_variation_prices( true );

        if ( empty( $prices['price'] ) ) {
            $price = apply_filters( 'woocommerce_variable_empty_price_html', '', $this );
        } else {
            $min_price     = current( $prices['price'] ) * $rate;
            $max_price     = end( $prices['price'] ) * $rate;
            $min_reg_price = current( $prices['regular_price'] ) * $rate;
            $max_reg_price = end( $prices['regular_price'] ) * $rate;

            if ( $min_price !== $max_price ) {
                $price = wc_format_price_range( $min_price, $max_price );
            } elseif ( $this->is_on_sale() && $min_reg_price === $max_reg_price ) {
                $price = wc_format_sale_price( wc_price( $max_reg_price ), wc_price( $min_price ) );
            } else {
                $price = wc_price( $min_price );
            }
            $price .= $product->get_price_suffix();
        }
    }
    return $price;
}

// Change cart items prices (and order items prices)
add_action('woocommerce_before_calculate_totals', 'increase_cart_item_prices', 100, 1 );
function increase_cart_item_prices( $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 ) {
        $rate = get_product_price_rate();
        $cart_item['data']->set_price( $cart_item['data']->get_price() * $rate );
    }
}

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