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...логики.

Итак, я хочу запустить отдельный код, когда нажата кнопка «Добавить в корзину», расположенная в цикле (независимо от ее местоположения, домашней страницы, архивов и т. Д.), И запустить другой код, когда кнопка «Добавить в корзину» который находится на странице «Один продукт». Как мне этого добиться?

Ожидая что-то вроде этого:

  • Если кнопка внутри петли нажата -> Сделайте это.
  • Если нажата кнопка, появляющаяся на странице «Один продукт» -> Сделайте это.
Devner
источник

Ответы:

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);
}
RBT
источник
Я устал от вашего решения. Когда я зашел на страницу «Один продукт» и добавил продукт в корзину, я ожидал, что код $new_quantity = $quantity_from_cart * 3;сработает. Но это не так. Он просто увеличивает текущее существующее количество в корзине, но НЕ умножает количество на 3 . Как это исправить?
Девнер
Попробуйте сейчас это умножит количество на 3
RBT
Я только что попробовал ваше исправленное решение. Но почему-то результат такой же, как мой предыдущий комментарий. Похоже , что по какой - то странной причине, то код if ( is_product() )будет НЕ выполняется. Я не могу найти причину почему! Имеет ли значение, что это кнопка AJAX Add to Cart ??
Девнер
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.

Reigel
источник
По какой-то странной причине кажется, что код if (is_product ()) НЕ выполняется. Я не могу найти причину почему! Имеет ли значение, что это кнопка AJAX Add to Cart ??
Девнер
с ajax, вам нужно передать значение $button_locationв запросе ..
Рейгель