Автоматический пересчет количества при нажатии на корзину обновлений в Woocommerce

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

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

Моя проблема возникает, когда я обновляю корзину новым количеством, так как количество бонусного продукта не обновляется.

add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
if ( ! is_admin() ) {
$product_id = 265;
$found = false;

// Get the current cart quantity
foreach ( WC()->cart->get_cart() as $cart_item ) {
$quantity = $cart_item['quantity'];
$percentage = .25;
$bonus = $quantity * $percentage;
}

//check if product already in cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
// if product not found, add it
if ( ! $found )
WC()->cart->add_to_cart( $product_id, $bonus );
} else {
// if no products in cart, add it
WC()->cart->add_to_cart( $product_id, $bonus );
}
}
}

У кого-нибудь есть идеи о том, как заставить это автоматически пересчитать, когда нажата корзина обновления?

0

Решение

Предварительные замечания:

  • Ваш код не работает, когда корзина пуста, как $bonus переменная не определена и вы получаете ошибку…

  • Также, как вы устанавливаете переменную число с плавающей точкой для количестваТаким образом, если количество не является целым числом, клиент не может изменить и обновить количество товаров в корзине.

Это довольно сложно, ваш количество бонусов необходимо обновить в другой подключенной функции, когда:

  • Товар добавлен в корзину
  • Количество обновлений клиента на странице корзины
  • Клиент удаляет товары из корзины

Также есть небольшие ошибки вроде $_product->id это должно вместо $_product->get_id() в туалете 3+

Таким образом, ваш повторный код с дополнительными подключенными функциями будет:

add_action( 'template_redirect', 'auto_add_product_to_cart', 50 );
function auto_add_product_to_cart() {
if ( ! is_admin() ) {
$cart = WC()->cart; // <== Cart object
$product_id = 37; // <== Specific product to be auto added
$bonus_rate = .25; // <== Bonus rate
$found = false;

// Check if product already in cart
if ( ! $cart->is_empty() ) {
$contents_count = $cart->get_cart_contents_count(); // The cart items count
$bonus_qty = $contents_count * $bonus_rate; // Bonus quantity calculation
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item ) {
if ( $cart_item['data']->get_id() == $product_id ){
$found = true;
break; // Stop the loop
}
}
// Product is not found in the loop, we add it
if( ! $found )
$cart->add_to_cart( $product_id, $bonus_qty );
} else {
// There is no items in cart, we add it
$cart->add_to_cart( $product_id, $bonus_rate );
}
}
}

// Calculate, set and update bonus quantity
add_action( 'woocommerce_before_calculate_totals', 'conditional_bonus_quantity_calculation', 20, 1 );
function conditional_bonus_quantity_calculation( $cart ) {

if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;

if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;

$bonus_rate = .25; // <== Bonus rate
$product_id = 37;  // <== Specific product to be auto added
$contents_count = $cart->get_cart_contents_count(); // Total cart items count

// Loop through cart items to check our specific product
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// If specific product is in cart
if ( $cart_item['data']->get_id() == $product_id ){
$calc_qty = $cart_item['quantity'] < 1 ? 1 : $cart_item['quantity'];
// Bonus quantity calculation
if( $contents_count > 1 )
$bonus_qty = round( $contents_count - $calc_qty ) * $bonus_rate;
else
$bonus_qty = $bonus_rate;
// Update item quantity
$cart->set_quantity( $cart_item_key, $bonus_qty, false );
}
}
}

// Allowing float numbers quantity (step by .25) for a specific product
add_filter( 'woocommerce_quantity_input_args', 'custom_quantity_input_args', 20, 2 );
function custom_quantity_input_args( $args, $product ) {
// Only for your specific product ID on cart page
if( $product->get_id() != 37 && is_cart() ) return $args;

//$args['input_value'] = 0.25; // Default starting value (Optional)
$args['min_value'] = 0.25;
$args['step'] = 0.25;
$args['pattern'] = '[0-9.]*';
$args['inputmode'] = 'numeric';

return $args;
}

// Allowing float numbers  in Stock management
remove_filter('woocommerce_stock_amount', 'intval');
add_filter('woocommerce_stock_amount', 'floatval');

Код помещается в файл function.php активной дочерней темы (или активной темы).

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

0

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

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

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