Woocommerce_before_calculate_totals не обновляет мини-корзину [дубликат]Php

Кемеровские программисты php общаются здесь
Ответить
Гость
 Woocommerce_before_calculate_totals не обновляет мини-корзину [дубликат]

Сообщение Гость »

Я хочу добавить в корзину определенные товары, если они соответствуют определенным условиям. Например, до 100 добавляется конкретный продукт с ценой 0, а от 101 до 200 добавляются другие продукты. Мне удалось обновить корзину с помощью woocommerce_before_calculate_totals, но она не обновляется в мини-корзине. Когда продукт добавляется с промежуточным итогом более 100, он добавляет продукты, которые должны были отображаться, когда промежуточный итог ниже 100. Только после удаления продуктов, которые, как я предполагаю, обновляются, отображается корзина обновления мини-корзины
Я использую ACF для получения идентификаторов продуктов
Ниже приведен код, который я использовал для добавления продуктов в корзину:
add_action('woocommerce_before_calculate_totals', 'check_free_gift_product', 10, 1);
function check_free_gift_product($cart)
{
if (is_admin() && !defined('DOING_AJAX'))
return;

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

$checkout_steps_gift = get_field('checkut_steps_gift', 'option');
if (!empty($checkout_steps_gift)) {
$cart_subtotal = 0;
foreach ($cart->get_cart() as $cart_item) {
$cart_subtotal += $cart_item['line_tax'] + $cart_item['line_total'];
}

$valid_gift_products = [];
$gift_products_in_cart = [];
for ($i = 0; $i < count($checkout_steps_gift); $i++) {
$free_product_ids = $checkout_steps_gift[$i]['cart_gifts'];
$min_price_for_free_product = $checkout_steps_gift[$i]['cart_total'];
$max_price_for_free_product = ($i + 1 < count($checkout_steps_gift)) ? $checkout_steps_gift[$i + 1]['cart_total'] : PHP_INT_MAX;

if ($cart_subtotal >= $min_price_for_free_product && $cart_subtotal < $max_price_for_free_product) {
$valid_gift_products = array_merge($valid_gift_products, $free_product_ids);
}
}

foreach ($valid_gift_products as $free_product_id) {
$product_in_cart = false;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
if ($cart_item['product_id'] == $free_product_id) {
$cart_item['data']->set_price(0);
$cart->set_quantity($cart_item_key, 1);
$product_in_cart = true;
}
}

if (!$product_in_cart) {
$cart_item_key = $cart->add_to_cart($free_product_id, 1);
$cart_item = $cart->get_cart_item($cart_item_key);
$cart_item['data']->set_price(0);
}

$gift_products_in_cart[] = $free_product_id;
}

foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
if (!in_array($cart_item['product_id'], $gift_products_in_cart)) {
foreach ($checkout_steps_gift as $free_products) {
$product_ids = $free_products['cart_gifts'];
if (in_array($cart_item['product_id'], $product_ids)) {
$cart->remove_cart_item($cart_item_key);
}
}
}
}
}
}

//Remove All Products if cart subtotal is empty
add_action('woocommerce_after_calculate_totals', 'remove_product_if_subtotal_is_empty', 10, 1);
function remove_product_if_subtotal_is_empty($cart)
{

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

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

$cart_subtotal = 0;
foreach ($cart->get_cart() as $cart_item) {
$cart_subtotal += $cart_item['line_tax'] + $cart_item['line_total'];
}

if ($cart_subtotal == 0 && $cart->get_cart_contents_count() != 0) {
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$cart->remove_cart_item($cart_item_key);
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... -mini-cart
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»