Woocommerce: Визначте, де була натиснута кнопка Додати у кошик та запустіть інший код


10

У магазині електронної комерції:

  • На домашній сторінці відображаються предмети, під кожним із яких є кнопка "Додати в кошик". Після натискання цієї кнопки предмет додається в кошик. Якщо цю кнопку знову натиснути, кількість предмета, який вже є у кошику, збільшується на 1. Я вважаю, що це цикл . Все йде нормально.

  • На сторінці "Єдиний товар" є кнопка "Додати в кошик". Після натискання цієї кнопки товар додається в кошик. Існує також текстове поле для введення кількості, яке можна використовувати для зміни кількості. Це теж добре.

ПИТАННЯ:

Мені потрібно розмежувати кнопку "Додати в кошик", яку натискали в циклі (наразі на домашній сторінці, але також можна використовувати на інших сторінках, таких як сторінка архіву тощо), і натиснутою на кнопку "Додати в кошик". на сторінці Єдиного продукту Виходячи з цієї диференціації, ось що мені потрібно зробити:

  • Якщо була натиснута кнопка "Додати в кошик", що відображається в циклі, візьміть кількість цього товару, який вже існує в кошику, використовуючи $cart_item_key , збільште його на 1 і надішліть це на власну функцію, яка зробить додаткову обробку та збереже деталі знову в кошик.
  • Якщо натиснуто кнопку "Додати в кошик", що відображається на сторінці "Єдиний продукт", візьміть кількість цього товару, який вже існує у кошику, за допомогою $cart_item_key, помножте його на 3 та відправте це на спеціальну функцію, яка зробить додаткову обробку та збереження деталі для кошика знову.
  • В обох вищезазначених випадках кількість змінюється на основі різних логік, і цю кількість потрібно надіслати на виклик спеціальної функції.

ЧОМУ Я ПРАВИЛА:

Я спробував наступний код:

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

Проблема з наведеним вище кодом полягає в тому, що якщо я не маю if... else if...логіки, то код виконується незалежно від того, де знаходиться кнопка «Додати в кошик». Іншими словами, чи натискаю кнопку "Додати в кошик", яка знаходиться в циклі (домашня сторінка, сторінка архіву чи будь-яка сторінка, на якій використовується цикл), або натискаю кнопку "Додати в кошик", розташовану на сторінці "Один продукт", вищезазначений код виконується за відсутності if... else if...логіки.

Отже, я хочу запустити окремий код, коли натиснути кнопку "Додати в кошик", яка знаходиться в циклі (незалежно від місця розташування, домашню сторінку, архіви тощо) та запустити інший код, якщо натиснути кнопку "Додати в кошик". що натискається на сторінці "Єдиний продукт". Як я можу цього досягти?

Очікуючи щось подібне:

  • Якщо натиснути кнопку, що з’являється всередині циклу, -> Зробити це.
  • Якщо натиснути кнопку, що відображається на одній сторінці продукту -> Зробіть це.

Відповіді:


1

ви можете використовувати wp_get_referer або check_ajax_referer (), наприклад:

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

Будь ласка, зверніться до: пов'язані функції Wordpress Nonces


Ручні перевірки на домашню сторінку, сторінку продукту тощо - це надлишок. Я намагаюся не жорстко кодувати назви сторінок і, швидше, WP обробляти її всередині.
Девнер

1

Можна спробувати так:

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

Але вам потрібно перевірити свої настройки. Settings > Permalinks.


Ручні перевірки на домашню сторінку, сторінку продукту тощо - це надлишок. Я намагаюся не жорстко кодувати назви сторінок і, швидше, WP обробляти її всередині.
Девнер

1

ви можете використовувати is_product(), is_product_category()функціонувати

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

Я втомився від вашого рішення. Коли я перебуваю на сторінці "Єдиний продукт" і додаю товар у кошик, я очікував, що код $new_quantity = $quantity_from_cart * 3;спрацює. Але це не так. Він просто збільшує наявну кількість у кошику, але НЕ помножує кількість на 3 . Як це виправити?
Девнер

Спробуйте зараз, ви помножите кількість на 3
RBT

Я просто спробував ваше переглянуте рішення. Але якимось чином результат такий же, як і мій попередній коментар. Схоже , що з якоїсь - дивної причини, то код if ( is_product() )буде НЕ виконується. Я не можу знайти причину, чому! Чи важливо, що це кнопка AJAX Додати в кошик ??
Девнер

0

Є пару рішень, про які я міг придумати. Але ось одне:

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

Ми можемо додати прихований вхід у форму, що вищезгаданий код робить це.
Тоді можна перевірити його значення, як:

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

Зверніть увагу, що це лише ідея, а не повне рішення ... Вам потрібно подбати про кнопку Ajax.


Схоже, що з якоїсь дивної причини код if (is_product ()) НЕ виконується. Я не можу знайти причину, чому! Чи важливо, що це кнопка AJAX Додати в кошик ??
Девнер

з ajax, вам потрібно передати значення $button_locationв запиті ..
Рейгель,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.