woocommerce как обновить корзину через ajax

203
10 октября 2018, 08:50

На странице корзины есть кнопка "обновить корзину". В базовом шаблоне она работает, но когда я изменил его, то эта кнопка перестала работать. Вот мой шаблон:

<div class="col-lg-8">
                <?php do_action( 'woocommerce_before_cart_contents' ); ?>
                <?php
                foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                    $_product   = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
                    $product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
                    if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
                        $product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
                        ?>
                        <div class="cart-caption mb-3">
                            <button type="button" class="product-remove remove-prod-item">
                                <?php
                                // @codingStandardsIgnoreLine
                                echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf(
                                    '<a href="%s" class="remove" aria-label="%s" data-product_id="%s" data-product_sku="%s"><i class="fas fa-times-circle"></i></a>',
                                    esc_url( wc_get_cart_remove_url( $cart_item_key ) ),
                                    __( 'Remove this item', 'woocommerce' ),
                                    esc_attr( $product_id ),
                                    esc_attr( $_product->get_sku() )
                                ), $cart_item_key );
                                if ( WC()->cart->get_cart_contents_count() == 1 ) {
                                    ?>
                                    <script type="text/javascript">
                                        $('.remove-prod-item').on('click',function(){
                                            $.ajax({
                                                url:'/cart',
                                                data:{id:$(this).data('id')},
                                                success:function(){
                                                    location.reload();
                                                }
                                            });
                                        });
                                    </script>
                                    <?php
                                }
                                ?>
                            </button>
                            <div class="cart-img product-thumbnail">
                                <?php
                                $thumbnail = apply_filters( 'woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key );
                                if ( ! $product_permalink ) {
                                    echo wp_kses_post( $thumbnail );
                                } else {
                                    printf( '<a href="%s">%s</a>', esc_url( $product_permalink ), wp_kses_post( $thumbnail ) );
                                }
                                ?>
                            </div>
                            <div class="product-name product-cart-options mx-auto">
                                <small>vendor code 74284</small>
                                <h4 class="text-uppercase" data-title="<?php esc_attr_e( 'Product', 'woocommerce' ); ?>">
                                    <?php
                                    if ( ! $product_permalink ) {
                                        echo wp_kses_post( apply_filters( 'woocommerce_cart_item_name', $_product->get_name(), $cart_item, $cart_item_key ) . '&nbsp;' );
                                    } else {
                                        echo wp_kses_post( apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', esc_url( $product_permalink ), $_product->get_name() ), $cart_item, $cart_item_key ) );
                                    }
                                    do_action( 'woocommerce_after_cart_item_name', $cart_item, $cart_item_key );
                                    // Meta data.
                                    echo wc_get_formatted_cart_item_data( $cart_item ); // PHPCS: XSS ok.
                                    // Backorder notification.
                                    if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
                                        echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="backorder_notification">' . esc_html__( 'Available on backorder', 'woocommerce' ) . '</p>' ) );
                                    }
                                    ?>
                                </h4>
                                <div class="SQ-select product-quantity" data-title="<?php esc_attr_e( 'Quantity', 'woocommerce' ); ?>">
                                    <label>Quantity</label>
                                    <?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->get_max_purchase_quantity(),
                                            'min_value'    => '0',
                                            'product_name' => $_product->get_name(),
                                        ), $_product, false );
                                    }
                                    echo apply_filters( 'woocommerce_cart_item_quantity', $product_quantity, $cart_item_key, $cart_item ); // PHPCS: XSS ok.
                                    ?>
                                </div>
                                <div class="prod-cart-price product-price" data-title="<?php esc_attr_e( 'Price', 'woocommerce' ); ?>">
                                    <label>Price</label>
                                    <div class="price-area">
                                        <label class="new">
                                            <?php
                                            echo apply_filters( 'woocommerce_cart_item_price', WC()->cart->get_product_price( $_product ), $cart_item, $cart_item_key ); // PHPCS: XSS ok.
                                            ?>
                                        </label>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <?php
                    }
                }
                ?>
                <?php do_action( 'woocommerce_cart_contents' ); ?>
            </div>
            <div class="col-lg-4">
                <div class="order-summary ml-lg-3">
                    <div class="title text-uppercase">order summary</div>
                    <span class="text-uppercase">
                        <?php
                        $item_count_text = sprintf(
                        /* translators: number of items in the mini cart. */
                            _n( '%d item', '%d items', WC()->cart->get_cart_contents_count(), 'inmotion' ),
                            WC()->cart->get_cart_contents_count()
                        );
                        ?><i class="cart-counter"><?php echo esc_html( $item_count_text ); ?></i>
                    </span>
                    <?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>
                        <?php do_action( 'woocommerce_cart_totals_before_shipping' ); ?>
                        <?php wc_cart_totals_shipping_html(); ?>
                        <?php do_action( 'woocommerce_cart_totals_after_shipping' ); ?>
                    <?php elseif ( WC()->cart->needs_shipping() && 'yes' === get_option( 'woocommerce_enable_shipping_calc' ) ) : ?>
                        <tr class="shipping">
                            <th><?php _e( 'Shipping', 'woocommerce' ); ?></th>
                            <td class="text-right" data-title="<?php esc_attr_e( 'Shipping', 'woocommerce' ); ?>"><?php woocommerce_shipping_calculator(); ?></td>
                        </tr>
                    <?php endif; ?>
                    <div class="actions">
                        <?php if ( wc_coupons_enabled() ) { ?>
                            <div class="coupon">
                                <label for="coupon_code text-uppercase">
                                    <?php esc_html_e( 'Coupon:', 'woocommerce' ); ?>
                                </label>
                                <input type="text" name="coupon_code" class="input-text" id="coupon_code" value="" placeholder="<?php esc_attr_e( 'Coupon code', 'woocommerce' ); ?>" />
                                <button type="submit" class="button" name="apply_coupon" value="<?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?>">
                                    <?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?>
                                </button>
                                <?php do_action( 'woocommerce_cart_coupon' ); ?>
                            </div>
                        <?php } ?>
                        <button type="submit" class="button" name="update_cart" value="<?php esc_attr_e( 'Update cart', 'woocommerce' ); ?>"><?php esc_html_e( 'Update cart', 'woocommerce' ); ?></button>
                        <?php do_action( 'woocommerce_cart_actions' ); ?>
                        <?php wp_nonce_field( 'woocommerce-cart', 'woocommerce-cart-nonce' ); ?>
                    </div>
                    <div class="cart-collaterals">
                        <?php
                        /**
                         * Cart collaterals hook.
                         *
                         * @hooked woocommerce_cross_sell_display
                         * @hooked woocommerce_cart_totals - 10
                         */
                        do_action( 'woocommerce_cart_collaterals' );
                        ?>
                    </div>
                </div>
            </div>
