我正在建立一个woocommerce商店,出售古董地图,包括原始图和数字印刷品。因此,将地图设置为同一产品的两个变体:“原始”和“打印”。 “原始”只是原始的古董地图,但是“打印”具有大量选项,例如取景,安装和打印大小,这些选项由用户使用jquery在单产品页面中设置。
我已经成功地允许用户从单个产品页面的一系列选项中进行选择,从而根据他们选择的尺寸,数量,框架和安装选项来动态为其购买的产品生成价格。 / p>
这是使用jquery完成的,并且使用隐藏字段和自定义数据将选项(包括价格)传递到购物车,如下所示,其中isset($ _ REQUEST ['price'])表示jquery设置的隐藏价格字段(这些是框架,安装,尺寸等的负载,但这给出了一个主意:
if(isset($_REQUEST['price']) && ! empty( 'price' )) {
$order_item_price = sanitize_text_field($_REQUEST['price']);
$cart_item_data['custom_data']['order_price'] = array(
'label' => 'Total this item',
'value' => '£' . $order_item_price
);
}
...这很好。价格和总价(以及有关该产品的其他自定义信息)显示在购物车中,而总和则显示产品价格。我使用此功能来实现这一点:
function update_price_in_cart( $cart_obj ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
if( ! is_cart() ) {
return;
}
// Iterate through each cart item
foreach( $cart_obj->get_cart() as $item_key=>$cart_item ) {
if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
$price = $cart_item['total_price'] + $cart_item['total_price_original'];
$cart_item['data']->set_price( ( $price ) );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );
问题在于用户何时进行结帐。使用隐藏字段(框架类型,安装类型,尺寸,价格)创建的所有数据都显示在页面左侧,显示该位置的是产品,但所订购的每种产品旁边的右侧的总计均设置为该产品的原始价格在WordPress中的woocommerce产品中设置的变体“打印”。
我已经尝试过使用这种方法进行约会(以下是使用静态值的测试):
function update_price_in_checkout($cart_obj) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
var_dump($cart_item_data['custom_data']['order_price']);
if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
WC()->cart->total = 597;
} else {
WC()->cart->total = 1;
}
}
add_action( 'woocommerce_review_order_before_order_total', 'update_price_in_checkout' );
...但是这仅接受一个静态数字,因为它不选择隐藏字段和b。它不会影响结帐右侧的单个产品价格。
总而言之-我需要找到一种方法,用基于用户输入的总计计算得出的价格来替换右侧显示的基本变化产品价格。一切在购物车页面上都可以正常运行,但不会转移到结帐页面。
深入研究stackoverflow,我认为在woocommerce_checkout_create_order_line_item中进行设置可能是一个主意,但我不知道该怎么做。
有什么想法吗?
答案 0 :(得分:1)
以下代码将作为自定义添加到购物车项目数据中产品选择选项的价格(来自隐藏的产品字段),并将更新购物车项目价格:
// Get custom field value, calculate new item price, save it as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_field_data', 20, 3 );
function add_custom_field_data( $cart_item_data, $product_id, $variation_id ) {
if (isset($_REQUEST['price']) && !empty($_REQUEST['price'])) {
$cart_item_data['custom_price'] = sanitize_text_field($_REQUEST['price']);
$cart_item_data['unique_key'] = md5(microtime().rand());
}
return $cart_item_data;
}
// Update price
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );
function update_price_in_cart( $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 ) {
if( isset( $cart_item['custom_price'] ) ) {
// Add options to the product price
$cart_item['data']->set_price( $cart_item['data']->get_price() + $cart_item['custom_price'] );
}
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试和工作。