• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Удаление товара из корзины посредством ajax

Image CMS

Nikita21

Форумчанин
#1
Весь инет перерыл, думал много вариантов будет, а нашел только один.
http://iniki.ru/blog/udalenie-produkta-iz-korziny-ajax-woocommerce/

По сути сейчас товар удаляется при переходе по ссылке /remove_item=cdc0d6e63aa8e41c89689f54970bb35f&_wpnonce=23c581b65a


Документации от вуу на русском нет(
Хочется понять, как реализовать.

Скорее всего как всегда самому придется решать. :)
 

Nikita21

Форумчанин
#3
Спасибо, но там нет решения.

По сути одно из возможных решений - ajax запрос к функции
PHP:
WC()->cart->remove_cart_item( $cart_item_key )
Затем пошаманить с передаваемой data при отправке ajax, и при успехе удалять блок с товаром.
 

Stork.71

Гуру
Местный
#5
Ну собственно я о том же плагине и писал. Только вот в той теме кто-то отписывался, что в новых версиях WC плагин перестал работать. Брэхня?
 

Nikita21

Форумчанин
#7
Ну собственно я о том же плагине и писал. Только вот в той теме кто-то отписывался, что в новых версиях WC плагин перестал работать. Брэхня?
Все верно. Плагин не работает. Я так понял, что этот плагин рассчитан на стандартную тему .
 

Nikita21

Форумчанин
#9
Посмотрел получше этот плагин. Он же работает только на добавление товара(на сайте плагина), а при удалении товара из корзины происходит тоже самое - переход по ссылке типа http://ragob.com/wooajaxcart/?page_...554f96369ab93e4f3bb068c22&_wpnonce=e3a5b177d8 с обновлением страницы.

В статье http://iniki.ru/blog/udalenie-produkta-iz-korziny-ajax-woocommerce/ - выводят корзину в любом месте, при этом удаление в ней по ajax.
То есть если взять оттуда структуру, то остается вопрос на счет скрипта. Если в курсе, то прошу помочь.

1) В карточке товара убираем стандартную кнопку удаления из корзины, которая через фильтр форматируется и привязывается к к woocommerce_cart_item_remove_link
PHP:
echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf( '<a class="vmicon vm2-remove_from_cart remove" href="%s" title="%s"></a>',
esc_url( WC()->cart->get_remove_url( $cart_item_key ) ), __( 'Remove this item', 'woocommerce' ) ), $cart_item_key );
2) На это место ставим обычную кнопку без ссылок. При этом работаем через класс, и делаем уникальным через $cart_item_key, допустим
PHP:
<a class="vmicon vm2-remove_from_cart remove remove_<?php echo $cart_item_key ?>"></a>
3) Берем функцию со статьи, меняем, и закидываем ее в ??????? в wp-admin/admin-ajax.php ???
PHP:
function remove_product(){
    $cart_item_key = $_POST['cart_item_key'];
    if($cart_item_key){
WC()->cart->remove_cart_item( $cart_item_key )
    }
}
4) Делаем js.
PHP:
<script>
jQuery('.remove_<?php echo $cart_item_key ?>').click(function(){

    var data = {
        'action': 'remove_product',
        'cart_item_key' : <?php echo $cart_item_key ?>,
    };
 
   jQuery.ajax({
                type: 'POST',
                url: ajax_url,    //у меня определен так, но я не уверен, что я правильно его вписал
                data: data,
                beforeSend: function(){
                
                },
                success: function(response){
                        var parseResp = jQuery.parseJSON(response);

                    //если все прошло ок, то удалим блок с продуктом.

                        if(parseResp.status == true){
                           jQuery('.cart_<?php echo $cart_item_key ?>').remove();

           //где  .cart_<?php echo $cart_item_key ?> - блок товара в корзине
                        }
                    
            },
            
        });
    
        return false;
});</script>
 
Последнее редактирование:

Stork.71

Гуру
Местный
#11
Посмотрел получше этот плагин. Он же работает только на добавление товара(на сайте плагина), а при удалении товара из корзины происходит тоже самое - переход по ссылке типа http://ragob.com/wooajaxcart/?page_...554f96369ab93e4f3bb068c22&_wpnonce=e3a5b177d8 с обновлением страницы.
Посмотрите в истории версий:
1.0
  • Initial version
1.1
  • Remove product from cart automatically (AJAX) when changes quantity to zero
То есть, он может удалять товар из корзины, но не "по крестику", а при снижении количества до 0.
Может, стоит просто заглянуть в код этого плагина и разобраться, как он это делает, прикрутить тот же скрипт к "крестику"?
 

Nikita21

Форумчанин
#12
Посмотрите в истории версий:


То есть, он может удалять товар из корзины, но не "по крестику", а при снижении количества до 0.
Может, стоит просто заглянуть в код этого плагина и разобраться, как он это делает, прикрутить тот же скрипт к "крестику"?
Спасибо огромное за совет. Так и сделал. Ниже код, может кому понадобится.=)

Решение.
Если у вас не удаляется по ajax товар из корзины, даже после установки плагина Woo AJAX Cart. То делаем следующее.
Устанавливаем и активируем Woo AJAX Cart.
В \woocommerce\cart\cart.php вместо
PHP:
echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf( '<a class="vmicon vm2-remove_from_cart remove" href="%s" title="%s"></a>',
esc_url( WC()->cart->get_remove_url( $cart_item_key ) ), __( 'Remove this item', 'woocommerce' ) ), $cart_item_key );
Вставляем следующий код


