在 Woocommerce 单个产品页面和购物车上有条件地设置特定产品价格
Set a specific product price conditionally on Woocommerce single product page & cart
在 Woocommerce 中,我想在单个产品页面和相关购物车项目上更改特定产品(在本例中 ID 为 87)的价格。
产品价格需要增加 10 美元,但仅限于单个产品页面且仅限外部(这样内部价格或 Woocommerce 中设置的价格不会改变)。
此外,此价格也应在购物车中更改,但前提是特定类别的产品不在购物车中。
上下文:如果有人单独购买此产品,则应向他们收取比正常价格高出 10 美元的费用。如果有人将此商品与某个类别的产品一起购买,则应按正常价格收取费用。
这本质上是一种反向折扣(我不想使用优惠券功能来额外收费)。
对于购物车功能,到目前为止我有这个但它没有用 - 当当前 regular/base 价格为 45 美元时,购物车价格为 75 美元。我不知道 75 是从哪里来的,而它应该是 55。
function wc_cart_custom_price( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// set our flag to be false until we find a product in that category
$cat_check = false;
// check each cart item for our category
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
// replace 'your-category' with your category's slug
if ( has_term( 'your-category', 'product_cat', $product->id ) ) {
$cat_check = true;
// break because we only need one "true" to matter here
break;
}
}
// if a product in the cart is in our category, stop there and don't change price
if ( $cat_check ) {
return;
}
// else continue and alter the product price
else if ( $cart_item['product_id'] == 87 ) {
// we have the right product, do what we want
$price = $cart_item['data']->get_price(); // Get the product price
$new_price = $price + 10; // the calculation
$cart_item['data']->set_price( $new_price ); // Set the new price
}
}
add_action( 'woocommerce_before_calculate_totals', 'wc_cart_custom_price' );
我现在更改产品页面价格的代码是:
function wc_change_product_price($price, $product) {
if ( is_single('87') ) {
$post_id = $product->id;
$regular_price = get_post_meta( $post_id, '_regular_price', true);
$custom_value = ( $regular_price + 10 );
$price = $custom_value;
return $price;
}
}
add_filter('woocommerce_get_price', 'wc_change_product_price', 99);
这是一场灾难,导致 500 服务器错误。我做错了什么?欢迎任何帮助。
参考文献:
https://rudrastyh.com/woocommerce/change-product-prices-in-cart.html
https://www.skyverge.com/blog/checking-woocommerce-cart-contains-product-category/
更新 3 (仅针对定义的产品 ID)
如果您只想在单个产品页面上更改简单产品价格(不更改存档产品价格、相关产品价格、追加销售和交叉销售),使其正常工作如果任何购物车商品不'不属于特定产品类别。
那么您将需要以下所有代码:
// Change displayed price on single product pages
add_action( 'woocommerce_single_product_summary', 'change_simple_product_price_html', 9 );
function change_simple_product_price_html() {
global $product;
// Only for product ID 87
if( $product->get_id() != 87 ) return;
// HERE set your product category term ID, slug or name
$product_category = 't-shirts';
// Checking for the product category in cart items loop
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}
function custom_simple_product_price_html(){
global $product;
$addp = 10; // Here the price additional amount
if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
$price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
}
echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '</p>';
}
// Add custom calculated price to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
// Only for product ID 87
if( $product_id != 87 )
return $cart_item_data;
$product = wc_get_product($product_id); // The WC_Product Object
// Only if product is not on sale
if( $product->is_on_sale() )
return $cart_item_data;
$price = (float) $product->get_price();
// Set the custom amount in cart object
$cart_item_data['new_price'] = $price + 10;
return $cart_item_data;
}
// Set custom calculated price to cart
add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 );
function set_cart_simple_product_custom_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// HERE set your product category term ID, slug or name
$product_category = 't-shirts';
// 1st cart items Loop: checking for the product category
foreach ( $cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
// 2nd Loop: Changing cart item prices (Product category not found)
foreach ( $cart->get_cart() as $cart_item ) {
if( isset($cart_item['new_price']))
$cart_item['data']->set_price( $cart_item['new_price'] );
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
如果您想在单个产品页面上更改产品价格。
请遵循此代码,我添加了我的产品 ID“99”:
add_action( 'woocommerce_single_product_summary', 'e_coding_change_simple_product_price_html', 9 );
function e_coding_change_simple_product_price_html() {
global $product;
// Only for product ID 99
if( $product->get_id() != 99 ) return;
// HERE set your product category term ID, slug or name
$product_category = 'my-book';
// Checking for the product category in cart items loop
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}
function custom_simple_product_price_html(){
global $product;
$addp = 10; // Here the price additional amount
if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
$price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
}
echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) .'</p>';
}
// Add custom calculated price to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
// Only for product ID 87
if( $product_id != 99 )
return $cart_item_data;
$product = wc_get_product($product_id); // The WC_Product Object
// Only if product is not on sale
if( $product->is_on_sale() )
return $cart_item_data;
$price = (float) $product->get_price();
// Set the custom amount in cart object
$cart_item_data['new_price'] = $price + 10;
return $cart_item_data;
}
function cw_change_product_price_display( $price ) {
$price .= ' At Each Item Product';
return $price;
}
add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );
在 Woocommerce 中,我想在单个产品页面和相关购物车项目上更改特定产品(在本例中 ID 为 87)的价格。
产品价格需要增加 10 美元,但仅限于单个产品页面且仅限外部(这样内部价格或 Woocommerce 中设置的价格不会改变)。
此外,此价格也应在购物车中更改,但前提是特定类别的产品不在购物车中。
上下文:如果有人单独购买此产品,则应向他们收取比正常价格高出 10 美元的费用。如果有人将此商品与某个类别的产品一起购买,则应按正常价格收取费用。 这本质上是一种反向折扣(我不想使用优惠券功能来额外收费)。
对于购物车功能,到目前为止我有这个但它没有用 - 当当前 regular/base 价格为 45 美元时,购物车价格为 75 美元。我不知道 75 是从哪里来的,而它应该是 55。
function wc_cart_custom_price( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// set our flag to be false until we find a product in that category
$cat_check = false;
// check each cart item for our category
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
// replace 'your-category' with your category's slug
if ( has_term( 'your-category', 'product_cat', $product->id ) ) {
$cat_check = true;
// break because we only need one "true" to matter here
break;
}
}
// if a product in the cart is in our category, stop there and don't change price
if ( $cat_check ) {
return;
}
// else continue and alter the product price
else if ( $cart_item['product_id'] == 87 ) {
// we have the right product, do what we want
$price = $cart_item['data']->get_price(); // Get the product price
$new_price = $price + 10; // the calculation
$cart_item['data']->set_price( $new_price ); // Set the new price
}
}
add_action( 'woocommerce_before_calculate_totals', 'wc_cart_custom_price' );
我现在更改产品页面价格的代码是:
function wc_change_product_price($price, $product) {
if ( is_single('87') ) {
$post_id = $product->id;
$regular_price = get_post_meta( $post_id, '_regular_price', true);
$custom_value = ( $regular_price + 10 );
$price = $custom_value;
return $price;
}
}
add_filter('woocommerce_get_price', 'wc_change_product_price', 99);
这是一场灾难,导致 500 服务器错误。我做错了什么?欢迎任何帮助。
参考文献:
https://rudrastyh.com/woocommerce/change-product-prices-in-cart.html
https://www.skyverge.com/blog/checking-woocommerce-cart-contains-product-category/
更新 3 (仅针对定义的产品 ID)
如果您只想在单个产品页面上更改简单产品价格(不更改存档产品价格、相关产品价格、追加销售和交叉销售),使其正常工作如果任何购物车商品不'不属于特定产品类别。
那么您将需要以下所有代码:
// Change displayed price on single product pages
add_action( 'woocommerce_single_product_summary', 'change_simple_product_price_html', 9 );
function change_simple_product_price_html() {
global $product;
// Only for product ID 87
if( $product->get_id() != 87 ) return;
// HERE set your product category term ID, slug or name
$product_category = 't-shirts';
// Checking for the product category in cart items loop
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}
function custom_simple_product_price_html(){
global $product;
$addp = 10; // Here the price additional amount
if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
$price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
}
echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '</p>';
}
// Add custom calculated price to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
// Only for product ID 87
if( $product_id != 87 )
return $cart_item_data;
$product = wc_get_product($product_id); // The WC_Product Object
// Only if product is not on sale
if( $product->is_on_sale() )
return $cart_item_data;
$price = (float) $product->get_price();
// Set the custom amount in cart object
$cart_item_data['new_price'] = $price + 10;
return $cart_item_data;
}
// Set custom calculated price to cart
add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 );
function set_cart_simple_product_custom_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// HERE set your product category term ID, slug or name
$product_category = 't-shirts';
// 1st cart items Loop: checking for the product category
foreach ( $cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
// 2nd Loop: Changing cart item prices (Product category not found)
foreach ( $cart->get_cart() as $cart_item ) {
if( isset($cart_item['new_price']))
$cart_item['data']->set_price( $cart_item['new_price'] );
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
如果您想在单个产品页面上更改产品价格。 请遵循此代码,我添加了我的产品 ID“99”:
add_action( 'woocommerce_single_product_summary', 'e_coding_change_simple_product_price_html', 9 );
function e_coding_change_simple_product_price_html() {
global $product;
// Only for product ID 99
if( $product->get_id() != 99 ) return;
// HERE set your product category term ID, slug or name
$product_category = 'my-book';
// Checking for the product category in cart items loop
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
return; // Product category found ==> We EXIT from this function
}
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}
function custom_simple_product_price_html(){
global $product;
$addp = 10; // Here the price additional amount
if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
$price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
}
echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) .'</p>';
}
// Add custom calculated price to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
// Only for product ID 87
if( $product_id != 99 )
return $cart_item_data;
$product = wc_get_product($product_id); // The WC_Product Object
// Only if product is not on sale
if( $product->is_on_sale() )
return $cart_item_data;
$price = (float) $product->get_price();
// Set the custom amount in cart object
$cart_item_data['new_price'] = $price + 10;
return $cart_item_data;
}
function cw_change_product_price_display( $price ) {
$price .= ' At Each Item Product';
return $price;
}
add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );