我在我的单个产品页面中添加了一个自定义编号输入字段.常规价格乘以输入的整值. 例如,如果基本价格为10$,并且用户在自定义输入字段中输入2作为值,则新价格将变为20$.
更新价格效果良好,但当用户到达购物车并更新购物车内产品的数量时,价格将重新计算.例如,新计算出的价格为20$(上图示例),用户将购物车中的数量从1更改为5,则价格会再次由自定义整元字段重新计算,因此20$再次乘以2,现在是40$.
但我不明白为什么会发生这种事……
这是我当前的代码:
add_action( 'woocommerce_after_add_to_cart_quantity', 'add_custom_input_number_field', 0 );
function add_custom_input_number_field() {
echo '<div class="custom-input-number-field">';
echo '<label>' . __( 'Custom Input Number', 'woocommerce' ) . '</label>';
echo '<input type="number" required="true" placeholder="max. 30.500" class="custom-input-number" name="custom_input_number" min="1" step="0.001" />';
echo '</div>';
}
add_filter( 'woocommerce_get_price_html', 'update_product_price_based_on_custom_input_on_product_page', 9999, 2 );
function update_product_price_based_on_custom_input_on_product_page( $price, $product ) {
if ( is_product() && isset( $_POST['custom_input_number'] ) ) {
$custom_input_value = (float) $_POST['custom_input_number'];
$product_price = $product->get_price();
$new_price = $product_price * $custom_input_value;
$price = wc_price( $new_price ) . $product->get_price_suffix();
}
return $price;
}
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_input_number_field_data', 10, 2 );
function save_custom_input_number_field_data( $cart_item_data, $product_id ) {
if ( isset( $_POST['custom_input_number'] ) ) {
$cart_item_data['custom_input_number'] = wc_clean( $_POST['custom_input_number'] );
$cart_item_data['custom_input_number'] = (float) $cart_item_data['custom_input_number'];
}
return $cart_item_data;
}
add_action( 'woocommerce_before_calculate_totals', 'update_product_price_based_on_custom_input_in_cart', 10, 1 );
function update_product_price_based_on_custom_input_in_cart( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
if ( isset( $cart_item['custom_input_number'] ) ) {
$custom_input_value = $cart_item['custom_input_number'];
$product = $cart_item['data'];
$product_price = $product->get_price();
$new_price = $product_price * $custom_input_value;
$product->set_price( $new_price );
}
}
}
我try 了不同的方法.最好的是在添加一次价格后阻止Woo再次更新,但我也想对某些产品采用分层定价,所以这不是一个 Select .
我还try 了不同的挂钩(add_to_cart、woocommerce_before_calculate_targets等)