【问题标题】:Update Cart Woocommerce (jQuery)更新购物车 Woocommerce (jQuery)
【发布时间】:2018-04-12 09:19:40
【问题描述】:

我在 Woocommerce 购物车页面上的自动更新购物车脚本存在一个小问题。它只是一个小的 sn-p,它在添加(或减去)项目时更新购物车。 它在以前的主题上运行良好,但是我切换了主题并遇到了故障。 Snippet 只是找到隐藏的“更新”字段,并对其进行更新。

片段如下

 jQuery(window).on('load', function(){
             jQuery("[name='update_cart']").closest( 'form' ).find( 'input[name=\"update_cart\"]' );
                  });
                 jQuery( document.body ).on( 'updated_cart_totals', function(){
              jQuery("[name='update_cart']").closest( 'form' ).find( 'input[name=\"update_cart\"]' );
                });
                  jQuery('div.woocommerce').on('change', '.qty', function(){
               jQuery("[name='update_cart']").trigger("click"); 
        });

该字段的 html 是

  <input type="submit" class="hidden" name="update_cart">

位于底部附近返回商店按钮的正下方

完整的 cart.php 代码如下

do_action('woocommerce_before_cart');
get_template_part('woocommerce/theme-custom/order', 'step');
?>
<script>
           jQuery(window).on('load', function(){
             jQuery("[name='update_cart']").closest( 'form' ).find( 'input[name=\"update_cart\"]' );
                  });
                 jQuery( document.body ).on( 'updated_cart_totals', function(){
              jQuery("[name='update_cart']").closest( 'form' ).find( 'input[name=\"update_cart\"]' );
                });
                  jQuery('div.woocommerce').on('change', '.qty', function(){
               jQuery("[name='update_cart']").trigger("click"); 
        });
</script>
<form action="<?php echo esc_url(wc_get_cart_url()); ?>" method="post" class="woocommerce-cart-form">
    <div class="row">
        <div class="col-xs-12 col-sm-7">
                <?php do_action('woocommerce_before_cart_table'); ?>
                <table class="shop_table shop_table_responsive cart woocommerce-cart-form__contents" cellspacing="0">
                    <thead>
                    <tr>
                        <th class="product-name" colspan="2"><?php _e('Product', 'woocommerce'); ?></th>
                        <th class="product-price"><?php _e('Price', 'woocommerce'); ?></th>
                        <th class="product-quantity"><?php _e('Quantity', 'woocommerce'); ?></th>
                        <th class="product-subtotal"><?php _e('Total', 'woocommerce'); ?></th>
                        <th class="product-remove">&nbsp;</th>
                    </tr>
                    </thead>
                    <tbody>
                    <?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);
                            ?>
                            <tr class="woocommerce-cart-form__cart-item <?php echo esc_attr(apply_filters('woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key)); ?>">

                                <td class="product-thumbnail">
                                    <?php
                                    $thumbnail = apply_filters('woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key);

                                    if (!$product_permalink) {
                                        echo ent2ncr($thumbnail);
                                    } else {
                                        printf('<a href="%s">%s</a>', esc_url($product_permalink), $thumbnail);
                                    }
                                    ?>
                                </td>

                                <td class="product-name" data-title="<?php esc_attr_e('Product', 'woocommerce'); ?>">
                                    <?php
                                    if (!$product_permalink) {
                                        echo apply_filters('woocommerce_cart_item_name', $_product->get_name(), $cart_item, $cart_item_key) . '&nbsp;';
                                    } else {
                                        echo apply_filters('woocommerce_cart_item_name', sprintf('<a href="%s">%s</a>', esc_url($product_permalink), $_product->get_name()), $cart_item, $cart_item_key);
                                    }
                                    // Meta data
                                    echo wc_get_formatted_cart_item_data( $cart_item );

                                    // Backorder notification
                                    if ($_product->backorders_require_notification() && $_product->is_on_backorder($cart_item['quantity'])) {
                                        echo '<p class="backorder_notification">' . esc_html__('Available on backorder', 'woocommerce') . '</p>';
                                    }
                                    ?>
                                    <div class="mobile-content">
                                       <?php
                                       echo apply_filters('woocommerce_cart_item_price', WC()->cart->get_product_price($_product), $cart_item, $cart_item_key);
                                       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">%s</a>',
                                           esc_url(wc_get_cart_remove_url($cart_item_key)),
                                           __('Remove this item', 'woocommerce'),
                                           esc_attr($product_id),
                                           esc_attr($_product->get_sku()),
                                           __('Remove', 'doma')
                                       ), $cart_item_key);
                                       ?>
                                   </div>
                                </td>

                                <td class="product-price" data-title="<?php esc_attr_e('Price', 'woocommerce'); ?>">
                                    <?php
                                    echo apply_filters('woocommerce_cart_item_price', WC()->cart->get_product_price($_product), $cart_item, $cart_item_key);
                                    ?>
                                </td>

                                <td class="product-quantity"
                                    data-title="<?php esc_attr_e('Quantity', 'woocommerce'); ?>">
                                    <?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, false);
                                    }

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

                                <td class="product-subtotal" data-title="<?php esc_attr_e('Total', 'woocommerce'); ?>">
                                    <?php
                                    echo apply_filters('woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal($_product, $cart_item['quantity']), $cart_item, $cart_item_key);
                                    ?>
                                </td>
                                <td class="product-remove">
                                    <?php
                                    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="cs-font clever-icon-close"></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);
                                    ?>
                                </td>
                            </tr>
                            <?php
                        }
                    }
                    do_action('woocommerce_cart_contents');
                    ?>
                    <?php do_action('woocommerce_after_cart_contents'); ?>
                    </tbody>
                </table>
                <div class="bottom-table-cart">
                    <a class="btn back-shop" title="<?php echo esc_attr__('Continue Shopping', 'doma') ?>"
                       href="<?php echo get_permalink(wc_get_page_id('homepage')) ?>">
                        <?php echo esc_html__('Continue Shopping', 'doma') ?>
                    </a>
                  <input type="submit" class="hidden" name="update_cart">
                    <?php do_action('woocommerce_cart_actions'); ?>
                    <?php wp_nonce_field('woocommerce-cart'); ?>
                </div>
                <?php do_action('woocommerce_after_cart_table'); ?>
        </div>
        <div class="col-xs-12 col-sm-5 cart-collaterals">
            <?php do_action('woocommerce_cart_collaterals'); ?>
        </div>
    </div>
    <?php do_action('zoo_woocommerce_cart_collaterals'); ?>
