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