Так в одной функции этого не сделаешь
- В момент добавления товара Вам нужно добавить еще один товар.
- Для учета стоимости подарка можно добавить скидку к заказу.
- Продумать вариант удаления подарка, если пользователь удалит основной товар.
Как пример ниже. Взято с реального проекта. Т.к. акция была разовая, я не заморачивался с настройками и зашил идентификаторы жестко в коде.
Добавляется подарочный товар "Мяч" если пользователь кладет в корзину любой товар из таксономии "promotion" с id=1280
/**
* Add product id=42444 "ball STORM PRO HB" to cart if added any product from
* promotion 1280
*
* @param $cart_item_key Current cart item key.
* @param $product_id Current product id (parent id for variations).
*
* @throws Exception
*/
function hml_woocommerce_add_to_cart( $cart_item_key, $product_id ) {
$tax = 'promotion';
$term_id = 1280;
if ( ! has_term( $term_id, $tax, $product_id ) ) {
return;
}
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product_in_cart = $cart_item['product_id'];
if ( $product_in_cart === 42444 ) {
return;
}
}
WC()->cart->add_to_cart( 42444, 1, 42450 ); // аргументы: id-товара, кол-во, id-разновидности(вариации)
}
add_action( 'woocommerce_add_to_cart', 'hml_woocommerce_add_to_cart', 10, 2 );
Код ниже заменяет поле выбора количества для подарочного товара, но для того что бы woo мог его обрабатывать делает input скрытым.
/**
* Filter quantity input tag for cart item.
* Actualy replace input tag with const "1" for certain products
*
* @param $product_quantity Default output.
* @param $cart_item_key Current cart item key.
* @param $cart_item Current cart item.
*
* @return string
*/
function hml_woo_cart_item_quantity( $product_quantity, $cart_item_key, $cart_item ) {
$product_in_cart = $cart_item['product_id'];
if ( $product_in_cart === 42444 ) {
$product_quantity = sprintf( '1 <input type="hidden" name="cart[%s][qty]" value="1" />', $cart_item_key );
}
return $product_quantity;
}
add_filter( 'woocommerce_cart_item_quantity', 'hml_woo_cart_item_quantity', 10, 3 );
для добавления скидки (компенсации цены подарочного товара) к заказу можете использовать хук
'woocommerce_cart_calculate_fees'
С Удалением я не заморачивался, поэтому подсказать хук не смогу. надо гуглить.