Este script lê o carrinho, verifica se os dois produtos estão presentes e adiciona outro diferente dos demais. A adição da quantidade do novo produto depende da quantidade dos demais.
Este script parece funcionar, mas o carregamento da página sofre um problema de exibição, pois a barra de rolagem desaparece e, portanto, não é possível navegar bem, se o produto gratuito for adicionado pelo script add_to_cart
add_action( 'template_redirect', 'pro_gift', 9);
function pro_gift() {
if (is_cart()) {
if ( sizeof( WC()->cart->get_cart() ) > 0) {
$items_gift = WC()->cart->get_cart();
$product_id = 33103;
$product_ids = 33093;
$product_id_gift = 34462;
$product_id_size = 0;
$product_ids_size = 0;
$product_id_gift_size = 0;
$product_id_gift_item = '';
foreach($items_gift as $item_gift_k => $item_gift_v) {
if ($item_gift_v['product_id'] == $product_id ) {
$product_id_size = $item_gift_v['quantity'];
}
if ($item_gift_v['product_id'] == $product_ids ) {
$product_ids_size = $item_gift_v['quantity'];
}
if ($item_gift_v['product_id'] == $product_id_gift ) {
$product_id_gift_size = $item_gift_v['quantity'];
$product_id_gift_item = $item_gift_k;
}
}
//echo '<!-- addo= p' .$product_gift. ' i' .$product_id_size. ' ids' .$product_ids_size. ' ig' .$product_id_gift_size. ' -->';
if ($product_id_size > 0 && $product_ids_size > 0) {
$product_gift = min($product_id_size, $product_ids_size);
if ($product_gift > 0 && $product_id_gift_size == 0) {
WC()->cart->add_to_cart( $product_id_gift, $product_gift);
}
elseif ($product_gift > 0 && $product_id_gift_size > 0 && $product_id_gift_size < $product_gift) {
WC()->cart->set_quantity($product_id_gift_item, $product_gift);
}
}
}
}
}
Além do script acima, então vou tornar os novos produtos adicionados gratuitos com base na quantidade dos solicitados
add_action( 'woocommerce_cart_calculate_fees', 'pro_gift_d', 10 );
function pro_gift_d() {
if (is_cart() || is_checkout()) {
if ( sizeof( WC()->cart->get_cart() ) > 0) {
$items_gift = WC()->cart->get_cart();
$product_id = 33103;
$product_ids = 33093;
$product_id_gift = 34462;
$product_id_size = 0;
$product_ids_size = 0;
$product_id_gift_size = 0;
$product_gift_line = 0;
foreach($items_gift as $item_gift_k => $item_gift_v) {
if ($item_gift_v['product_id'] == $product_id ) {
$product_id_size = $item_gift_v['quantity'];
}
if ($item_gift_v['product_id'] == $product_ids ) {
$product_ids_size = $item_gift_v['quantity'];
}
if ($item_gift_v['product_id'] == $product_id_gift ) {
$product_id_gift_size = $item_gift_v['quantity'];
$product_gift_line = $item_gift_v['line_total'] / $product_id_gift_size;
}
}
if ($product_id_size > 0 && $product_ids_size > 0 && $product_id_gift_size > 0) {
$product_gift = min($product_id_size, $product_ids_size);
$product_gift_discount = $product_gift_line * $product_gift;
WC()->cart->add_fee( __('PROMO PRODOTTO GRATUITO', 'woocommerce'), -$product_gift_discount);
}
}
}
}
Esses scripts parecem funcionar bem, adicionando um produto ao carrinho se houver dois outros produtos e fazendo isso com base na quantidade deles. Mas, como já mencionado, se o produto gratuito ainda não estiver presente no carrinho e, portanto, for adicionado com esta parte do script "WC()->cart->add_to_cart( $product_id_gift, $product_gift);", a barra de rolagem desaparece e não é possível navegar.
O que fiz de errado? E como o código poderia ser melhorado?
Mova sua lógica para um gancho posterior e mais seguro como
woocommerce_before_calculate_totals