WooCommerce价格压倒不起作用

时间:2017-07-26 15:29:37

标签: php wordpress woocommerce cart price

我使用woocommerce_before_add_to_cart_button hook

设置了一个隐藏的输入项
function add_gift_wrap_field() {
    ?>`<input type="hidden" id="price_val" name="added_price" value="100.34">`<?php
}
add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' );

针对产品保存字段:

function save_gift_wrap_fee( $cart_item_data, $product_id ) {

    if( isset( $_POST['added_price'] ) ) {

        $cart_item_data = array();

        $cart_item_data[ "gift_wrap_fee" ] = "YES"; 
        $cart_item_data[ "gift_wrap_price" ] = 100;     
    }
    return $cart_item_data;

}
add_filter( 'woocommerce_add_cart_item_data', 'save_gift_wrap_fee', 99, 2 );

现在我可以在$_POST['added_price']挂钩中回显woocommerce_before_calculate_totals

我写的代码如下所示:

function calculate_gift_wrap_fee( $cart_object ) {
    if( !WC()->session->__isset( "reload_checkout" )) {
        /* Gift wrap price */
        $additionalPrice = number_format($_POST['added_price'], 2); 

        $additionalPrice = floatval($additionalPrice);
        //echo $additionalPrice; exit(); shows the value
        foreach ( $cart_object->cart_contents as $key => $value ) {
            if( isset( $value["gift_wrap_fee"] ) ) {
                    /* Woocommerce 3.0 + */
                    $orgPrice = floatval( $value['data']->get_price() );
                    $value['data']->set_price( $orgPrice + $additionalPrice );    //not adding the $additionalPrice here.     
            }
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 99 );

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

以下是基于您的代码问题的完整清洁,经过测试和运行的解决方案。

我已将自定义字段value / calculate_gift_wrap_fee()包含在相关购物车项目的购物车对象中,而不是在 'gift_wrap_fee' 功能。

这样就无法取消自定义字段值,新的价格计算也是可靠的。

我评论了'gift_wrap_price'// The hidden product custom field add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); function add_gift_wrap_field() { ?> <input type="hidden" id="price_val" name="added_price" value="100.34"> <?php } // Adding the custom field to as custom data for this cart item in the cart object add_filter( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 ); function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) { $bool = false; $data = array(); if( ! empty( $_REQUEST['added_price'] ) ) { $cart_item_data['custom_data']['added_price'] = $_REQUEST['added_price']; // Below this 2 values are not really needed (I think) // (You can uncomment them if needed) ## $cart_item_data['custom_data']['gift_wrap_fee'] = 'YES'; ## $cart_item_data['custom_data']['gift_wrap_price'] = 100; // below statement make sure every add to cart action as unique line item $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() ); WC()->session->set( 'custom_data', $data ); } return $cart_item_data; } // Changing the cart item price based on custom field calculation add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 10, 1 ); function calculate_gift_wrap_fee( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; // Iterating though cart items foreach ( $cart->get_cart() as $cart_item ) { // Continue if we get the custom data for the current cart item if( ! empty( $cart_item['custom_data'] ) ){ // Get the custom field "added price" value $added_price = number_format( $cart_item['custom_data']['added_price'], 2 ); // The WC_Product object $product = $cart_item['data']; // Get the price (WooCommerce versions 2.5.x to 3+) $product_price = method_exists( $product, 'get_price' ) ? floatval(product->get_price()) : floatval($product->price); // New price calculation $new_price = $product_price + $added_price; // Set the calculeted price (WooCommerce versions 2.5.x to 3+) method_exists( $product, 'set_price' ) ? $product->set_price( $new_price ) : $product->price = $new_price; } } } ,因为现在并不需要它们(但如果您愿意,可以取消注释)。

以下是此代码:

req.body

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

此代码已经过测试,适用于从2.5.x到3 +的WooCommerce版本。