在Woocommerce中,我使用jQuery
在单个产品页面上计算自定义价格,现在需要将此值传递到购物车。
期望的行为是将从隐藏字段中获取的新价格传递到购物车项目价格。
这是我的实际代码:
// Hidden input field in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11, 0 );
function custom_hidden_product_field() {
echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="">';
}
// The code to pass this data to the cart:
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 ) {
if( ! empty( $_REQUEST['custom_price'] ) ) {
// Set the custom data in the cart item
$cart_item_data['custom_data']['custom_price'] = $_REQUEST['custom_price'];
$data = array( 'custom_price' => $_REQUEST['custom_price'] );
// 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;
}
并同时检查$data
和$cart_item_data
以确保它们都返回了在页面上计算出的custom_price
数据。
但是,我去查看购物车,但该订单项的值仍为0。
我将var
设置为等于WC()->session->set( 'custom_data', $data );
,然后设置var_dump
进行检查,但这返回了NULL
,可能只是它返回的内容,我不是完全可以肯定,因为我从未使用过它。
我还应该补充一点,我将产品后端中的regular_price
设置为0。擦除(并将其保留为空白)时,我得到了错误提示:
警告:在中遇到的非数字值 C:\ xampp \ htdocs \ my-transfer-source \ wp-content \ plugins \ woocommerce \ includes \ class-wc-discounts.php在第85行
我想知道我是否在这里错过了什么,是否有人可以对此有所帮助?谢谢
答案 0 :(得分:1)
首先出于测试目的,我们在隐藏的输入字段中添加一个价格,因为您没有提供计算价格的代码:
// Add a hidden input field (With a value of 20 for testing purpose)
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11 );
function custom_hidden_product_field() {
echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="20">'; // Price is 20 for testing
}
然后,您将使用以下内容更改购物车商品的价格( WC_Session
不需要)
// Save custom calculated price as custom cart item data
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 ) {
if( isset( $_POST['custom_price'] ) && ! empty( $_POST['custom_price'] ) ) {
// Set the custom data in the cart item
$cart_item_data['custom_price'] = (float) sanitize_text_field( $_POST['custom_price'] );
// Make each item as a unique separated cart item
$cart_item_data['unique_key'] = md5( microtime().rand() );
}
return $cart_item_data;
}
// Updating cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price', 30, 1 );
function change_cart_item_price( $cart ) {
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item ) {
// Set the new price
if( isset($cart_item['custom_price']) ){
$cart_item['data']->set_price($cart_item['custom_price']);
}
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。
相关:Woocommerce set_quantity crashes site when adding products to cart