Автоматическое обновление корзины после изменения количества
Я пытаюсь автоматически обновлять корзину WooCommerce после изменения количества товаров. Следующий код в файле function.php работает, НО обновляет корзину только после двойного изменения количества. Знаете, как это исправить?
add_action( 'wp_footer', 'cart_update_qty_script' );
function cart_update_qty_script() {
if (is_cart()) :
?>
<script>
jQuery('div.woocommerce').on('change', '.qty', function(){
jQuery("[name='update_cart']").trigger("click");
});
</script>
<?php
endif;
}

Почти с годишно закъснение, но този въпрос все още може да привлича посетители: Вие задействате клика, но бутонът няма достатъчно време да стане активен, затова когато кликнете втори път, бутонът вече е активиран. Премахнете свойството "disabled" преди да задействате клика:
<script>
jQuery('div.woocommerce').on('change', '.qty', function(){
jQuery("[name='update_cart']").prop("disabled", false);
jQuery("[name='update_cart']").trigger("click");
});
</script>

Именно то, что я искал. Только что создал gist для этого https://gist.github.com/kamaroly/0f1c6ec6c90a6c44dca3254317298278

Ваш код выше отлично работает в моей локальной системе. Не знаю, почему он не работает у вас. Но вы можете попробовать написать JS код следующим образом:
add_action( 'wp_footer', 'cart_update_qty_script' );
function cart_update_qty_script() {
if (is_cart()) :
?>
<script type="text/javascript">
(function($){
$(function(){
$('div.woocommerce').on( 'change', '.qty', function(){
$("[name='update_cart']").trigger('click');
});
});
})(jQuery);
</script>
<?php
endif;
}
Это более точный и чистый подход, на мой взгляд.
Надеюсь, это поможет.

Я создал бесплатный плагин Ajax Cart AutoUpdate для обновления страницы корзины и мини-корзины при изменении количества товаров. Он имеет дополнительные удобные опции, но даже сам скрипт обеспечивает более широкую поддержку браузеров и значительно лучший пользовательский опыт.
Ajax-запросы не отправляются постоянно благодаря введенной задержке обновления. В предоставленном примере она составляет 1000 миллисекунд, но в реальном коде плагина используется значение, указанное в настройках. Это работает следующим образом:
"Обновление корзины задерживается на количество миллисекунд, прошедших с последнего действия, влияющего на количество товаров, указанное пользователем в настройках (по умолчанию 1000). Это означает, что обновление произойдет только один раз, когда пользователь завершит внесение изменений."
Также для фанатов скорости загрузки страниц: если вы хотите отложить загрузку jQuery, лучше загружать скрипты с помощью wp_enqueue_script, указав jQuery в качестве зависимости, потому что встроенный скрипт с jQuery в таком случае не сработает.
var timeout;
jQuery('div.woocommerce').on('change keyup mouseup', 'input.qty', function(){ // keyup и mouseup для поддержки Firefox
if (timeout != undefined) clearTimeout(timeout); // отменить ранее запланированное событие
if (jQuery(this).val() == '') return; // если количество пустое, вместо удаления товара из корзины ничего не делать
timeout = setTimeout(function() {
jQuery('[name="update_cart"]').trigger('click');
}, 1000 ); // запланировать обновление корзины с задержкой в 1000 миллисекунд
});
