javascript - 分组产品的 Ajax 添加到购物车按钮
问题描述
我正在尝试使用 Ajax 添加到购物车按钮,但对分组产品有困难。stackoverflow 上有许多类似的线程在这里没有答案,或者建议的解决方案不起作用。
到目前为止,我所拥有的适用于简单和可变的,但它不会将分组产品的单个项目添加到购物车中。
function woocommerce_ajax_add_to_cart_js() {
if (is_product() || is_product_category() || is_shop()) {
wp_enqueue_script('woocommerce-ajax-add-to-cart', get_stylesheet_directory_uri() . '/assets/js/ajax-add-to-cart.js', array('jquery'), '', true);
}
}
add_action('wp_enqueue_scripts', 'woocommerce_ajax_add_to_cart_js', 99);
add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
function 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();
}
(function ($) {
$(document).on('click', '.single_add_to_cart_button', function (e) {
e.preventDefault();
var $thisbutton = $(this),
$form = $thisbutton.closest('form.cart'),
id = $thisbutton.val(),
product_qty = $form.find('input[name=quantity]').val() || 1,
product_id = $form.find('input[name=product_id]').val() || id,
variation_id = $form.find('input[name=variation_id]').val() || 0;
var data = {
action: 'woocommerce_ajax_add_to_cart',
product_id: product_id,
product_sku: '',
quantity: product_qty,
variation_id: variation_id,
};
$(document.body).trigger('adding_to_cart', [$thisbutton, data]);
$.ajax({
type: 'post',
url: wc_add_to_cart_params.ajax_url,
data: data,
beforeSend: function (response) {
$thisbutton.removeClass('added').addClass('loading');
},
complete: function (response) {
$thisbutton.addClass('added').removeClass('loading');
},
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);
我查看了 wc-template-functions.php 并且有一个woocommerce_grouped_add_to_cart
钩子。我仍然不完全理解这些钩子在 woocommerce 中是如何工作的,但我认为它的工作原理类似于“复制和粘贴”或“插入”。
分组产品是单个产品和单个数量的组合。所以我认为我们需要处理孩子的身份证?
我发现这几行看起来很相关:
$products = array_filter( array_map( 'wc_get_product', $product->get_children() ), 'wc_products_array_filter_visible_grouped' );
$grouped_products = wc_get_products( array( 'limit' => -1, 'type' => 'grouped' ) );
$ids = wc_get_products( array( 'limit' => -1, 'type' => 'grouped', 'return' => 'ids' ) );
我也看过single-product/add-to-cart/grouped.php
并试图复制,但可以预见的是无济于事。
如何合并分组产品并使其与 Ajax 添加到购物车按钮一起使用?甚至可能吗?
解决方案
推荐阅读
- python - 如何在 Python 的另一个循环中正确编写一个 for 循环?
- angular - 为循环索引应用过滤器管道后的角度 2+ 显示原始列表中的索引
- java - JUnit5 ConsoleLauncher NoClassDefFoundError
- sql - How to target a record of table B to and Id of Table A based on a time restriction?
- python - 如何检查字符串是否包含单词?
- angular - Angular - 获取当前激活的路线并使用不同的路线参数重新导航到同一页面
- opengl - glMultiDrawElementsIndirect - 绘制破碎的网格......偏移问题?
- python - NameError:名称“AnsibleModule”未在 PyCharm 中定义
- async-await - Apollo Client Error, Objects are not valid as a React child (found: [object Promise])
- javascript - Google Places API field filter not applying