</form>
<?php do_action('woocommerce_after_cart'); ?>

它以前工作得很好,但现在由于某种原因只更新每个 SECOND 增量,即第一个增量它什么都不做,然后在下一个增量它更新,并在后续尝试以完全相同的行为重复此操作,即错过一个,更新下一个等。减法也是如此。

有点疑惑为什么它现在不能正常工作。

欢迎任何提示

谢谢

【问题讨论】:

  • 你应该在你的问题中添加所有相关的代码,你应该更好地解释你的代码应该做什么......记住:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。"
  • 嗨,这是所有的 jQuery 代码,期望的行为是在每次递增/递减时更新,并且之前工作正常。现在它只在每第二个增量/减量时更新,每次都完全忽略第一个增量。我现在添加了 cart.php 代码,看看是否有帮助。谢谢
  • 通常 Woocommerce 默认单独执行此操作,无需任何额外的 jQuery 代码...默认情况下有:&lt;input type="submit" class="button" name="update_cart" value="Update cart"&gt; 并且 Woocommerce 会在您每次更改购物车页面中的数量时激活按钮...所以当您点击这个按钮一切都更新了,没有任何额外的需求。
  • 嗨,不,不是这样,否则我不会添加代码,其他主题必须将其添加到更新购物车,我只是将其转移到新主题。默认情况下,WC 不会自动更新购物车,因此添加了。
  • IE WC 没有激活按钮,用户必须点击按钮,因此代码自动执行。

标签: jquery wordpress woocommerce


【解决方案1】:

您可以通过单击输入或直接插入字段来触发数量变化的更新购物车按钮,因此只需将此代码粘贴到functions.php中即可。这段代码已经过测试并且运行良好。

add_action( 'wp_footer', 'refresh_update_qty' ); 
 
function refresh_update_qty() {
   if (is_cart()) {
      ?>
      <script type="text/javascript">
         jQuery('div.woocommerce').on('click', '.quantity input.button, input.qty', function(){
  
            jQuery("[name='update_cart']").trigger("click");
         });
      </script>
      <?php
   }
}

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2017-01-11
    • 2016-10-09
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多