向传递到购物车的 WooCommerce 产品变体添加费用

Adding a fee to WooCommerce product variation passed to cart

提问人:PatInParis 提问时间:11/17/2023 最后编辑:LoicTheAztecPatInParis 更新时间:11/17/2023 访问量:42

问:

当我将产品添加到购物车时,我试图为产品添加费用(20 美元)。

当产品是简单产品时,我的函数有效。但当它是变体产品时,则不然。我尝试了以下代码,该代码在第 6 行抛出 eval() 的代码错误:

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 3 );
function add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {    
    $product_simple = wc_get_product( $product_id );
    $product_var = wc_get_product( $variation_id ); 
    $price_simple = $product_simple->get_price();
    $price_var = $product_var->get_price(); 

    if ( $price_simple !== $price_var ) {
        $price = $price_var;
    } else {
        $price = $price_simple;
    }   
    if( ! empty( $_POST['custom_text_add_on'] ) ) {
        $cart_item_data['new_price'] = $price + 20;
    }
    return $cart_item_data;
}
钩子-WooCommerce 购物车 价格 产品-变化

评论

0赞 PatInParis 11/17/2023
谢谢Loic阿兹特克人!您的代码非常适合可变产品。但我的问题没有解决:费用可以添加到简单的产品或可变产品中。唉,您的代码没有涵盖简单的产品案例。因此,我有在将简单产品添加到购物车时起作用的代码。多亏了你,我也有代码,当将可变产品添加到购物车时,这些代码可以工作。但不是在这两种情况下都有效的代码!
0赞 PatInParis 11/17/2023
对不起,我真傻。我只是在您的代码顶部添加了一个带有函数“define_simple_price_with_fee”的过滤器,这是您的代码的精确副本,但使用 $product_id 而不是 $variation_id,它有效!我本来以为连续两个“return $cart_item_data;”会发生冲突,但它们返回了正确的值!再次感谢LoicTheAztec,爆米花来了;-)
0赞 LoicTheAztec 12/2/2023
如果你想通知我,你应该在我的答案下面发表评论......请参阅:当有人回答我的问题时,我该怎么办?

答:

0赞 LoicTheAztec 11/17/2023 #1

您的代码中存在一些错误,并且缺少一些功能...要为购物车中的每个产品变体添加费用,请尝试以下操作:

// Define variation price with fee
add_filter( 'woocommerce_add_cart_item_data', 'define_variation_price_with_fee', 10, 3 );
function define_variation_price_with_fee( $cart_item_data, $product_id, $variation_id ) {   
    // Only for product variations
    if ( $variation_id > 0 ) {
        // Define the fee amount to be added
        $variation_fee = 20; 
        // Get an instance of the product variation object
        $variation     = wc_get_product( $variation_id ); 
        // Add price with fee as custom cart item data
        $cart_item_data['price_with_fee'] = $variation->get_price() + $variation_fee;
    }
    return $cart_item_data;
}


// Display variation price with fee html (cart, mini-cart and checkout)
add_filter( 'woocommerce_cart_item_price', 'display_variation_price_with_fee', 10, 2 );
function display_variation_price_with_fee($price, $cart_item) {
    // Check item for the price with fee
    if ( isset($cart_item['price_with_fee']) ) {
        // Set the price with fee in arguments
        $args = array('price' => floatval($cart_item['price_with_fee']));

        if ('incl' === get_option('woocommerce_tax_display_cart')) {
            $product_price = wc_get_price_including_tax($cart_item['data'], $args);
        } else {
            $product_price = wc_get_price_excluding_tax($cart_item['data'], $args);
        }
        return wc_price($product_price);
    }
    return $price;
}

// Set variation price with fee (when order is submitted)
add_action( 'woocommerce_before_calculate_totals' , 'set_variation_price_with_fee' );
function set_variation_price_with_fee( $cart ) { 
    if ( is_admin() && !defined('DOING_AJAX') )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        // Check items for the price with fee
        if ( isset($item['price_with_fee']) ) {
            // Set the price with fee
            $item['data']->set_price($item['price_with_fee']);
        }
    }
}

代码位于子主题的函数.php文件中(或插件中)。它应该起作用。