Введите часть искомого слова, названия или фразы...
↑ ↓
  1. Новые темы озаглавленные с маленькой буквы - удаляются без предупреждения!
  2. Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

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

Тема в разделе "Вопросы новичков", создана пользователем Nikita21, 6 дек 2016.

  1. Nikita21

    Nikita21

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

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


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

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

    Stork.71 Местный

    Сообщения:
    1.102
    Симпатии:
    263
    Баллы:
    83
  3. Nikita21

    Nikita21

    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    3
    Спасибо, но там нет решения.

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

    tuxfighter Местный

    Сообщения:
    857
    Симпатии:
    114
    Баллы:
    43
    если я вас правильно понял, о чем вы, то вот, прекрасно у меня работает на 2х сайтах
     
  5. Stork.71

    Stork.71 Местный

    Сообщения:
    1.102
    Симпатии:
    263
    Баллы:
    83
    Ну собственно я о том же плагине и писал. Только вот в той теме кто-то отписывался, что в новых версиях WC плагин перестал работать. Брэхня?
     
  6. tuxfighter

    tuxfighter Местный

    Сообщения:
    857
    Симпатии:
    114
    Баллы:
    43
    у меня - работает.....
     
  7. Nikita21

    Nikita21

    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    3
    Все верно. Плагин не работает. Я так понял, что этот плагин рассчитан на стандартную тему .
     
  8. tuxfighter

    tuxfighter Местный

    Сообщения:
    857
    Симпатии:
    114
    Баллы:
    43
    а какую тему лично вы считаете стандартной для WOO??
     
  9. Nikita21

    Nikita21

    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    3
    Посмотрел получше этот плагин. Он же работает только на добавление товара(на сайте плагина), а при удалении товара из корзины происходит тоже самое - переход по ссылке типа 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_urlWC()->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>
     
    Последнее редактирование: 7 дек 2016
  10. tuxfighter

    tuxfighter Местный

    Сообщения:
    857
    Симпатии:
    114
    Баллы:
    43
  11. Stork.71

    Stork.71 Местный

    Сообщения:
    1.102
    Симпатии:
    263
    Баллы:
    83
    Посмотрите в истории версий:
    То есть, он может удалять товар из корзины, но не "по крестику", а при снижении количества до 0.
    Может, стоит просто заглянуть в код этого плагина и разобраться, как он это делает, прикрутить тот же скрипт к "крестику"?
     
  12. Nikita21

    Nikita21

    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    3
    Спасибо огромное за совет. Так и сделал. Ниже код, может кому понадобится.=)

    Решение.
    Если у вас не удаляется по 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_urlWC()->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'
                                    
    ), $_productfalse );
                                }

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


    Дополнение.
    Если у вас страница оплаты на странице корзины и нужно, чтобы карточка оплаты обновлялась вместе с корзиной, то делаем следующим образом.
    В файле \woocommerce\checkout\review-order.php дописываем класс к строчке товара в карточке оплаты. Вот так.
    PHP:
    <tr class="<?php echo esc_attrapply_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>
     
    Последнее редактирование: 7 дек 2016