通过 WooCommerce 中的 URL (GET) 设置自定义添加到购物车的价格
Set a custom add to cart price via the URL (GET) in WooCommerce
我正在开发一个基于 wordpress 和 woocommerce 的网站,提供与烹饪相关的培训信息并出售各种厨房材料。
想参加培训的人请填写表格申请。厨房用品也通过 woocommerce 销售。
培训已添加到网站,内容类型称为培训。
要求通过 woocommerce 结构销售一些培训。然而,这些想要出售的“培训”却希望以教育内容的形式保留下来。另外,请不要作为产品添加或移动。
首先,我创建了一个名为教育的虚拟产品。我把产品藏在店里了。
然后我为教程添加了一个名为价格的自定义字段。此处将输入每份培训的销售价格。
我在培训详细信息页面上有一个按钮“注册培训”,我将其更改为“购买”以获取想要出售的培训和 link
?add-to-cart=340&custom_price=600&quantity=1
我填表了
这里的340是我创建的虚拟商品的id
单击“购买”按钮后,名为“教育”的虚拟产品将添加到购物篮中。但是我想根据打印的培训详情页来更新这个培训的名称和价格。
我添加到 functions.php 的代码。
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals' );
function before_calculate_totals( $_cart ){
// loop through the cart_contents
foreach ( $_cart->cart_contents as $cart_item_key => &$item ) {
// you will need to determine the product id you want to modify, only when the "donation_amount" is passed
if ( $item['product_id'] == 340 && isset( $_GET['custom_price'] ) ){
// custom price from POST
$custom_price = $_GET['custom_price'] > 0 ? $_GET['custom_price'] : 0;
// save to the cart data
//$item['data']->price = $custom_price;
// new versions of WooCommerce may require (instead of line above)...
$item['data']->set_price($custom_price);
}
}
}
function ipe_product_custom_price( $cart_item_data, $product_id ) {
if( isset( $_POST['custom_price'] ) && !empty($_POST['custom_price'])) {
$cart_item_data[ "custom_price" ] = $_POST['custom_price'];
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'ipe_product_custom_price', 99, 2 );
我想用这些代码更新价格,但没用。
如何动态更新虚拟商品信息?或者你会建议什么不同的方法?
您的代码中存在一些错误,并且缺少一些使其正常工作的内容。请尝试以下操作:
// Set custom data as custom cart data in the cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_price_as_custom_cart_item_data', 30, 3 );
function add_custom_price_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
if( ! isset($_GET['custom_price']) ) {
$cart_item_data['custom_price'] = (float) esc_attr( $_GET['custom_price'] );
$cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
}
return $cart_item_data;
}
// Change cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' );
function change_cart_item_price( $cart ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// loop through the cart_contents
foreach ( $cart->get_cart() as $cart_item ) {
// you will need to determine the product id you want to modify, only when the "donation_amount" is passed
if ( isset($cart_item['custom_price']) ) {.
$item['data']->set_price($cart_item['custom_price']);
}
}
}
// Display the custom price on minicart too
add_filter( 'woocommerce_cart_item_price', 'change_minicart_item_price', 10, 3 );
function change_minicart_item_price( $price_html, $cart_item, $cart_item_key ) {
if( ! is_cart() && isset( $cart_item['custom_price'] ) ) {
$args = array( 'price' => floatval($cart_item['custom_price']) );
if ( WC()->cart->display_prices_including_tax() ) {
$product_price = wc_get_price_including_tax( $cart_item['data'], $args );
} else {
$product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
}
return wc_price( $product_price );
}
return $price_html;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它应该有效。
我正在开发一个基于 wordpress 和 woocommerce 的网站,提供与烹饪相关的培训信息并出售各种厨房材料。
想参加培训的人请填写表格申请。厨房用品也通过 woocommerce 销售。
培训已添加到网站,内容类型称为培训。
要求通过 woocommerce 结构销售一些培训。然而,这些想要出售的“培训”却希望以教育内容的形式保留下来。另外,请不要作为产品添加或移动。
首先,我创建了一个名为教育的虚拟产品。我把产品藏在店里了。
然后我为教程添加了一个名为价格的自定义字段。此处将输入每份培训的销售价格。
我在培训详细信息页面上有一个按钮“注册培训”,我将其更改为“购买”以获取想要出售的培训和 link
?add-to-cart=340&custom_price=600&quantity=1
我填表了
这里的340是我创建的虚拟商品的id
单击“购买”按钮后,名为“教育”的虚拟产品将添加到购物篮中。但是我想根据打印的培训详情页来更新这个培训的名称和价格。
我添加到 functions.php 的代码。
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals' );
function before_calculate_totals( $_cart ){
// loop through the cart_contents
foreach ( $_cart->cart_contents as $cart_item_key => &$item ) {
// you will need to determine the product id you want to modify, only when the "donation_amount" is passed
if ( $item['product_id'] == 340 && isset( $_GET['custom_price'] ) ){
// custom price from POST
$custom_price = $_GET['custom_price'] > 0 ? $_GET['custom_price'] : 0;
// save to the cart data
//$item['data']->price = $custom_price;
// new versions of WooCommerce may require (instead of line above)...
$item['data']->set_price($custom_price);
}
}
}
function ipe_product_custom_price( $cart_item_data, $product_id ) {
if( isset( $_POST['custom_price'] ) && !empty($_POST['custom_price'])) {
$cart_item_data[ "custom_price" ] = $_POST['custom_price'];
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'ipe_product_custom_price', 99, 2 );
我想用这些代码更新价格,但没用。
如何动态更新虚拟商品信息?或者你会建议什么不同的方法?
您的代码中存在一些错误,并且缺少一些使其正常工作的内容。请尝试以下操作:
// Set custom data as custom cart data in the cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_price_as_custom_cart_item_data', 30, 3 );
function add_custom_price_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
if( ! isset($_GET['custom_price']) ) {
$cart_item_data['custom_price'] = (float) esc_attr( $_GET['custom_price'] );
$cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
}
return $cart_item_data;
}
// Change cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' );
function change_cart_item_price( $cart ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// loop through the cart_contents
foreach ( $cart->get_cart() as $cart_item ) {
// you will need to determine the product id you want to modify, only when the "donation_amount" is passed
if ( isset($cart_item['custom_price']) ) {.
$item['data']->set_price($cart_item['custom_price']);
}
}
}
// Display the custom price on minicart too
add_filter( 'woocommerce_cart_item_price', 'change_minicart_item_price', 10, 3 );
function change_minicart_item_price( $price_html, $cart_item, $cart_item_key ) {
if( ! is_cart() && isset( $cart_item['custom_price'] ) ) {
$args = array( 'price' => floatval($cart_item['custom_price']) );
if ( WC()->cart->display_prices_including_tax() ) {
$product_price = wc_get_price_including_tax( $cart_item['data'], $args );
} else {
$product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
}
return wc_price( $product_price );
}
return $price_html;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它应该有效。