【发布时间】:2019-08-31 18:16:25
【问题描述】:
我正在尝试使用 ajax 一键单击将多个不同的产品添加到购物车。 AddToCart-Button 存在于非 WooCommerce 页面模板中。
我认为可以通过等待第一个 ajax 发布成功来解决,然后迭代到下一个产品,依此类推,直到所有选定的产品都完成 ajax 发布,然后最终应该会成功。
我只是不知道我是怎么做到的 :) 你知道怎么做吗?
这是我的产品表单 html:
<form id="buy-tickets" action="https://mydomain.de/cart/" class="cart" method="post" enctype="multipart/form-data" novalidate="">
<input type="hidden" name="product_id[]" value="5353"><div class="terminMain"><div class="terminDate">28.09.2019 Event Name 1<p><b>(Noch Plätze frei)</b></p></div><div class="personenNumber" id="personenNumber1">
<div class="inputField">
<input type="button" value="-" class="qtyminus" field="quantity_5353" id="qtyminus1">
<input type="text" id="quantity_5353" name="quantity_5353" value="0" class="qty">
<input type="button" value="+" class="qtyplus" field="quantity_5353" id="qtyplus1">
<input type="hidden" name="stock" value="1985" field="stock">
</div>
</div></div><input type="hidden" name="product_id[]" value="5354"><div class="terminMain"><div class="terminDate">31.03.2026 Event Name 2<p><b>(Noch Plätze frei)</b></p></div><div class="personenNumber" id="personenNumber2">
<div class="inputField">
<input type="button" value="-" class="qtyminus" field="quantity_5354" id="qtyminus2">
<input type="text" id="quantity_5354" name="quantity_5354" value="0" class="qty">
<input type="button" value="+" class="qtyplus" field="quantity_5354" id="qtyplus2">
<input type="hidden" name="stock" value="1989" field="stock">
</div>
</div></div> <div class="buchenBtn">
<div class="btns woocommerce add-to-cart">
<button type="submit" name="ticket_process" value="1" class="ajax_add_to_cart single_add_to_cart_button btn added" id="buchen-wootickets">Buchen</button> <a href="https://mydomain.de/cart/" class="added_to_cart wc-forward" title="Warenkorb anzeigen">Show Cart</a>
</div>
</div>
</form>
这是 jQuery:
(function ($) {
$( document ).on( 'click', '.single_add_to_cart_button', function(e) {
e.preventDefault();
var tickets = $('#buy-tickets input[name="product_id[]"]');
var ticketsData = [];
var $this, ticketId, ticketQty, ticketProd;
tickets.each(function() {
$this = $( this );
id = $this.val();
ticketQty = $('#quantity_'+id).val();
if(ticketQty > 0){
ticketProd = {
action: 'woocommerce_ajax_add_to_cart',
product_id: id,
product_sku: '',
quantity: ticketQty,
variation_id: 0,
};
ticketsData.push(ticketProd);
}
});
console.log('tickets: ', ticketsData);
var $thisform = $('#buy-tickets');
var $thisbutton = $(this);
$.each(ticketsData, function(index, value){
$.each(this, function (index, value) {
console.log(index + " :: " + value);
});
$(document.body).trigger('adding_to_cart', [$thisbutton, this]);
$.ajax({
type: 'post',
url: wc_add_to_cart_params.ajax_url,
data: this,
beforeSend: function (response) {
$thisform.addClass('loading');
$thisbutton.removeClass('added');
},
complete: function (response) {
$thisform.removeClass('loading');
$thisbutton.addClass('added');
},
success: function (response) {
if (response.error & response.product_url) {
window.location = response.product_url;
return;
} else {
$(document.body).trigger('added_to_cart', [response.fragments, response.cart_hash, $thisbutton]);
}
},
});
return false;
});
});
})(jQuery);
以及处理我的 Ajax 的 php 函数:
add_action( 'wp_ajax_woocommerce_ajax_add_to_cart', 'tec_woocommerce_ajax_add_to_cart' );
add_action( 'wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'tec_woocommerce_ajax_add_to_cart' );
function tec_woocommerce_ajax_add_to_cart() {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );
$quantity = empty( $_POST['quantity'] ) ? 1 : wc_stock_amount( $_POST['quantity'] );
$variation_id = absint( $_POST['variation_id'] );
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
$product_status = get_post_status( $product_id );
if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id ) && 'publish' === $product_status ) {
do_action( 'woocommerce_ajax_added_to_cart', $product_id );
if ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) {
wc_add_to_cart_message( array( $product_id => $quantity ), true );
}
WC_AJAX::get_refreshed_fragments();
} else {
$data = array(
'error' => true,
'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id ),
);
echo wp_send_json( $data );
}
wp_die();
}
代码已经运行良好,只是罪魁祸首:它只是将 1 个产品 ID 及其设置数量添加到购物车并在此之后停止,即使通过设置其他产品的数量也选择了多个产品。
我正在寻找一种解决方案,它将根据每个产品设置的任何数量将所有选定的产品添加到购物车。
有什么帮助吗?建议?
【问题讨论】:
-
您没有将所有产品添加批处理到一个 AJAX 请求中是否有原因?我认为这不仅会更有效率,而且还会简化逻辑。关于为什么给定代码不起作用 - 浏览器网络日志是否显示已发送多个 AJAX 请求?
-
嗯,这实际上是我想要的:D,但不知道如何将产品添加到一个 Ajax 请求中。
-
您可以使用 JSON.stringify() 将 JavaScript 数组作为字符串发送到 WooCommerce,然后使用 PHP 的 json_decode() 将其解压缩到 PHP 数组中。
-
您能否通过提供代码答案进一步说明这一点?会非常好!
-
是的,但不是立即。如果您不想使用 JSON,我相信您可以直接将数组作为 POST 参数发送。我的安装目前没有 WooCommerce,所以我需要先激活它,然后才能测试代码,所以我不能立即执行此操作,但我会处理它,因为我发现这是一个有趣的问题。
标签: php jquery ajax wordpress woocommerce