#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 «Если добавленный элемент никоим образом не изменен, но вы все равно хотите добавить его несколько раз как отдельные элементы, они вам нужны!?» — Да, именно!