我找到了添加现有产品的代码:
global $woocommerce;
$woocommerce->cart->add_to_cart(16);
但我需要添加产品,价格由2个输入决定:
我按公式年龄*质量计算产品价格。
我知道可以添加带有变化的产品,但它有很多可能的变化。
是否可以根据自定义字段计算值动态设置产品价格?
由于
答案 0 :(得分:2)
对于购物车项目(将产品添加到购物车时),可以根据产品自定义字段值设置自定义动态计算价格。
1)首先,我们在单个产品页面中添加您的2个自定义字段(此处为常规 text input
字段和 select
字段 "Age"
和 "Quality"
:
// Add product custom fields inside the product add-to-cart form
add_action('woocommerce_before_add_to_cart_button', 'custom_data_hidden_fields');
function custom_data_hidden_fields() {
echo '<div class="imput_fields custom-imput-fields">
<label class="age_prod">Age: <br><input type="text" id="age_prod" name="age_prod" value="" /></label>
<label class="quality_prod">Quality: <br>
<select name="quality_prod" id="quality_prod">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</label>
</div><br>';
}
2)当产品是添加到购物车时,我们使用添加的购物车项目保存这些自定义的发布数据值:
// Save product custom fields values after submission into the cart item data
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_data_hidden_fields', 10, 2 );
function save_custom_data_hidden_fields( $cart_item_data, $product_id ) {
$data = array();
if( isset( $_REQUEST['age_prod'] ) ) {
$cart_item_data['custom_data']['age'] = $_REQUEST['age_prod'];
}
if( isset( $_REQUEST['quality_prod'] ) ) {
$cart_item_data['custom_data']['quality'] = $_REQUEST['quality_prod'];
}
// below statement make sure every add to cart action as unique line item
$cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
return $cart_item_data;
}
3)最后,在最后一步中,您将从购物车中获取所有必要的数据以进行自己的计算,并动态更新每个购物车项目的价格。
我做了一个临时计算,只是为了表明代码按预期工作。
此处在下面的代码中,您必须自定义计算以满足您的需求(因为您未在问题中提供任何详细信息)。
正如您将在下面看到的,这是一个简单的步骤来进行自己的计算,因为您获得每个购物车项目的自定义字段值以及产品的原始价格。
以下是根据您的自定义字段值进行动态计算的代码:
// Replace the item price by your custom calculation
add_action( 'woocommerce_before_calculate_totals', 'add_custom_item_price', 10 );
function add_custom_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ) {
// Product ID
$product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id();
// Product original price
$original_price = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->price : $cart_item['data']->get_price();
$original_price = $item_values['data']->price;
## --- Get your custom cart item data --- ##
if( isset($cart_item['custom_data']['age']) )
$age = $cart_item['custom_data']['age'];
if( isset($cart_item['custom_data']['quality']) )
$quality = $cart_item['custom_data']['quality'];
// CALCULATION FOR EACH ITEM:
## Make HERE your own calculation to feet your needs <== <== <== <==
$new_price = $original_price + ( ($age * 0.1) + $quality );
## Set the new item price in cart
if( version_compare( WC_VERSION, '3.0', '<' ) )
$cart_item['data']->price = $new_price;
else
$cart_item['data']->set_price($new_price);
}
}
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
代码经过测试并且运行良好。
在单个产品页面显示定价:
Read this to understand how override the WoocCommerce templates via your theme
为此,您需要修改模板
当客户在您的产品自定义字段中设置一些值时,single-product/price.php
。您需要在此单个产品页面中添加一些javascript / jQuery 以更新产品价格。
但这是另一个问题。
相关答案:WooCommerce - Adding a custom price to each product in cart