WooCommerce价格中重写不工作
问题描述:
我已经建立了使用woocommerce_before_add_to_cart_button
钩一个隐藏的输入项WooCommerce价格中重写不工作
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);
什么我错在这里做什么?
答
这是基于您的代码问题的完整清洁,测试和工作解决方案。
在这里,我已经包括您的自定义字段中的相关车项目的车对象key
/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_action('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_object) {
if (is_admin() && ! defined('DOING_AJAX'))
return;
// Iterating though cart items
foreach ($cart_object->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
$wc_product = $cart_item['data'];
// Get the price (WooCommerce versions 2.5.x to 3+)
$product_price = method_exists($wc_product, 'get_price') ? floatval($wc_product->get_price()) : floatval($wc_product->price);
// New price calculation
$new_price = $product_price + $added_price;
// Set the calculeted price (WooCommerce versions 2.5.x to 3+)
method_exists($wc_product, 'set_price') ? $wc_product->set_price($new_price) : $wc_product->price = $new_price;
}
}
}
代码放在您的活动子主题(或主题)的function.php文件或也以任何插件文件。
此代码已经过测试,适用于从2.5.x到3+的WooCommerce版本。
我刚刚加入:) –
谢谢:) ...为什么你不添加到购物车对象''added_price''在同一时间? – LoicTheAztec
试过但实际上没有工作 –