2015-07-13 6 views
0

Я строил свою электронную коммерцию для продажи вина с wordpress 4.2.2 и woocommerce 2.3.11 Я купил плагин «Product Bundle» (v. 4.9.5) для woocommerce.Удалить товар в корзине woocommerce

Я уже вставить эту функцию в моей function.php файл

add_action('woocommerce_check_cart_items', 'woocommerce_check_cart_quantities'); 
function woocommerce_check_cart_quantities() { 
    $multiples = 6; 
    $total_products = 0; 
    foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
     $total_products += $values['quantity']; 
    } 
    if (($total_products % $multiples) > 0) 
     wc_add_notice(sprintf(__('You need to buy in quantities of %s products', 'woocommerce'), $multiples), 'error'); 
} 

, потому что мне нужно продавать бутылки на кратному 6.
Теперь я эта проблема с продуктом в комплекте, потому что в корзине также подсчитывается родительский элемент.
Если я создаю пакет с 6 бутылками, в корзине у меня есть сообщение «Вам нужно купить в количестве% s продуктов», потому что общее количество составляет 7 (6 бутылок плюс 1 комплект).
Я пишу WooThemes поддержки, и я Получать этот ответ:

By default, Bundle contents are not counted. A Bundle will be counted as one item, no matter how many products it contains.

When using Product Bundles and needed to count the content, you need to use the WC()->cart->get_cart_contents_count() method to count all the cart items.

------ ОБНОВЛЕНИЕ -------

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

<?php 
/** 
* Child-Theme functions and definitions 
*/ 

// check that cart items quantities totals are in multiples of 6 
add_action('woocommerce_check_cart_items', 'woocommerce_check_cart_quantities'); 
function woocommerce_check_cart_quantities() { 
    $multiples = 6; 
    $total_products = 0; 
    foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
     $total_products += $values['quantity']; 
    } 
    if (($total_products % $multiples) > 0) 
     wc_add_notice(sprintf(__('You need to buy in quantities of %s products', 'woocommerce'), $multiples), 'error'); 
} 

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


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

?> 

но ничего не происходит. Я также попробую новую установку wordpress и woocommerce с темой по умолчанию (двадцать тринадцать, а также twnty пятнадцать) для теста, если в теме есть какой-то javascript, который мешает и изменяет количество, но результат тот же. Если у меня есть 1 пакет с 6 бутылками, я получаю сообщение от первой функции.

+0

Какая ошибка PHP вы получаете? – helgatheviking

+0

с функцией cit_update_cart_count() Я получаю PHP Неустранимая ошибка: вызовите функцию-член get_cart() на не-объект в. \ Wp-content \ themes \ Wine-child \ functions.php в строке 20 , поэтому я отбросить эту функцию – Wolftrick

+0

Ну, это означает, что 'WC() -> cart' не является объектом, скорее всего, потому что крюк' init' происходит до того, как корзина инициализирована. Вероятно, лучше всего отказаться от этой функции. – helgatheviking

ответ

1

Я уже ответил на этот вопрос here. Вам нужно отключить функцию 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'); 


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

Одна вещь, чтобы отметить, что Javascript может обновлять счетчик в вашем меню/виджетов и не принимать это в учетную запись по каким-то причинам. Однако, когда я «рассматриваю исходный код», я получаю нужный подсчет (т. Е. Пучок из 6 бутылок показывает количество 6).

Или в качестве альтернативы вы можете изменить функцию подсчета, чтобы не считать контейнер упаковки. Непроверенные:

add_action('woocommerce_check_cart_items', 'woocommerce_check_cart_quantities'); 
function woocommerce_check_cart_quantities() { 
    $multiples = 6; 
    $total_products = 0; 
    foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
     if (isset($value[ 'stamp' ]) && ! isset($value[ 'bundled_by' ])) { 
      continue; // skip the bundle container 
     } else { 
      $total_products += $values['quantity']; 
     } 
    } 
    if (($total_products % $multiples) > 0) 
     wc_add_notice(sprintf(__('You need to buy in quantities of %s products', 'woocommerce'), $multiples), 'error'); 
} 
+0

Благодарим вас за ответ. Я стараюсь обе функции, но ничего не меняется. Всегда появляется сообщение об ошибке «Вам нужно купить в количествах% s продуктов», также показано, если у меня есть 6 бутылок внутри пакета. Я не использую цену за продукт, потому что я ставлю новую цену для всего пакета. – Wolftrick

+0

Вы пытались отключить фильтр Bundles, одновременно добавляя свой собственный через 'so_28359520_cart_contents_count'? – helgatheviking

+0

Ну, я пытаюсь добавить обе части кода в свой файл functions.php. Я пишу (как новый ответ) код, который у меня есть в моем файле functions.php. Прошу прощения за плохое понимание PHP-кодирования, но я думал, что такие варианты (bundle) являются родными внутри woocommerce. – Wolftrick

0

У меня были проблемы с этим, пока я не понял, что мне нужно использовать туалет() -> cart-> get_cart_contents_count(), а не туалет() -> cart-> cart_contents_count

Просто подумал Я бы поставил это на случай, если кто-то еще вытаскивает волосы ...

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