Я пытаюсь сделать следующее:
Клиент добавляет продукт с количеством «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-го» элемента и рассматривать его отдельно.
Я попробовал почти каждый фильтр, связанный с корзиной, который я мог найти, ища в документах WooCommerce, делая массовую находку в Sublime в папке плагинов woocommerce для «корзины обновлений», «корзины» и т. Д., Но я боюсь, m не совсем уверен, что использовать. Я больше всего работал над этим:
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; }
Здесь я просматриваю объект тележки, проверяя, больше ли количество, и если я назначаю новый ключ. Я действительно не знаю, правильно ли я поступаю, или если я полностью не в курсе, поэтому любые указатели будут действительно оценены.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и я постараюсь предоставить все, что могу.
Большое спасибо.
Ваш фильтр 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 <mike@bizbudding.com> * * @return void */ add_action( 'woocommerce_add_to_cart', 'mai_split_multiple_quantity_products_to_separate_cart_items', 10, 5 ); 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 ); } } }
Есть крючок фильтра woocommerce_update_cart_validation