Woocommerce: rileva dove è stato fatto clic sul pulsante Aggiungi al carrello ed esegui codice diverso


10

Nel negozio di e-commerce:

  • Ci sono articoli visualizzati sulla Homepage e ognuno di essi ha un pulsante "Aggiungi al carrello" sotto di essi. Quando si fa clic su questo pulsante, l'articolo viene aggiunto al carrello. Se si fa di nuovo clic su questo pulsante, la quantità dell'articolo già esistente nel carrello viene incrementata di 1. Credo che questo sia il ciclo . Fin qui tutto bene.

  • Nella pagina del singolo prodotto, c'è un pulsante "Aggiungi al carrello". Quando si fa clic su questo pulsante, l'articolo viene aggiunto al carrello. Esiste anche una casella di testo di input Quantità che può essere utilizzata per modificare la quantità. Anche questo va bene.

IL PROBLEMA:

Devo distinguere tra il pulsante "Aggiungi al carrello" su cui è stato fatto clic all'interno del ciclo (attualmente nella home page, ma che può essere utilizzato anche su altre pagine come la pagina Archivio, ecc.) Rispetto al pulsante "Aggiungi al carrello" su cui è stato fatto clic nella pagina del singolo prodotto. Sulla base di questa differenziazione, ecco cosa devo fare:

  • Se è stato fatto clic sul pulsante "Aggiungi al carrello" visualizzato nel ciclo, prendi la quantità di questo articolo che è già esistente nel carrello usando il $cart_item_key, incrementalo di 1 e invialo a una funzione personalizzata che eseguirà un'ulteriore elaborazione e salverà i dettagli al carrello di nuovo.
  • Se è stato fatto clic sul pulsante "Aggiungi al carrello" visualizzato nella pagina del singolo prodotto, prendi la quantità di questo articolo già esistente nel carrello utilizzando il $cart_item_key, moltiplicalo per 3 e invialo a una funzione personalizzata che eseguirà ulteriori elaborazioni e risparmi i dettagli per il carrello di nuovo.
  • In entrambi i casi precedenti, la quantità viene modificata in base a logiche diverse e questa quantità deve essere inviata a una chiamata di funzione personalizzata.

COSA HO PROVATO:

Ho provato il seguente codice:

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();
}

Il problema con il codice sopra è che se non ho la if... else if...logica, il codice viene eseguito indipendentemente da dove si trova il pulsante "Aggiungi al carrello". In altre parole, sia che io faccia clic sul pulsante "Aggiungi al carrello" che si trova nel ciclo (Pagina iniziale, Pagina di archivio o qualsiasi pagina che utilizza il ciclo) o che faccia clic sul pulsante "Aggiungi al carrello" situato nella pagina del singolo prodotto, il codice sopra viene eseguito in assenza della if... else if...logica.

Quindi, voglio eseguire un codice separato quando si fa clic sul pulsante "Aggiungi al carrello" che si trova nel loop (indipendentemente dalla sua posizione, sia Home page, Archivi, ecc.) Ed eseguire codice diverso quando il pulsante "Aggiungi al carrello" che si trova nella pagina del singolo prodotto viene cliccato. Come posso raggiungere questo obiettivo?

Mi aspettavo qualcosa del genere:

  • Se si fa clic sul pulsante che appare all'interno del loop -> Esegui.
  • Se si fa clic sul pulsante visualizzato nella pagina Prodotto singolo -> Fallo.

Risposte:


1

puoi usare wp_get_referer o check_ajax_referer () per esempio:

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);
}

Consultare: Funzioni correlate a Wordpress Nonces


I controlli manuali per la home page, la pagina del prodotto, ecc. Sono eccessivi. Sto cercando di non codificare i nomi delle pagine e piuttosto che WP lo gestisca internamente.
Devner, il

1

Puoi provare in questo modo:

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
    }
}

Ma devi controllare le tue impostazioni. Settings > Permalinks.


I controlli manuali per la home page, la pagina del prodotto, ecc. Sono eccessivi. Sto cercando di non codificare i nomi delle pagine e piuttosto che WP lo gestisca internamente.
Devner,

1

puoi usare is_product(), is_product_category()funzione

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);
}

Ho stanco la tua soluzione. Quando mi trovo nella pagina del singolo prodotto e ho aggiunto il prodotto al carrello, mi aspettavo che il codice $new_quantity = $quantity_from_cart * 3;funzionasse. Ma non lo fa. Aumenta semplicemente l'attuale quantità esistente nel carrello, ma NON moltiplica la quantità per 3 . Come risolvere questo?
Devner,

Prova ora moltiplicherà la quantità per 3
RBT

Ho appena provato la tua soluzione rivista. Ma in qualche modo, il risultato è lo stesso del mio commento precedente. Sembra che per qualche strana ragione, il codice if ( is_product() )viene non viene eseguito. Non riesco a trovare il motivo per cui! Importa che si tratta di un pulsante Aggiungi al carrello AJAX ??
Devner,

0

Ci sono soluzioni di coppia che mi vengono in mente. Ma eccone uno:

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 .'" />';
}

Potremmo aggiungere un input nascosto all'interno del modulo, che il codice sopra lo fa.
Quindi potrebbe controllare il suo valore come:

$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;
}

Nota che questa è solo un'idea e non una soluzione completa ... Devi occuparti del pulsante Ajax.


Sembra che per qualche strana ragione, il codice if (is_product ()) NON venga eseguito. Non riesco a trovare il motivo per cui! Importa che si tratta di un pulsante Aggiungi al carrello AJAX ??
Devner

con ajax, devi passare il valore di $button_locationnella richiesta ..
Reigel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.