Woocommerce: detecte onde o botão Adicionar ao carrinho foi clicado e execute um código diferente

10

Na loja de comércio eletrônico:

  • Existem itens exibidos na página inicial e cada um deles possui um botão "Adicionar ao carrinho" abaixo deles. Quando este botão é clicado, o item é adicionado ao carrinho. Se esse botão for clicado novamente, a quantidade do item que já existe no carrinho será incrementada em 1. Acredito que esse seja o loop . Por enquanto, tudo bem.

  • Na página Produto único, há um botão "Adicionar ao carrinho". Quando este botão é clicado, o item é adicionado ao carrinho. Há também uma caixa de texto de entrada Quantidade que pode ser usada para alterar a quantidade. Isso também está bem.

O PROBLEMA:

Preciso diferenciar o botão "Adicionar ao carrinho" que foi clicado no loop (atualmente na página inicial, mas também pode ser usado em outras páginas, como a página de arquivo morto, etc.) vs o botão "Adicionar ao carrinho" que foi clicado na página Produto Único. Com base nessa diferenciação, aqui está o que eu preciso fazer:

  • Se o botão "Adicionar ao carrinho" que aparece no loop foi clicado, pegue a quantidade deste item que já existe no carrinho usando o $cart_item_key, incremente-o em 1 e envie-o para uma função personalizada que fará um processamento adicional e salvará os detalhes ao carrinho novamente.
  • Se clicar no botão "Adicionar ao carrinho" que aparece na página Produto único, pegue a quantidade deste item que já existe no carrinho usando o $cart_item_key, multiplique-o por 3 e envie-o para uma função personalizada que fará processamento e economia adicionais os detalhes ao carrinho novamente.
  • Nos dois casos acima, a Quantidade está sendo alterada, com base em diferentes lógicas, e essa Quantidade precisa ser enviada para uma chamada de função personalizada.

O QUE TENTEI:

Eu tentei o seguinte código:

add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);

    // NEED TO RUN CUSTOM CODE HERE BASED ON THE CHECKS
    if (add to cart within loop is clicked) {
        // Get existing $quantity_from_cart from cart using $cart_item_key, but how???? 
        $new_quantity = $quantity_from_cart + 1;
    }
    else if (add to cart on single product page is clicked) {
        // Get existing $quantity_from_cart from cart using $cart_item_key, but how????
        $new_quantity = $quantity_from_cart * 3;
    }
    // Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
    my_custom_function($new_quantity, $cart_item_key);
}


function my_custom_function($new_quantity, $cart_item_key)
{
    echo $new_quantity;

    WC()->cart->cart_contents[$cart_item_key]['custom_quantity'] = $new_quantity;
    WC()->cart->set_session();
}

O problema com o código acima é que, se eu não tiver a if... else if...lógica, o código será executado independentemente da localização do botão "Adicionar ao carrinho". Em outras palavras, se clico no botão "Adicionar ao carrinho" localizado no loop (página inicial, página Archive ou qualquer página que use o loop) ou clico no botão "Adicionar ao carrinho" localizado na página Produto único, o código acima é executado na ausência da if... else if...lógica.

Portanto, desejo executar um código separado quando o botão "Adicionar ao carrinho" localizado no loop for clicado (independentemente da sua localização, se Homepage, arquivos etc.) e executar um código diferente quando o botão "Adicionar ao carrinho" localizado na página Produto Único é clicado. Como posso conseguir isso?

Esperando algo assim:

  • Se o botão que aparece dentro do loop for clicado -> Faça isso.
  • Se o botão que aparece na página Produto único for clicado -> Faça isso.
Devner
fonte

Respostas:

1

você pode usar wp_get_referer ou check_ajax_referer () por exemplo:

function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);
    $referer = wp_get_referer();
    // HOMEPAGE
    if (strpos($referer ,'http://yourwebsite.com/') !== false) { 
        $new_quantity = $quantity_from_cart + 1;
    }
    //from some product page like http://yourwebsite.com/product/my-product-page
    else if (strpos($referer ,'http://yourwebsite.com/product/') !== false) {
        $new_quantity = $quantity_from_cart * 3;
    }
    // Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
    my_custom_function($new_quantity, $cart_item_key);
}

