我已使用此代码为woocommerce产品添加额外费用https://sarkware.com/woocommerce-change-product-price-dynamically-while-adding-to-cart-without-using-plugins/
我的功能
g++-6 -I/usr/local/include program.cpp -o program -L /usr/local/lib -ltbb
第一个问题是所有额外费用加上两次(使用添加到购物车按钮时)。我刚刚通过将额外费用除以2来攻击这个。
之后的问题是,点击订单中的付款后,最终价格会发生变化 - 这是再次添加的额外费用的四分之一。
示例。原价500,用户选择增加1个额外人员的额外费用40。
添加到购物车时的计算是40 * 1/2 (由于某种原因,这是两次完成)
添加到购物车后是540,这是好的。
但是付款后(付款方式是银行/电汇)确认显示560作为明显是大问题的订单价格。
我将不胜感激任何帮助。
通过钩子添加其他人员的字段(基本上与教程中一样)。
function calculate_aditional_fees( $cart_object ) {
if( !WC()->session->__isset( "reload_checkout" ) ) {
$additional_price = get_option( 'additional_person_price' );
$additional_driver_price = get_option( 'additional_driver_price' );
foreach ( $cart_object->cart_contents as $key => $value ) {
if ( $additional_driver_price > 0 || $additional_price > 0 ) {
$additional_price *= $value['additional-persons'];
$additional_driver_price *= $value['additional-drivers'];
$cart_object->cart_contents[$key]['data']->price = floatval( $value['data']->price ) + $additional_driver_price + $additional_price;
}
}
}
}
在加载搜索后我将钩子更改为 woocommerce_cart_calculate_fees 删除了师。这里的问题是计算没问题,付款后但是在购物车表中小计和总计是错误的(没有添加值)。
我试图手动计算,所以函数看起来
add_action( 'woocommerce_before_add_to_cart_button', 'add_form_before_booking_product' );
function add_form_before_booking_product() {
global $post;
if( function_exists('get_product') ){
$product = get_product( $post->ID );
if( $product->is_type( 'booking' ) ){
echo '<table class="variations booking__variations"><tbody>
<tr>
<td class="label"><label for="additional-persons">'. __( 'Additional persons' ) .'</label></td>
<td class="value">
<input type="number" name="additional-persons" value="0" min="0" max=10 required />
</td>
</tr>
</tbody>
</table>';
}
}
}
删除评论时,总和和小计都可以,但是在付款后再次添加额外费用,所以我回到了同样的问题。
这可行,但......
它在购物车页面的小计下添加了另一行,计算还可以,还不是我正在寻找的解决方案(客户看不到每个产品的费用,但总计为一个)
function calculate_aditional_fees( $cart_object ) {
if( !WC()->session->__isset( "reload_checkout" )) {
$additional_price = get_option( 'additional_person_price' );
$additional_driver_price = get_option( 'additional_driver_price' );
foreach ( $cart_object->cart_contents as $key => $value ) {
if ( $additional_driver_price > 0 || $additional_price > 0 ) {
$additional_price = get_option( 'additional_person_price' );
$additional_driver_price = get_option( 'additional_driver_price' );
$additional_price = floatval( $additional_price ) * intval( $value['additional-persons'] );
$additional_driver_price = floatval( $additional_driver_price ) * intval( $value['additional-drivers'] );
$sum =( $additional_driver_price + $additional_price ) * WC()->cart->cart_contents[$key]['quantity'];
$sum2 =( $additional_driver_price + $additional_price );
WC()->cart->cart_contents[$key]['data']->price = floatval( $value['data']->price ) + $sum2;
// $additional_sum = $sum / 1.23;
// $additional_tax = $sum-$additional_sum;
// if (!is_checkout()) {
// WC()->cart->cart_contents[$key]['line_total'] += $additional_sum;
// WC()->cart->cart_contents_total += $additional_sum;
// WC()->cart->subtotal += $sum;
// WC()->cart->subtotal_ex_tax += $additional_sum;
// WC()->cart->taxes[1] += $additional_tax;
// }
// WC()->cart->add_fee('Dodtkowe opcje',($additional_driver_price + $additional_price)*WC()->cart->cart_contents[$key]['quantity']);
}
}
}
}
add_action( 'woocommerce_cart_calculate_fees', 'calculate_aditional_fees');