PHP:
<a class="vmicon vm2-remove_from_cart remove_<?php echo $cart_item_key ?>"></a>
                      
                        <script>
                        jQuery(document).ready(function($){
                            var qty_for_form = $('.quantity_cart_<?php echo $cart_item_key ?> input');
                          
                            $('.remove_<?php echo $cart_item_key ?>').on('click', function(){
                                qty_for_form.val('0');
                              
                                form = qty_for_form.closest('form');

                                // emulates button Update cart click
                                $("<input type='hidden' name='update_cart' id='update_cart' value='1'>").appendTo(form);
                              
                                // plugin flag
                                $("<input type='hidden' name='is_wac_ajax' id='is_wac_ajax' value='1'>").appendTo(form);

                              
                                matches = qty_for_form.attr('name').match(/cart\[(\w+)\]/);
                                cart_item_key = matches[1];
                                form.append( $("<input type='hidden' name='cart_item_key' id='cart_item_key'>").val(cart_item_key) );

                                formData = form.serialize();
                              
                                $("input[name='update_cart']").val('').prop('disabled', true);

                                $("a.checkout-button.wc-forward").addClass('disabled').html('');

                                $.post( form.attr('action'), formData, function(resp) {
                                    // ajax response
                                    $('.cart-collaterals').html(resp.html);
                                  
                                    qty_for_form.closest('.cart_item').find('.product-subtotal').html(resp.price);
                                  
                                    $('#update_cart').remove();
                                    $('#is_wac_ajax').remove();
                                    $('#cart_item_key').remove();
                                  
                                    $("input[name='update_cart']").val(resp.update_label).prop('disabled', false);

                                    $("a.checkout-button.wc-forward").removeClass('disabled').html(resp.checkout_label);

                                    if ( qty_for_form.val() == 0 ) {
                                        qty_for_form.closest('tr').remove();

                                    }
                                },
                                'json'
                                );
                            });
});

                        </script>
Прописываем класс обертывающего input ввода количества на
PHP:
quantity_cart_<?php echo $cart_item_key ?>
У меня так
PHP:
<span style="float:left;" class="quantity_cart_<?php echo $cart_item_key ?>">
                        <?php
                            if ( $_product->is_sold_individually() ) {
                                $product_quantity = sprintf( '1 <input type="hidden" name="cart[%s][qty]" value="1"/>', $cart_item_key );
                            } else {
                                $product_quantity = woocommerce_quantity_input( array(
                                    'input_name'  => "cart[{$cart_item_key}][qty]",
                                    'input_value' => $cart_item['quantity'],
                                    'max_value'   => $_product->backorders_allowed() ? '' : $_product->get_stock_quantity(),
                                    'min_value'   => '0'
                                ), $_product, false );
                            }

                            echo apply_filters( 'woocommerce_cart_item_quantity', $product_quantity, $cart_item_key );
                        ?>
                        </span>


Дополнение.
Если у вас страница оплаты на странице корзины и нужно, чтобы карточка оплаты обновлялась вместе с корзиной, то делаем следующим образом.
В файле \woocommerce\checkout\review-order.php дописываем класс к строчке товара в карточке оплаты. Вот так.
PHP:
<tr class="<?php echo esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) );?> cart_item_<?php echo $cart_item_key ?>">
Далее дописываем класс к строчке цены "Итого". Вот так.
PHP:
<tr class="order-total posle_obnovleniya">
            <th><?php _e( 'Total', 'woocommerce' ); ?></th>
            <td><?php wc_cart_totals_order_total_html(); ?></td>
        </tr>
И ставим в cart.php немного другой скрипт, вместо того, что описан выше.

PHP:
<a class="vmicon vm2-remove_from_cart remove_<?php echo $cart_item_key ?>"></a>
                       
                        <script>
                        jQuery(document).ready(function($){
                            var qty_for_form = $('.quantity_cart_<?php echo $cart_item_key ?> input');
                           
                            $('.remove_<?php echo $cart_item_key ?>').on('click', function(){
                                qty_for_form.val('0');
                               
                                form = qty_for_form.closest('form');

                                // emulates button Update cart click
                                $("<input type='hidden' name='update_cart' id='update_cart' value='1'>").appendTo(form);
                               
                                // plugin flag
                                $("<input type='hidden' name='is_wac_ajax' id='is_wac_ajax' value='1'>").appendTo(form);

                               
                                matches = qty_for_form.attr('name').match(/cart\[(\w+)\]/);
                                cart_item_key = matches[1];
                                form.append( $("<input type='hidden' name='cart_item_key' id='cart_item_key'>").val(cart_item_key) );

                                formData = form.serialize();
                               
                                $("input[name='update_cart']").val('').prop('disabled', true);

                                $("a.checkout-button.wc-forward").addClass('disabled').html('');

                                $.post( form.attr('action'), formData, function(resp) {
                                    // ajax response
                                    $('.cart-collaterals').html(resp.html);
                                   
                                    qty_for_form.closest('.cart_item').find('.product-subtotal').html(resp.price);
                                   
                                    $('#update_cart').remove();
                                    $('#is_wac_ajax').remove();
                                    $('#cart_item_key').remove();
                                   
                                    $("input[name='update_cart']").val(resp.update_label).prop('disabled', false);

                                    $("a.checkout-button.wc-forward").removeClass('disabled').html(resp.checkout_label);

                                    if ( qty_for_form.val() == 0 ) {
                                        qty_for_form.closest('tr').remove();
var price = (parseFloat($('.order-total.posle_obnovleniya .amount').text()) - parseFloat($('.shop_table.woocommerce-checkout-review-order-table .cart_item_<?php echo $cart_item_key ?> .amount').text())) + 'руб';
$('.order-total.posle_obnovleniya .amount').text(price);

                                        $('.shop_table.woocommerce-checkout-review-order-table .cart_item_<?php echo $cart_item_key ?>').remove();
                                       
                                       

                                       
                                    }
                                },
                                'json'
                                );
                            });
});

                        </script>
 
Последнее редактирование: