Woocommerce: detecte dónde se hizo clic en el botón Agregar al carrito y ejecute un código diferente

10

En la tienda de comercio electrónico:

  • Hay elementos que se muestran en la página de inicio y cada uno de ellos tiene un botón "Agregar al carrito" debajo de ellos. Cuando se hace clic en este botón, el artículo se agrega al carrito. Si se vuelve a hacer clic en este botón, la Cantidad del artículo que ya existe en el carrito se incrementa en 1. Creo que este es el ciclo . Hasta aquí todo bien.

  • En la página Single Product, hay un botón "Agregar al carrito". Cuando se hace clic en este botón, el artículo se agrega al carrito. También hay un cuadro de texto de entrada de Cantidad que se puede usar para cambiar la cantidad. Esto también está bien.

LA CUESTIÓN:

Necesito diferenciar entre el botón "Agregar al carrito" en el que se hizo clic dentro del bucle (actualmente en la página de inicio, pero también se puede usar en otras páginas como la página Archivo, etc.) frente al botón "Agregar al carrito" en el que se hizo clic en la página de un solo producto. En base a esta diferenciación, esto es lo que necesito hacer:

  • Si se hizo clic en el botón "Agregar al carrito" que aparece dentro del bucle, tome la Cantidad de este artículo que ya existe en el carrito $cart_item_key, increméntelo en 1 y envíelo a una función personalizada que realizará un procesamiento adicional y guardará los detalles Al carro de nuevo.
  • Si se hizo clic en el botón "Agregar al carrito" que aparece en la página del Producto único, tome la Cantidad de este artículo que ya existe en el carrito usando $cart_item_key, multiplíquelo por 3 y envíelo a una función personalizada que realizará un procesamiento adicional y guardará Los detalles al carrito de nuevo.
  • En los dos casos anteriores, la cantidad se cambia, en función de diferentes lógicas y esta cantidad debe enviarse a una llamada de función personalizada.

Lo que intenté:

Intenté el siguiente 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();
}

El problema con el código anterior es que si no tengo la if... else if...lógica, entonces el código se ejecuta independientemente de dónde se encuentre el botón "Agregar al carrito". En otras palabras, si hago clic en el botón "Agregar al carrito" que se encuentra en el bucle (página de inicio, página de archivo o cualquier página que use el bucle) o si hago clic en el botón "Agregar al carrito" ubicado en la página del Producto único, el código anterior se ejecuta en ausencia de la if... else if...lógica.

Por lo tanto, quiero ejecutar un código separado cuando se hace clic en el botón "Agregar al carrito" que se encuentra en el bucle (independientemente de su ubicación, ya sea Página de inicio, Archivos, etc.) y ejecutar un código diferente cuando se hace clic en el botón "Agregar al carrito" que se encuentra en la página Producto único se hace clic. ¿Cómo puedo conseguir esto?

Esperando algo como esto:

  • Si se hace clic en el botón que aparece dentro del bucle -> Haga esto.
  • Si se hace clic en el botón que aparece en la página Single Product -> Haz eso.
Devner
fuente

Respuestas:

1

puede usar wp_get_referer o check_ajax_referer () por ejemplo:

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: funciones relacionadas con Wordpress Nonces

Ronak Dhoot
fuente
Las verificaciones manuales de la página de inicio, la página del producto, etc. son excesivas. Estoy tratando de no codificar los nombres de las páginas y prefiero que WP lo maneje internamente.
Devner
1

Puedes probar de esta manera:

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

Pero necesita verificar su configuración. Settings > Permalinks.

Dmitry
fuente
Las verificaciones manuales de la página de inicio, la página del producto, etc. son excesivas. Estoy tratando de no codificar los nombres de las páginas y prefiero que WP lo maneje internamente.
Devner
1

puedes usar is_product(), is_product_category()función

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
fuente
Cansé tu solución. Cuando estoy en la página de Producto único y agregué el producto al carrito, esperaba que el código $new_quantity = $quantity_from_cart * 3;funcionara. Pero no lo hace. Simplemente incrementa la cantidad actual existente en el carrito, pero NO multiplica la cantidad por 3 . ¿Cómo arreglar esto?
Devner
Pruébelo ahora multiplicará la cantidad por 3
RBT
Acabo de probar su solución revisada. Pero de alguna manera, el resultado es el mismo que mi comentario anterior. Parece que por alguna extraña razón, el código if ( is_product() )es NO está ejecutando. ¡Parece que no puedo encontrar el motivo! ¿Importa que sea un botón AJAX Añadir al carrito?
Devner
0

Hay dos soluciones que se me ocurren. Pero aquí hay 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 .'" />';
}

Podríamos agregar una entrada oculta dentro del formulario, que el código anterior lo hace.
Luego podría verificar su 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;
}

Tenga en cuenta que esto es solo una idea y no una solución completa ... Debe cuidar el botón ajax.

Reigel
fuente
Parece que por alguna extraña razón, el código if (is_product ()) NO se está ejecutando. ¡Parece que no puedo encontrar el motivo! ¿Importa que sea un botón AJAX Añadir al carrito?
Devner
con ajax, debe pasar el valor de $button_locationen la solicitud ..
Reigel