Woocommerce 在购物车和结账时使用自定义值覆盖产品价格

Posted

技术标签:

【中文标题】Woocommerce 在购物车和结账时使用自定义值覆盖产品价格【英文标题】:Woocommerce override Product Price with custom value on cart and checkout 【发布时间】:2017-11-06 09:32:31 【问题描述】:

我想知道是否有人对以下场景有一些经验。

我正在使用 WooCommerce 列出我的产品,准备出售。有些产品(大约 20 种)有大量的变化,所以我决定将产品数据放在单独的表中,并通过 SKU(获取数据的简单查询)将它们加载到 woocommerce 中。到目前为止,一切都很好。这些产品运行良好。它们的变体正在显示,用户可以选择它们,将它们添加到购物车。

问题是,我已经将这 20 种产品设置为单一产品,并给它们 1 美元的价格,只是为了显示添加到购物车按钮 (.single_add_to_cart_button),但是当我选择我的变体时(从外部表格/表格中)产品被很好地添加到购物车中,但在这种情况下,它显示每个产品的价格为 1 美元,包括所有自定义字段(这很好)。据我所知,这些自定义字段来自会话)。下面是我在functions.php中使用的所有代码(不是我的,在网上找到的,已修复它以适用于我的案例)

// 第 1 步:在自定义会话中添加数据,点击“添加到购物车”按钮 add_action('wp_ajax_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback'); add_action('wp_ajax_nopriv_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback'); 函数 wdm_add_user_custom_data_options_callback() $product_id = $_POST['id']; $product_category = $_POST['product_category']; $custom_data_1 = $_POST['custom_data_1']; $custom_data_2 = $_POST['custom_data_2']; $custom_data_3 = $_POST['custom_data_3']; $custom_data_4 = $_POST['custom_data_4']; $custom_data_5 = $_POST['custom_data_5']; session_start(); $_SESSION['custom_data_1'] = $custom_data_1; $_SESSION['custom_data_2'] = $custom_data_2; $_SESSION['custom_data_3'] = $custom_data_3; $_SESSION['custom_data_4'] = $custom_data_4; $_SESSION['custom_data_5'] = $custom_data_5; 死(); // 第 2 步:在 WooCommerce 会话中添加自定义数据 add_filter('woocommerce_add_cart_item_data','wdm_add_item_data',1,2); if(!function_exists('wdm_add_item_data')) 函数 wdm_add_item_data($cart_item_data,$product_id) 全球$woocommerce; session_start(); $new_value = 数组(); 如果(isset($_SESSION['custom_data_1'])) $option1 = $_SESSION['custom_data_1']; $new_value['custom_data_1'] = $option1; 如果(isset($_SESSION['custom_data_2'])) $option2 = $_SESSION['custom_data_2']; $new_value['custom_data_2'] = $option2; 如果(isset($_SESSION['custom_data_3'])) $option3 = $_SESSION['custom_data_3']; $new_value['custom_data_3'] = $option3; if (isset($_SESSION['custom_data_4'])) $option4 = $_SESSION['custom_data_4']; $new_value['custom_data_4'] = $option4; if (isset($_SESSION['custom_data_5'])) $option5 = $_SESSION['custom_data_5']; $new_value['custom_data_5'] = $option5; if( 空($option1) && 空($option2) && 空($option3) && 空($option4) && 空($option5) ) 返回 $cart_item_data; 别的 如果(空($cart_item_data)) 返回 $new_value; 别的 返回 array_merge($cart_item_data,$new_value); 未设置($_SESSION['custom_data_1']); 未设置($_SESSION['custom_data_2']); 未设置($_SESSION['custom_data_3']); 未设置($_SESSION['custom_data_4']); 未设置($_SESSION['custom_data_5']); // 第 3 步:从 WooCommerce 会话中提取自定义数据并将其插入到购物车对象中 add_filter('woocommerce_get_cart_item_from_session', 'wdm_get_cart_items_from_session', 1, 3); if(!function_exists('wdm_get_cart_items_from_session')) 函数 wdm_get_cart_items_from_session($item,$values,$key) if (array_key_exists('custom_data_1', $values)) $item['custom_data_1'] = $values['custom_data_1']; if (array_key_exists('custom_data_2', $values)) $item['custom_data_2'] = $values['custom_data_2']; if (array_key_exists('custom_data_3', $values)) $item['custom_data_3'] = $values['custom_data_3']; if (array_key_exists('custom_data_4', $values)) $item['custom_data_4'] = $values['custom_data_4']; if (array_key_exists('custom_data_5', $values)) $item['custom_data_5'] = $values['custom_data_5']; 返回$项目; // 第 4 步:在购物车和结帐页面上显示用户自定义数据 add_filter('woocommerce_checkout_cart_item_quantity','wdm_add_user_custom_option_from_session_into_cart',1,3); add_filter('woocommerce_cart_item_price','wdm_add_user_custom_option_from_session_into_cart',1,3); if(!function_exists('wdm_add_user_custom_option_from_session_into_cart')) 函数 wdm_add_user_custom_option_from_session_into_cart($product_name, $values, $cart_item_key) if(count($values['custom_data_1']) > 0) $return_string = $product_name 。 ""; $return_string .= ""; $return_string .= "SKU : " . $values['custom_data_1'] 。 ""; //$return_string .= "代码:" . $values['custom_data_2'] 。 ""; $return_string .= "宽度:" 。 $values['custom_data_3'] 。 " 厘米"; $return_string .= "高度:" 。 $values['custom_data_4'] 。 " 厘米"; $return_string .= "价格:€" . $values['custom_data_5'] 。 ""; $return_string .= ""; 返回 $return_string; 别的 返回 $product_name; // 第 5 步:将自定义数据作为元数据添加到订单项 add_action('woocommerce_add_order_item_meta','wdm_add_values_to_order_item_meta',1,2); if(!function_exists('wdm_add_values_to_order_item_meta')) 函数 wdm_add_values_to_order_item_meta($item_id, $values) 全球 $woocommerce,$wpdb; $user_custom_values = $values['wdm_user_custom_data_value']; if(!empty($user_custom_values)) wc_add_order_item_meta($item_id,'wdm_user_custom_data',$user_custom_values); $custom_data_1 = $values['custom_data_1']; if(!empty($custom_data_1)) wc_add_order_item_meta($item_id,'custom_data_1',$custom_data_1); $custom_data_2 = $values['custom_data_2']; if(!empty($custom_data_2)) wc_add_order_item_meta($item_id,'custom_data_2',$custom_data_2); $custom_data_3 = $values['custom_data_3']; if(!empty($custom_data_3)) wc_add_order_item_meta($item_id,'custom_data_3',$custom_data_3); $custom_data_4 = $values['custom_data_4']; if(!empty($custom_data_4)) wc_add_order_item_meta($item_id,'custom_data_4',$custom_data_4); $custom_data_5 = $values['custom_data_5']; if(!empty($custom_data_5)) wc_add_order_item_meta($item_id,'custom_data_5',$custom_data_5); // 第 6 步:如果产品已从购物车中删除,则删除用户自定义数据 add_action('woocommerce_before_cart_item_quantity_zero','wdm_remove_user_custom_data_options_from_cart',1,1); if(!function_exists('wdm_remove_user_custom_data_options_from_cart')) 函数 wdm_remove_user_custom_data_options_from_cart($cart_item_key) 全球$woocommerce; // 获取购物车 $cart = $woocommerce->cart->get_cart(); // 对于购物车中的每个商品,如果商品是已删除商品的加售商品,则将其删除 foreach($cart as $key => $values) 如果 ( $values['wdm_user_custom_data_value'] == $cart_item_key ) 未设置($woocommerce->cart->cart_contents[$key]);

