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

#php #wordpress #woocommerce #product #cart

Вопрос:

У меня есть только один продукт («тестаре-психологика»). Когда покупатель покупает его, он должен связать этот продукт с дополнительной информацией (конкретным названием «тест»), которая повлияет на цену. Я не хочу использовать переменные продукты, потому что этих «тестовых» названий будет много, поэтому переменные продукты для меня не очень удобны. В этой ситуации я решил добавить этот продукт несколько раз как отдельные элементы, но с разными названиями «тест».

 add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 ); function add_cart_simple_product_custom_price( $cart_item_data, $product_id ) {  //add selected test ID to 'testare-psihologica' cart item  if( isset( $_GET['test'] ) ) {  $test_id = get_page_by_path( $_GET['test'], OBJECT, 'tests' )-gt;ID;  $test_title = get_post_field( 'post_title', $test_id );  $cart_item_data['test_title'] = $test_title;  }   // add product to cart multiple times, but as different items  $unique_cart_item_key = md5( microtime() . rand() );  $cart_item_data['unique_key'] = $unique_cart_item_key;   return $cart_item_data; }  

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

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

введите описание изображения здесь

Я хочу этого:

введите описание изображения здесь

И я хочу сделать это программно. Как этого можно достичь?

Ответ №1:

Похоже, что следующие строки кода являются избыточными:

 $unique_cart_item_key = md5( microtime() . rand() ); $cart_item_data['unique_key'] = $unique_cart_item_key;  

Поэтому, чтобы ответить на ваш вопрос, вы можете просто удалить эти строки


Поскольку у меня нет тех же данных get, которые вы используете в своем ответе, я сделал доказательство концепции, разделенное на 3 шага:

1. Добавьте поле ввода перед кнопкой «Добавить в корзину» на странице одного товара.

 function action_woocommerce_before_add_to_cart_button() {  // Add a new input field, allowing the customer to set "test"  echo 'lt;div class="my-div"gt;lt;input type="text" id="test" name="test"gt;lt;/divgt;'; } add_action( 'woocommerce_before_add_to_cart_button', 'action_woocommerce_before_add_to_cart_button' );  

2. Добавьте значение «тест» в товар корзины.

 function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {   // Add test to cart item  if ( ! empty ( $_POST[ 'test' ] ) ) {  $cart_item_data['test_title'] = sanitize_text_field( $_POST['test'] );  }    return $cart_item_data;  } add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 10, 3 );  

3. Опционально отображать пользовательские данные на страницах корзины и оформления заказа

 // Optionally display custom data in cart and checkout pages function filter_woocommerce_get_item_data( $cart_data, $cart_item = null ) {  if ( isset( $cart_item['test_title'] ) ) {  $cart_data[] = array(  'name' =gt; 'Test title',  'value' =gt; $cart_item['test_title']  );  }   return $cart_data; } add_filter( 'woocommerce_get_item_data', 'filter_woocommerce_get_item_data', 99, 2 );  

Затем выполните следующие действия на первом шаге:

  • Вставьте group1 как значение и нажмите кнопку добавить в корзину
  • Вставьте group2 как значение и нажмите кнопку добавить в корзину
  • Вставьте group1 как значение и нажмите кнопку добавить в корзину

Продукт со значением group1 будет автоматически сгруппирован на основе соответствующего значения:

Результат

Комментарии:

1. Очень интересно! «Лишние» строки кода не нужны из-за шага 2, когда добавленный элемент действительно изменен! Если добавленный элемент никоим образом не изменен, но вы все равно хотите добавить его несколько раз как отдельные элементы, они вам нужны!? Я узнал кое-что новое! Большое спасибо! Хороший ответ!

2. @IurieMalai «Если добавленный элемент никоим образом не изменен, но вы все равно хотите добавить его несколько раз как отдельные элементы, они вам нужны!?» — Да, именно!