#php #jquery #wordpress #woocommerce #hook-woocommerce
#php #jquery #wordpress #woocommerce #hook-woocommerce
Вопрос:
В Woocommerce, когда я нажимаю на кнопку добавить в корзину на отдельных страницах товара, товар успешно добавляется в корзину. Теперь, как только товар добавлен в корзину (после перезагрузки страницы) Я хотел бы запустить отображение для ОФОРМЛЕНИЯ ЗАКАЗА и УВИДЕТЬ, как в окне появляются кнопки КОРЗИНЫ.
Следующий код отлично работает с AJAX ДОБАВИТЬ В КОРЗИНУ, но не для ЕДИНОГО ДОБАВЛЕНИЯ В КОРЗИНУ, поскольку он не поддерживает ajax:
$( document.body ).on( 'added_to_cart', function(){
console.log('added_to_cart');
});
Как я мог бы заставить это работать для не ЕДИНОГО ДОБАВЛЕНИЯ В корзину?
Ajax добавить в корзину (работает): https://test.sushi2500.dk/takeaway/nigiri-laks /
Единое добавление в корзину (не работает):https://test.sushi2500.dk/takeaway/maanedstilbud /
Ответ №1:
Обновление ноябрь 2020
- Проверьте элементы корзины, чтобы убедиться, что товар был добавлен в корзину.
- Обработка большего количества данных о продукте, вариантах продукта и их атрибутах.
На странице отдельного товара, поскольку данные передаются в форме с использованием метода «post» (без использования JS / AJAX), вы можете определить событие «добавлено в корзину», используя $_POST
переменные PHP, таким образом:
add_action('wp_footer', 'single_added_to_cart_event');
function single_added_to_cart_event()
{
if( isset($_POST['add-to-cart']) amp;amp; isset($_POST['quantity']) ) :
// Get added to cart product ID (or variation ID) and quantity (if needed)
$id_to_check = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : esc_attr($_POST['add-to-cart']);
$product_id = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : esc_attr($_POST['add-to-cart']);
$variation_id = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : 0;
$quantity = esc_attr($_POST['quantity']);
$found_in_cart = false; // Initializing
// Check cart items to be sure that the product has been added to cart (and get product data)
foreach( WC()->cart->get_cart() as $item ) {
$product = $item['data']; // The WC_Product Object
if( $product->get_id() == $id_to_check ) {
$product_name = $product->get_name(); // Product name
$sku = $product->get_sku(); // Product sku
$type = $product->get_type(); // Product sku
$price = wc_get_price_to_display($product); // Product price for display
$stock_qty = $product->get_stock_quantity(); // Product sku
$stock_status = $product->get_stock_status(); // Product sku
$attributes = $variation_id > 0 ? json_encode($product->get_attributes()) : "''";
$found_in_cart = true;
break; // Stop the loop
}
}
if( $found_in_cart ) :
// The displayed message (example)
if ( $variation_id > 0 ) {
$message = sprintf( __('Product "%s" has been added to cart. rnProduct type: %s rnProduct price: %s rnProduct_id: %s rnVariation_id: %s rnQuantity: %s'),
$product_name, $type, $price, $product_id, $variation_id, $quantity );
} else {
$message = sprintf( __('Product "%s" has been added to cart. rnProduct type: %s rnProduct price: %s rnProduct_id: %s rnQuantity: %s'),
$product_name, $type, $price, $product_id, $quantity );
}
// JS code goes here below
?>
<script>
jQuery(function($){
// All product data
var product_id = <?php echo esc_attr($_POST['add-to-cart']); ?>,
variation_id = <?php echo $variation_id; ?>,
quantity = <?php echo $quantity; ?>,
attributes = <?php echo $attributes; ?>,
name = '<?php echo $product_name; ?>',
type = '<?php echo $type; ?>',
sku = '<?php echo $sku; ?>',
price = '<?php echo $price; ?>',
stock_qty = '<?php echo $stock_qty; ?>',
stock_status = '<?php echo $stock_status; ?>',
message = '<?php echo $message; ?>';
console.log(message);
if ( variation_id > 0 ) console.log(attributes);
alert(message);
});
</script>
<?php
endif; endif;
}
Код отправляется в function.php файл вашей активной дочерней темы (или active theme).
Протестировано и работает для страниц отдельных продуктов (или при использовании [product_page id="99"]
шорткода, подобного).
Вы можете использовать код в шаблоне, в пользовательской функции (или в пользовательском коротком коде).
Комментарии:
1. куда мне добавить этот код. когда я добавляю эти фрагменты в function.php это вызывает ошибку 403 forbidden.
2. Проблема с этим подходом заключается в том, что он запускает
added_to_cart
событие, даже если продукт не проходит проверку наwoocommerce_add_to_cart_validation
3. @PabloSGPacheco Я обновил свой код, чтобы обрабатывать
woocommerce_add_to_cart_validation
перехват, когда товар не подтвержден или не добавлен в корзину по каким-либо другим причинам… Как вы увидите, теперь я проверяю элементы корзины, чтобы убедиться, что товар добавлен в корзину. Теперь ваш кодовый ответ на самом деле не отвечает на вопрос OP, поскольку запуск события Ajax «added_to_cart» выдаст событие с пустыми параметрами продукта… Помните, что событие «added_to_cart» предназначено для добавления Ajax в корзину, и это событие позволяет получить некоторые параметры продукта, которые будут пустыми при запуске, как вы делаете…4. Отличный @LoicTheAztec, спасибо за обновление. Что касается моего кода, вы правы. Прямо сейчас у него нет параметров продукта, но я думаю, что я смог бы это сделать, получив параметры продукта из
woocommerce_add_to_cart
хука5. @PabloSGPacheco Извините, но ваш код ответа по-прежнему не обрабатывает добавленные в корзину варианты товаров, поскольку он не предоставляет идентификатор варианта и связанные атрибуты… Как я уже говорил ранее, событие «added_to_cart» предназначено только для Ajax добавления в корзину и простых товаров, но не для всех других типов товаров, для которых требуется обычное добавление в корзину на странице одного товара.
Ответ №2:
$( document.body ).on( '.wc-variation-selection-needed', function(){
console.log('added_to_cart');
});
Попробуйте это
Комментарии:
1. Это всего лишь console.log. Как это должно решить проблему, lol?
2. @Mr.Jo Запуск не работает, в этом проблема, верно? 🙂
3. Да, вы можете проверить обе ссылки, тогда вам будет понятнее
4. @Viveksaroch Оба не входят в систему в Google Chrome 🙂
Ответ №3:
Я полагаю, что при таком подходе вы сможете легко запускать added_to_cart
событие на отдельных страницах, избегая проблемы его непреднамеренного запуска, если товар не был добавлен в корзину, например, если он не был проверен woocommerce_add_to_cart_validation
фильтром.
Вы можете передать любые другие аргументы событию из woocommerce_add_to_cart
перехвата, такие как идентификатор продукта, количество, идентификатор варианта и т.д.
Если added_to_cart
событие вам не подходит, вы можете запустить свое собственное пользовательское событие, если хотите.
add_action( 'woocommerce_add_to_cart', 'trigger_single_added_to_cart_event', 10, 6 );
function trigger_added_to_cart_event_in_single_product_page() {
$params = func_get_args();
add_action( 'wp_footer', function () use( $params ) {
?>
<script>
jQuery(function ($) {
$(document.body).trigger({
type: 'added_to_cart',
product_id:<?php echo esc_attr( $params[1] ) ?>,
quantity:<?php echo esc_attr( $params[2] ) ?>
});
});
</script>
<?php
} );
}
Комментарии:
1. Событие «added_to_cart» предназначено только для добавления в корзину Ajax, поэтому не для страниц отдельных товаров! Таким образом, «added_to_cart», запускаемый вашим кодом, будет пустым, в нем не задан идентификатор продукта (данные не связаны)…
2. Спасибо @LoicTheAztec, я верю, что оно больше не будет пустым
3. Это не сработает при добавлении в корзину вариантов товаров, поскольку событие «added_to_cart» не обрабатывает варианты товаров и их атрибуты…