Consulte: Funções relacionadas ao Wordpress Nonces

Ronak Dhoot
fonte
As verificações manuais da página inicial, da página do produto etc. são um exagero. Estou tentando não codificar os nomes das páginas e, em vez disso, o WP lida com isso internamente.
Devner 22/01
1

Você pode tentar desta maneira:

add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    $cart = WC()->cart->get_cart();
    $product = wc_get_product($product_id);
    $referer = $_SERVER['HTTP_REFERER'];
    $route = parse_url( $referer );
    $path = $route['path'] ?? 'home' ;
    $args = array_filter( ( explode('/', $path) ) );
    if (in_array( 'product', $args) ) {
        // Product Page
    } elseif (in_array('product-category', $args)) {
        // Product Category
    } else {
        // Default
    }
}

Mas você precisa verificar suas configurações. Settings > Permalinks.

Dmitry
fonte
As verificações manuais da página inicial, da página do produto etc. são um exagero. Estou tentando não codificar os nomes das páginas e, em vez disso, o WP lida com isso internamente.
Devner 23/01
1

você pode usar is_product(), is_product_category()função

function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);

    if ( is_product() ) {
    global $product;
    $id = $product->get_id();
    foreach ( WC()->cart->get_cart() as $cart_item ) { 
       if($cart_item['product_id'] == $id ){
           $quantity_from_cart =  $cart_item['quantity'];
           break; // stop the loop if product is found
       }
     }

        $new_quantity = $quantity_from_cart * 3;
    }
  else if (is_product_category()) {
        $new_quantity = $quantity_from_cart + 1;
    }
    my_custom_function($new_quantity, $cart_item_key);
}
RBT
fonte
Eu cansei sua solução. Quando estou na página Produto Único e adicionei o produto ao carrinho, esperava que o código $new_quantity = $quantity_from_cart * 3;funcionasse. Mas isso não acontece. Simplesmente incrementa a quantidade atual existente no carrinho, mas NÃO multiplica a quantidade por 3 . Como consertar isto?
Devner 23/01
Experimente agora Multiplicará a quantidade por 3
RBT 24/01
Acabei de experimentar sua solução revisada. Mas de alguma forma, o resultado é o mesmo que o meu comentário anterior. Parece que, por algum motivo estranho, o código NÃOif ( is_product() ) está sendo executado. Não consigo encontrar o motivo! Importa que seja um botão AJAX Add to Cart ??
Devner 24/01
0

Existem algumas soluções em que eu poderia pensar. Mas aqui está um:

add_action( 'woocommerce_after_add_to_cart_button', 'rmg_woocommerce_after_add_to_cart_button' );
function rmg_woocommerce_after_add_to_cart_button() {
    $button_location = 0;
    // if (is_home() || is_front_page()) {
    //     // we're at the home page
    //     $button_location = 1;
    // }
    if (is_product()) {
        // where at product page
        $button_location = 2;
    } else {
        // pages other than product page
        $button_location = 1;
    }
    echo '<input type="hidden" name="button-location" value="'. $button_location .'" />';
}

Poderíamos adicionar uma entrada oculta dentro do formulário, que o código acima faz.
Em seguida, pode verificar o seu valor como:

$button_location = $_REQUEST['button-location'];
if ($button_location && $button_location === 2) {
    // add to cart button clicked at or came from product page..
    $new_quantity = $quantity_from_cart + 1;
}

Observe que isso é apenas uma idéia e não uma solução completa ... Você precisa cuidar do botão ajax.

Reigel
fonte
Parece que, por algum motivo estranho, o código if (is_product ()) NÃO está sendo executado. Não consigo encontrar o motivo! Importa que seja um botão AJAX Add to Cart ??
Devner 25/01
com ajax, você precisa passar o valor de $button_locationna solicitação ..
Reigel 26/01