2015-05-15 5 views
2

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

Моя идея была:

add_filter('woocommerce_package_rates', 'remove_flat_rate_from_used_products', 10, 2); 

function remove_flat_rate_from_used_products($rates, $package) { 
    if(is_woocommerce() && (is_checkout() || is_cart())) { 
     if(check_whether_item_has_the_category()) { 
      unset($rates['flat_rate']); 
     } 
    } 

    return $rates; 
} 

Я догадывался, функция get_cart() возвращает содержимое корзины, и я смог бы получить информацию о категории товаров там. Мне нужно знать структуру get_cart массива() возвращает, так что я написал:

function check_whether_item_has_the_category() { 
    global $woocommerce; 

    var_dump(WC()->cart->get_cart()); 
} 

И получил

Warning: Invalid argument supplied for foreach() in ...wp-content\plugins\woocommerce\includes\class-wc-shipping.php on line 295 

Затем я попытался найти название категории в результатах get_cart() функции:

function check_whether_item_has_the_category() { 
    global $woocommerce; 

    if(in_array('used', WC()->cart->get_cart())) { 
     echo 'do something'; 
    } 
} 

И получил ту же ошибку.

Использование $ WooCommerce вместо WC() ничего не дают, а также удалить из global $woocommerce

Что я делаю неправильно и как я могу получить элементы категории (или проверить их на существующие конкретного одного)?

+0

что, если у вас есть более чем один продукт в корзину с различными категориями, если фиксированная ставка по-прежнему будет снята с охраны? – d79

+0

Да, если есть хотя бы один продукт с категорией, то фиксированная ставка должна быть отменена. –

ответ

1

Переменная $package содержит также содержимое корзины ($package['contents']), то есть массив со всеми продуктами в корзине.

Итак, вы можете пройти через это и посмотреть, есть ли у одного продукта требуемая категория. Для получения категории можно использовать wp_get_post_terms():

function remove_flat_rate_from_used_products($rates, $package) { 

    // for each product in cart... 
    foreach ($package['contents'] as $product) { 
     // get product categories 
     $product_cats = wp_get_post_terms($product['product_id'], 'product_cat', array('fields' => 'names')); 
     // if it has category_name unset flat rate 
     if(in_array('category_name', $product_cats)) { 
      unset($rates['flat_rate']); 
      break; 
     } 
    } 

    return $rates; 
} 
+0

Спасибо, это хорошее решение. Он должен отлично работать в описанной ситуации. Я разработал аналогичное решение методом проб и ошибок и провел около 3 часов. Кроме того, была ошибка, что я попытался использовать условные теги WooCommerce в functions.php. –

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