2015-02-06 6 views
1

Конфигурация:WooCommerce Связки Продукт - Корзина Количество

WordPress 4.1 Календарь мероприятий Календарь PRO 3.9 The Events: WooCommerce Билеты 3,9 WooCommerce 2.2.11 WooCommerce Связки продукта 4.6.2 Для сайта События, продажа следующие билеты:

взрослых $ 25 ребенка $ 5 Infant $ 0 семьи $ 55 (Состоит до 1-2 х взрослых, 1-3 ребенка) Семейный билет выполнен в виде WooCommerce Bun dled Product, с включенными продуктами, предназначенными для взрослых и детей. Взрослый настроен на количество 2, а для ребенка установлено значение 3

Когда продукт, связанный с семьей, добавляется в корзину, количество предметов, о которых сообщается в корзине, составляет 6. Это составлено из родительский продукт 1 x Family и 2 x Adult и 3 x Child children.

Желаемый результат здесь должен состоять в том, чтобы тележка сообщала 5 предметов - 2 x взрослых и 3 ребенка. Другими словами, игнорируйте родительский продукт из числа продуктов.

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

ответ

2

Я считаю, что Bundle в режиме ценообразования на продукт автоматически подсчитывает количество связанных предметов. Когда в режиме «bundle» количество элементов считается равным родительскому.

Это количество твик достигается в корзину класса Пучки ... так что я думаю, что это может быть отключена с помощью:

function so_28359520_remove_bundles_counting(){ 
    global $woocommerce_bundles; 
    remove_filter('woocommerce_cart_contents_count', array($woocommerce_bundles->display, 'woo_bundles_cart_contents_count')); 
} 
add_action('init', 'so_28359520_remove_bundles_counting'); 

Edit: я пересмотрел код выше, потому что кажется, что Связки использует глобальную переменную для доступа к основному классу плагина. Дополнительно, я думаю, что woocommerce_loaded срабатывает перед тем, как тема загружена, так что вряд ли она будет работать. Я перешел на крючок init.

Edit 2: Связки будет пропустить рассчитывает на родительский элемент если этот элемент устанавливается для использования за продукт расчеты доставки. Но если это не применимо, то вам необходимо отключить фильтрацию Связки и применять свои собственные:

function so_28359520_cart_contents_count($count) { 

    $cart = WC()->cart->get_cart(); 

    $subtract = 0; 

    foreach ($cart as $key => $value) { 

     if (isset($value[ 'stamp' ]) && ! isset($value[ 'bundled_by' ])) { 
      $subtract += $value[ 'quantity' ]; 
     } 
    } 

    return $count - $subtract; 

} 
add_filter('woocommerce_cart_contents_count', 'so_28359520_cart_contents_count'); 
+0

Я добавил ваш код в файл functions.php моей дочерней темы, но это не имело значения. Комментарии, связанные с этой функцией: «Фильтрует указанное количество позиций корзины в зависимости от стратегии ценообразования: цена за штуку: контейнер вычитается, статическая цена: элементы вычитаются». Использование статической цены, поэтому количество корзин должно составлять 1, так как дочерние элементы вычитаются. Я задавался вопросом, действительно ли фильтр применяется, поэтому я изменил функцию, чтобы вернуть счетчик корзины +10. Никаких изменений в подсчете корзины, поэтому для меня это говорит о том, что включенный фильтр счетчиков корзин не работает. Любые идеи, где отсюда? –

+0

Конечно, я удалил ваш скрипт из functions.php перед тестированием, если фильтр работал. –

+0

Я пересмотрел свой код, потому что он никогда не запускался из 'functions.php' (и теперь я правильно обращаюсь к классу Bundles), и теперь один из моих пакетов со статическим ценообразованием показывает 3 элемента в корзине. – helgatheviking

0

С кучах помощью из @helgatheviking я смог придумать следующее решение в моей functions.php :

function cit_update_cart_count() { 
    global $woocommerce; 
    $count = 0; 
    $cart = $woocommerce->cart->get_cart(); 
    foreach ($cart as $key => $value) { 
     if (!isset($value['bundled_items'])) { 
      $count += $value['quantity']; 
     } 
    } 
    $woocommerce->cart->cart_contents_count = $count; 
} 
add_action('init','cit_update_cart_count',10); 
+0

Это похоже на то, что мне нужно для решения подобная проблема. Однако при добавлении к моим функциям.php Я не могу открыть свой сервер - возвращается ошибка сервера. С того времени что-то изменилось? – user2806026

-1

вы можете использовать ту же функцию в начале постов, что здесь написано

function so_28359520_cart_contents_count($count) { 

    $cart = WC()->cart->get_cart(); 

    $subtract = 0; 

    foreach ($cart as $key => $value) { 

     if (isset($value[ 'stamp' ]) && ! isset($value[ 'bundled_by' ])) { 
      $subtract += $value[ 'quantity' ]; 
     } 
    } 

    return $count - $subtract; 

} 

Но вы должны использовать его внутри класса-туалет-пб тележкой.PHP

и внутри конструкция добавить
add_filter('woocommerce_cart_contents_count', 'so_28359520_cart_contents_count');

Это работает как шарм, но в моей теме я имел проблемы с туалетом() -> cart-> cart_contents_count в header.php, как-то фильтр не применяется на этом, но с использованием

<?php 
    global $woocommerce; 
    // get cart quantity 
    $qty = $woocommerce->cart->get_cart_contents_count(); 
?> 

Внутри header.php фильтр применяется, и я получаю правильный счет.

+0

Непосредственно модифицировать 'class-wc-pb-cart.php' не рекомендуется. – helgatheviking

Смежные вопросы