Изменить цену товара в корзине, если в Woocommerce есть определенный товар

Я использую членство WooCommerce и хочу расширить бесплатное членство для новых участников, если они приобретают определенный продукт. Я могу заставить это работать по отдельности, но у меня проблемы с тем, чтобы все это собралось вместе.

Существует также продажная цена на предмет, который они должны приобрести, поэтому я также проверяю даты, чтобы увидеть, находится ли предмет в окне продажи. Эта часть работает.

Кажется, что когда я добавляю аргумент, чтобы проверить, есть ли товар в корзине, все это ломается. Если я запускаю две функции по отдельности, они обе работают.

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');

1

Решение

обновленный (в октябре 2018 года)

Здесь вы все усложнили, так как вы просто хотите добавить к определенному товару (ID 17) в продаже дополнительную стоимость, когда клиент еще не зарегистрирован.

Вам не нужны две отдельные функции для этого, а ваша вторая функция делает это неправильно. Его не нужно подключать, если вы вызываете его в своей первой подключенной функции.

Я полностью пересмотрел ваш код, используя WC_Product методы вместо get_post_meta()

Так же WC_Product метод is_on_sale() управлять всем как с / на даты продажи товаров по ценам. Таким образом, вам не нужно включать это в свои функции.

В вашем коде есть нет различий когда продукт 11 находится в корзине или НЕ находится в корзине в ваших 2 циклах тележки … Так вам может потребоваться внести некоторые изменения там.

Итак, ваш код теперь очень компактен:

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 вашей активной дочерней темы (или активной темы) или в любом файле плагина.

Проверено и работает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]