Делегированное событие WooCommerce added_to_cart на отдельных страницах продукта

#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» не обрабатывает варианты товаров и их атрибуты…