Answer 1

Решил пойти окольным путём, может кому то поможет, стандартно кнопка имеет свойство disable, я поставил обработчик события на свой .qty, который будет убирать свойство disable, но вот проблема в том, что этот метод обрабатывается только 1 раз. поэтому я приписал ещё в конце обновление страницы, так у меня теперь может исправно функционировать кнопка обновления корзины.

$(".cart-container .quantity select").on('click', function (e) {
    $("button[name='update_cart']").attr("disabled", false);
})
$(".button[name='update_cart']").on('click', function (e) {
    setTimeout(function () {
        location.reload();
    }, 500);
});
READ ALSO
Как выполнить один скрипт JS

Как выполнить один скрипт JS

Как выполнить один скрипт JS для всех div отдельно?

167
c# метод Control.DefWndProc

c# метод Control.DefWndProc

Почитал достаточно, но негде не нашел понятного ответа для себяМне нужно переопределить метод DefWndProc в wpf

187
WebBrowserDocumentCompleted не отрабатывает

WebBrowserDocumentCompleted не отрабатывает

Получаю список html-файлов с путями к ним и сохраняю их в List<string> и DataGridView:

162
Процедурная генерация уровня

Процедурная генерация уровня

Суть такая, пилю процедурную генерацию уровня из готовых комнат/модулей

157