我尝试包含以下代码

add_action('woocommerce_before_calculate_totals', 'add_custom_price'); 功能 add_custom_price( $cart_object ) $custom_price = 999; // 这是自定义价格 foreach ( $cart_object->cart_contents as $key => $value ) $value['data']->price = $custom_price;

它将价格更改为 999,因为它是固定的,但在我的情况下,我无法包含该值

$custom_data_5 = $_POST['custom_data_5']; // 这就是我的单价,需要从产品中替换简单产品价值的 $1 价值

任何帮助都将不胜感激,因为我现在没有选择余地了,而这个解决方案似乎可以为我纠正一个。

一月

【问题讨论】:

【参考方案1】:

好吧,我想我已经完成了,当然是在 ***.com 上搜索和搜索......

这就是我所做的:

功能 ipe_add_to_cart_link() 全球$产品; $custom_price = 30; echo sprintf('%s', esc_url($product->add_to_cart_url()), esc_attr( isset( $quantity ) ? $quantity : 1 ), $myCustomPrice, // 这就是我从 add_to_cart_button 获得的值 - 隐藏 esc_attr($product->id), esc_attr($product->get_sku()), esc_attr( isset( $class ) ? $class : 'button' ), esc_html( $product->add_to_cart_text() ) ); add_filter('woocommerce_loop_add_to_cart_link','ipe_add_to_cart_link'); 功能 ipe_product_custom_price($cart_item_data, $product_id) if( isset( $_POST['myCustomPrice'] ) && !empty($_POST['myCustomPrice'])) $cart_item_data[ "myCustomPrice" ] = $_POST['myCustomPrice']; 返回 $cart_item_data; add_filter('woocommerce_add_cart_item_data', 'ipe_product_custom_price', 99, 2); 功能 ipe_apply_custom_price_to_cart_item( $cart_object ) if(!WC()->session->__isset("reload_checkout")) foreach ( $cart_object->cart_contents as $key => $value ) if( isset( $value["myCustomPrice"] ) ) $value['data']->price = $value["myCustomPrice"]; add_action('woocommerce_before_calculate_totals','ipe_apply_custom_price_to_cart_item',99);

并将所有内容都放在 functions.php 中 - 就像一个魅力。希望这个解决方案对那里的人有所帮助。

一月

【讨论】:

以上是关于Woocommerce 在购物车和结账时使用自定义值覆盖产品价格的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 3 中的自定义加减数量按钮

在 Woocommerce 中的产品自定义循环上启用 Ajax 添加到购物车按钮

在Woocommerce中Ajax化自定义迷你购物车小部件

WooCommerce ACF 在购物车和结帐页面上显示自定义元数据

在 Woocommerce 中的购物车和结帐总计上插入自定义总计行

自定义以编程方式在 Woocommerce 中添加运费 [重复]