如果特定商品在 Woocommerce 的购物车中,则更改购物车商品价格
Change cart item price if a specific item is in the cart on Woocommerce
我正在使用 WooCommerce 会员资格,如果他们购买了特定产品,我想将免费会员资格扩展到新会员。我可以让其中的一些单独工作,但很难将它们全部组合在一起。
他们必须购买的商品也有促销价,所以我也在检查日期以查看该商品是否在促销中 window。那部分工作。
似乎当我添加参数以检查商品是否在购物车中时,整个事情就崩溃了。如果我 运行 这两个功能分开,它们都可以工作。
function mps_registration_price($cart_object) {
global $post, $product;
// Bail if memberships is not active
if ( ! function_exists( 'wc_memberships' ) ) {
return;
}
$user_id = get_current_user_id();
date_default_timezone_set("America/Chicago");
$today = time();
// Check if user was never a member
if ( !wc_memberships_get_user_memberships( $user_id )) {
if( mps_check_for_product() ) {
foreach ( $cart_object->get_cart() as $cart_item ) {
// get the product id (or the variation id)
$id = $cart_item['data']->get_id();
if($id == 17) {
$salePrice = get_post_meta($id, '_sale_price', true);
$saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
$saleTo = get_post_meta($id, '_sale_price_dates_to', true);
if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
$new_price = $salePrice;
} else {
$new_price = get_post_meta($id, '_regular_price', true);
}
// Updated cart item price
$cart_item['data']->set_price( $new_price );
}
}
} else {
foreach ( $cart_object->get_cart() as $cart_item ) {
// get the product id (or the variation id)
$id = $cart_item['data']->get_id();
if($id == 17) {
$salePrice = get_post_meta($id, '_sale_price', true);
$saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
$saleTo = get_post_meta($id, '_sale_price_dates_to', true);
if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
$new_price = $salePrice + 50;
} else {
$new_price = get_post_meta($id, '_regular_price', true);
}
// Updated cart item price
$cart_item['data']->set_price( $new_price );
}
}
}
}
}
add_filter( 'woocommerce_before_calculate_totals', 'mps_registration_price', 10, 1 );
function mps_check_for_product() {
$product_id = 11;
$product_cart_id = WC()->cart->generate_cart_id( $product_id );
$in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
if ( $in_cart ) {
return true;
} else {
return false;
}
}
add_action('woocommerce_before_cart', 'mps_check_for_product');
已更新(2018 年 10 月)
你把这里的一切都复杂化了,因为你只是想在客户还不是会员时向正在销售的特定产品 (ID 17) 添加额外费用。
您不需要为此使用 2 个单独的函数,而您的第二个函数以错误的方式执行此操作。如果您在第一个挂钩函数中调用它,则不需要挂钩。
我已经完全重新访问了您的代码,使用 WC_Product
方法而不是 get_post_meta()
…
WC_Product
方法 is_on_sale()
管理所有内容,例如 from/to 促销产品价格的日期。所以你不需要在你的函数中得到它。
In your code there is no differences when product 11 is in cart or is NOT in cart within your 2 Cart loops… So you should may be need to make some changes there.
所以你的代码现在非常紧凑:
add_action( 'woocommerce_before_calculate_totals', 'mps_registration_price', 20, 1 );
function mps_registration_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Bail if memberships is not active
if ( ! function_exists( 'wc_memberships' ) ) return; // Exit
// Only for non members
$user_id = get_current_user_id();
if ( wc_memberships_get_user_memberships( $user_id ) ) return; // Exit
// First loop to check if product 11 is in cart
foreach ( $cart->get_cart() as $cart_item ){
$is_in_cart = $cart_item['product_id'] == 11 ? true : false;
}
// Second loop change prices
foreach ( $cart->get_cart() as $cart_item ) {
// Get an instance of the WC_Product object (or the variation product object)
$product = $cart_item['data'];
// Method is_on_sale() manage everything (dates…)
// Here we target product ID 17
if( $product->is_on_sale() && $product->get_id() == 17 ) {
// When product 11 is not cart
if( ! $is_in_cart ){
$product->set_price( $product->get_sale_price() + 50);
}
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件或任何插件文件。
已测试并有效。
我正在使用 WooCommerce 会员资格,如果他们购买了特定产品,我想将免费会员资格扩展到新会员。我可以让其中的一些单独工作,但很难将它们全部组合在一起。
他们必须购买的商品也有促销价,所以我也在检查日期以查看该商品是否在促销中 window。那部分工作。
似乎当我添加参数以检查商品是否在购物车中时,整个事情就崩溃了。如果我 运行 这两个功能分开,它们都可以工作。
function mps_registration_price($cart_object) {
global $post, $product;
// Bail if memberships is not active
if ( ! function_exists( 'wc_memberships' ) ) {
return;
}
$user_id = get_current_user_id();
date_default_timezone_set("America/Chicago");
$today = time();
// Check if user was never a member
if ( !wc_memberships_get_user_memberships( $user_id )) {
if( mps_check_for_product() ) {
foreach ( $cart_object->get_cart() as $cart_item ) {
// get the product id (or the variation id)
$id = $cart_item['data']->get_id();
if($id == 17) {
$salePrice = get_post_meta($id, '_sale_price', true);
$saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
$saleTo = get_post_meta($id, '_sale_price_dates_to', true);
if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
$new_price = $salePrice;
} else {
$new_price = get_post_meta($id, '_regular_price', true);
}
// Updated cart item price
$cart_item['data']->set_price( $new_price );
}
}
} else {
foreach ( $cart_object->get_cart() as $cart_item ) {
// get the product id (or the variation id)
$id = $cart_item['data']->get_id();
if($id == 17) {
$salePrice = get_post_meta($id, '_sale_price', true);
$saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
$saleTo = get_post_meta($id, '_sale_price_dates_to', true);
if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
$new_price = $salePrice + 50;
} else {
$new_price = get_post_meta($id, '_regular_price', true);
}
// Updated cart item price
$cart_item['data']->set_price( $new_price );
}
}
}
}
}
add_filter( 'woocommerce_before_calculate_totals', 'mps_registration_price', 10, 1 );
function mps_check_for_product() {
$product_id = 11;
$product_cart_id = WC()->cart->generate_cart_id( $product_id );
$in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
if ( $in_cart ) {
return true;
} else {
return false;
}
}
add_action('woocommerce_before_cart', 'mps_check_for_product');
已更新(2018 年 10 月)
你把这里的一切都复杂化了,因为你只是想在客户还不是会员时向正在销售的特定产品 (ID 17) 添加额外费用。
您不需要为此使用 2 个单独的函数,而您的第二个函数以错误的方式执行此操作。如果您在第一个挂钩函数中调用它,则不需要挂钩。
我已经完全重新访问了您的代码,使用 WC_Product
方法而不是 get_post_meta()
…
WC_Product
方法 is_on_sale()
管理所有内容,例如 from/to 促销产品价格的日期。所以你不需要在你的函数中得到它。
In your code there is no differences when product 11 is in cart or is NOT in cart within your 2 Cart loops… So you should may be need to make some changes there.
所以你的代码现在非常紧凑:
add_action( 'woocommerce_before_calculate_totals', 'mps_registration_price', 20, 1 );
function mps_registration_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Bail if memberships is not active
if ( ! function_exists( 'wc_memberships' ) ) return; // Exit
// Only for non members
$user_id = get_current_user_id();
if ( wc_memberships_get_user_memberships( $user_id ) ) return; // Exit
// First loop to check if product 11 is in cart
foreach ( $cart->get_cart() as $cart_item ){
$is_in_cart = $cart_item['product_id'] == 11 ? true : false;
}
// Second loop change prices
foreach ( $cart->get_cart() as $cart_item ) {
// Get an instance of the WC_Product object (or the variation product object)
$product = $cart_item['data'];
// Method is_on_sale() manage everything (dates…)
// Here we target product ID 17
if( $product->is_on_sale() && $product->get_id() == 17 ) {
// When product 11 is not cart
if( ! $is_in_cart ){
$product->set_price( $product->get_sale_price() + 50);
}
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件或任何插件文件。
已测试并有效。