在我们的Woocommerce商店,我们有任何产品的最低价格。在每个产品内页中都有两个字段,客户可以在其中键入产品的宽度,高度。然后他们可以将此产品添加到购物车,然后根据给定的宽度和高度更改价格。
例如,如果产品的最低价格 50 。并且客户添加 width = 2,height = 3 ,然后此产品的价格将 50 * 2 * 3 = 300
因此,为了安排此操作,我们将此代码添加到function.php
add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $cart_item_key ) {
$result=$_POST['width']*$_POST['height']*$cart_item_data['data']->price;
$cart_item_data['new-price'] =$result;
$cart_item_data['data']->set_price($result);
return $cart_item_data;
}
所以这是正常的。
但问题是,一旦它进入结帐页面,那么产品价格显示为50,但实际上是300。
所以为了克服这一点,我使用以下代码
add_filter( 'woocommerce_cart_item_subtotal', 'update_with_custom_details', 10, 3 );
function update_with_custom_details( $subtotal, $cart_item, $cart_item_key ) {
$subtotal =" £".$cart_item['line_total'];
return $subtotal;
}
现在显示300英镑,但我知道这段代码是错误的。
代码错误,因为当客户为此产品申请50%的优惠券代码时,折扣将为25,因为它基于50*.5=25;
进行计算但实际上产品新价格是300,所以折扣应该是300*5=150;
那么如何在购物车页面,结帐页面,迷你购物车等中更新产品价格?
请帮忙。
请同时查看 Woocommerce product custom price is not accepted by wocommerce coupon
答案 0 :(得分:2)
更新2:正确的方法需要分两步完成:
woocommerce_before_calculate_totals
hook 代码:
// Save custom field value in cart item as custom data
add_filter( 'woocommerce_add_cart_item_data', 'calculate_custom_cart_item_prices', 30, 3 );
function calculate_custom_cart_item_prices( $cart_item_data, $product_id, $variation_id ) {
if ( isset($_POST['width']) && isset($_POST['height']) ) {
// Get the correct Id to be used (compatible with product variations)
$the_id = $variation_id > 0 ? $variation_id : $product_id;
$product = wc_get_product( $the_id ); // Get the WC_Product object
$product_price = (float) $product->get_price(); // Get the product price
// Get the posted data
$width = (float) sanitize_text_field( $_POST['width'] );
$height = (float) sanitize_text_field( $_POST['height'] );
$new_price = $width * $height * $product_price; // Calculated price
$cart_item_data['calculated-price'] = $new_price; // Save this price as custom data
}
return $cart_item_data;
}
// Set custom calculated price in cart item 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( ! empty( $cart_item['calculated-price'] ) ){
// Set the calculated item price (if there is one)
$cart_item['data']->set_price( $cart_item['calculated-price'] );
}
}
}
代码进入活动子主题(或主题)的function.php文件。经过测试和工作。
对于测试用途,我使用了以下代码在单个产品页面上输出2个自定义字段:
// 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
?>
<div>
<label class="product-custom-text-label" for="servicetime"><?php _e( 'Custom text:', 'woocommerce'); ?><br>
<input type="text" id="user-width" name="width" value=""><br>
<input type="text" id="user-height" name="height" value="">
</label>
</div><br>
<?php
}