Woocommerce: Ermitteln Sie, wo auf die Schaltfläche In den Warenkorb geklickt wurde, und führen Sie einen anderen Code aus

10

Im E-Commerce-Shop:

  • Auf der Startseite werden Artikel angezeigt, und unter jedem Artikel befindet sich eine Schaltfläche "In den Warenkorb". Wenn Sie auf diese Schaltfläche klicken, wird der Artikel in den Warenkorb gelegt. Wenn Sie erneut auf diese Schaltfläche klicken, wird die Menge des Artikels, der bereits im Warenkorb vorhanden ist, um 1 erhöht. Ich glaube, dies ist die Schleife . So weit, ist es gut.

  • Auf der Seite "Einzelprodukt" befindet sich die Schaltfläche "In den Warenkorb". Wenn Sie auf diese Schaltfläche klicken, wird der Artikel in den Warenkorb gelegt. Es gibt auch ein Textfeld für die Mengeneingabe, in dem die Menge geändert werden kann. Das ist auch gut so.

DIE ANGELEGENHEIT:

Ich muss zwischen der Schaltfläche "In den Warenkorb", auf die innerhalb der Schleife geklickt wurde (derzeit auf der Startseite, kann aber auch auf anderen Seiten wie der Archivseite usw. verwendet werden) und der Schaltfläche "In den Warenkorb", auf die geklickt wurde, unterscheiden auf der Seite Einzelprodukt. Aufgrund dieser Unterscheidung muss ich Folgendes tun:

  • Wenn auf die Schaltfläche "In den Warenkorb" geklickt wurde, die in der Schleife angezeigt wird, nehmen Sie die Menge dieses Artikels, der bereits im Warenkorb vorhanden ist, mit $cart_item_key, erhöhen Sie sie um 1 und senden Sie diese an eine benutzerdefinierte Funktion, die zusätzliche Verarbeitung durchführt und die Details speichert wieder karren.
  • Wenn Sie auf die Schaltfläche "In den Warenkorb" auf der Seite "Einzelprodukt" geklickt haben, nehmen Sie die Menge dieses Artikels, der bereits im Warenkorb vorhanden ist, mit $cart_item_key, multiplizieren Sie sie mit 3 und senden Sie diese an eine benutzerdefinierte Funktion, die zusätzliche Verarbeitung und Speicherung durchführt die Details wieder in den Warenkorb.
  • In beiden oben genannten Fällen wird die Menge basierend auf unterschiedlichen Logiken geändert, und diese Menge muss an einen benutzerdefinierten Funktionsaufruf gesendet werden.

WAS ICH VERSUCHT HABE:

Ich habe den folgenden Code ausprobiert:

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

Das Problem mit dem obigen Code ist, dass, wenn ich die if... else if...Logik nicht habe , der Code ausgeführt wird, unabhängig davon, wo sich die Schaltfläche "In den Warenkorb" befindet. Mit anderen Worten, ob ich auf die Schaltfläche "In den Warenkorb" klicke, die sich in der Schleife befindet (Startseite, Archivseite oder eine Seite, die die Schleife verwendet), oder auf die Schaltfläche "In den Warenkorb" auf der Seite "Einzelprodukt". Der obige Code wird in Abwesenheit der if... else if...Logik ausgeführt.

Daher möchte ich separaten Code ausführen, wenn auf die Schaltfläche "In den Warenkorb" in der Schleife geklickt wird (unabhängig von der Position, ob Startseite, Archiv usw.), und anderen Code ausführen, wenn auf die Schaltfläche "In den Warenkorb" geklickt wird Klicken Sie auf die Seite Einzelprodukt. Wie kann ich das erreichen?

Erwarten Sie so etwas:

  • Wenn auf die Schaltfläche in der Schleife geklickt wird -> Tun Sie dies.
  • Wenn auf der Seite Einzelprodukt die Schaltfläche angezeigt wird, klicken Sie auf -> Tun Sie dies.
Devner
quelle

Antworten:

1

Sie können beispielsweise wp_get_referer oder check_ajax_referer () verwenden :

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

Weitere Informationen finden Sie unter Wordpress Nonces-bezogene Funktionen

Ronak Dhoot
quelle
Die manuellen Überprüfungen für die Homepage, die Produktseite usw. sind ein Overkill. Ich versuche, die Seitennamen nicht fest zu codieren, sondern WP intern damit zu beauftragen.
Devner
1

Sie können dies folgendermaßen versuchen:

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

Sie müssen jedoch Ihre Einstellungen überprüfen. Settings > Permalinks.

Dmitry
quelle
Die manuellen Überprüfungen für die Homepage, die Produktseite usw. sind ein Overkill. Ich versuche, die Seitennamen nicht fest zu codieren, sondern WP intern damit zu beauftragen.
Devner
1

Sie können verwenden is_product(), is_product_category()Funktion

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
quelle
Ich habe deine Lösung satt. Als ich mich auf der Seite "Einzelprodukt" befand und das Produkt in den Warenkorb legte, erwartete ich, dass der Code $new_quantity = $quantity_from_cart * 3;funktioniert. Aber das tut es nicht. Es erhöht einfach die aktuell vorhandene Menge im Warenkorb, multipliziert die Menge jedoch NICHT mit 3 . Wie kann ich das beheben?
Devner
Try Now multipliziert die Menge mit 3
RBT
Ich habe gerade Ihre überarbeitete Lösung ausprobiert. Aber irgendwie ist das Ergebnis das gleiche wie mein vorheriger Kommentar. Es scheint so , dass aus irgendeinem seltsamen Grund, der Code if ( is_product() )wird nicht ausgeführt wird. Ich kann den Grund dafür nicht finden! Ist es wichtig, dass es sich um eine AJAX-Schaltfläche zum Hinzufügen zum Warenkorb handelt?
Devner
0

Es gibt einige Lösungen, die ich mir vorstellen kann. Aber hier ist einer:

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

Wir könnten eine versteckte Eingabe in das Formular einfügen, die der obige Code ausführt.
Dann könnte der Wert wie folgt überprüft werden:

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

Bitte beachten Sie, dass dies nur eine Idee und keine vollständige Lösung ist ... Sie müssen sich um die Ajax-Taste kümmern.

Reigel
quelle
Aus irgendeinem seltsamen Grund scheint der Code if (is_product ()) NICHT ausgeführt zu werden. Ich kann den Grund dafür nicht finden! Ist es wichtig, dass es sich um eine AJAX-Schaltfläche zum Hinzufügen zum Warenkorb handelt?
Devner
Mit Ajax müssen Sie den Wert von $button_locationin der Anfrage übergeben.
Reigel