2015-09-09 2 views
3

Я пытаюсь сделать следующее:WooCommerce - Treat корзины товаров отдельно, если количество больше чем 1

клиентом добавляет продукт с величиной «1» в корзину (поле количество было удалено на страниц одного продукта, поэтому можно добавить только 1).

Если тот же продукт с теми же вариантами добавляется снова, вместо увеличения количества до «2» он добавляет его как отдельный продукт.

Мне удалось сделать это выше с фильтром ниже, который я нашел на форумах WordPress.

add_filter('woocommerce_add_cart_item_data', 'force_separate_item_add', 10, 2); 
function force_separate_item_add($cart_item_data, $product_id) { 

    $unique_cart_item_key = md5(microtime().rand()."Hi Mom!"); 
    $cart_item_data['unique_key'] = $unique_cart_item_key; 

    return $cart_item_data; 
} 

объяснение Парень был очень хорошим, и я понимаю: «Когда элемент будет добавлен в корзину, а„ключ“для этого отдельного элемента в корзине создается на основе элемента добавляются и связанные с ним метаданные. Если элемент и его метаданные идентичны другому элементу в корзине, то сгенерированный ключ будет также идентичным, и количество элемента, уже находящегося в корзине, будет просто увеличиваться добавлением количества ".

Приведенный выше код просто добавляет новый ключ, а затем тележка обрабатывает их как отдельные записи.

То, что я пытаюсь сделать сейчас, это найти подходящий фильтр для этого, когда количество будет изменено через корзину. Поэтому, если клиент изменяет количество на «2», он будет генерировать новый ключ для «2-го» элемента и рассматривать его отдельно.

Я пробовал почти каждый связанный фильтр «cart», который я мог найти, ища в документах WooCommerce, делая массовую находку в Sublime в папке плагинов woocommerce для «корзины обновлений», «cart» и т. Д., Но я Боюсь, я не уверен, что использовать. Один я работал больше всего это один:

add_action('woocommerce_before_calculate_totals', 'change_cart_item_price'); 
function change_cart_item_price($cart_object) { 

    global $woocommerce; 

    foreach ($woocommerce->cart->cart_contents as $cart_key => $cart_item_array) {   
     if($cart_item_array['quantity'] > 1) { 
      $cart_item_key = md5(microtime().rand()."Hi Mom!"); 
      $cart_item_data['unique_key'] = $cart_item_key; 

      $woocommerce->cart->set_quantity($cart_item_key, '1'); 
     } 
    } 

    return $cart_object; 
} 

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и я постараюсь предоставить все, что могу.

Большое спасибо.

ответ

1

woocommerce_add_cart_item_data Вашего фильтр был отличным стартом для меня. Я закончил тем, что оставил это как есть и перешел к крюку woocommerce_add_to_cart для ручного процесса.

Это тонкая версия того, что в настоящее время работает для меня.

/** 
* This hook runs at the end of the default add to cart processes, when you try to add an item to cart. 
* If trying to add more than item to the cart, separate them into individual cart items 
* 
* @author Mike Hemberger <[email protected]> 
* 
* @return void 
*/ 
add_action('woocommerce_add_to_cart', 'mai_split_multiple_quantity_products_to_separate_cart_items', 10, 6); 
function mai_split_multiple_quantity_products_to_separate_cart_items($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { 

    // If product has more than 1 quantity 
    if ($quantity > 1) { 

     // Keep the product but set its quantity to 1 
     WC()->cart->set_quantity($cart_item_key, 1); 

     // Run a loop 1 less than the total quantity 
     for ($i = 1; $i <= $quantity -1; $i++) { 
      /** 
      * Set a unique key. 
      * This is what actually forces the product into its own cart line item 
      */ 
      $cart_item_data['unique_key'] = md5(microtime() . rand() . "Hi Mom!"); 

      // Add the product as a new line item with the same variations that were passed 
      WC()->cart->add_to_cart($product_id, 1, $variation_id, $variation, $cart_item_data); 
     } 

    } 

} 
0

Там в фильтре крючок woocommerce_update_cart_validation

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