通过 AJAX 添加可变产品后更新 WooCommerce 购物车
Update WooCommerce Cart After Adding Variable Product Via AJAX
我已经组装了 link 以将可变产品添加到我的购物车中,但我不知道如何在不重新加载页面的情况下 "refresh" 购物车。我的猜测是我没有正确地使这个 AJAX 添加到购物车请求,因此 woocommerce_add_to_cart_fragments (我相信我的购物车 HTML 将被放置以进行刷新)没有被打电话。
$addToCartLink = '?add-to-cart=' . $prod->id . '&variation_id=' . $var_id . '&attribute_pa_quantity-attribute=' . $var_quantity;
jQuery.get($addToCartLink, function() {
//refreshCart();
});
如果有人能指出正确的方向,我将不胜感激。 Variable/AJAX/WooCommerce 文档似乎相当稀疏。
@helgatheviking - 谢谢,我在发布后几个小时就发现了。这也提供了巨大的帮助 https://github.com/wp-plugins/woocommerce-ajax-add-to-cart-for-variable-products/blob/master/js/add-to-cart-variation.js.
这是我完成的解决方案,以防对任何人有帮助。
我将 var_id 和 product_id 存储为数据属性和数量,并且 var_name 在这种情况下是硬编码的。 .doodleVarButton 是 class 我应用于所有可变项目添加到购物车链接。
JS
jQuery( function( $ ) {
$( document ).on( 'click', '.doodleVarButton', function() {
var var_id = $(this).data("varid");
var product_id = $(this).data("prodid");
var data = {
action: 'woocommerce_add_to_cart_variable_rc',
product_id: product_id,
quantity: 1,
variation_id: var_id,
variation: 'quantity-attribute'
};
jQuery.post( woocommerce_params.ajax_url, data, function( response ) {
var fragments = response.fragments;
if ( fragments ) {
$.each(fragments, function(key, value) {
$(key).replaceWith(value);
});
}
});
});
扩展WC动作(投入functions.php)
add_action( 'wp_ajax_woocommerce_add_to_cart_variable_rc','woocommerce_add_to_cart_variable_rc_callback' );
function woocommerce_add_to_cart_variable_rc_callback() {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );
$quantity = empty( $_POST['quantity'] ) ? 1 : apply_filters( 'woocommerce_stock_amount', $_POST['quantity'] );
$variation_id = $_POST['variation_id'];
$variation = $_POST['variation'];
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ) ) {
do_action( 'woocommerce_ajax_added_to_cart', $product_id );
if ( get_option( 'woocommerce_cart_redirect_after_add' ) == 'yes' ) {
wc_add_to_cart_message( $product_id );
}
WC_AJAX::get_refreshed_fragments();
} else {
//$this->json_headers();
header('Content-Type: application/json');
$data = array(
'error' => true,
'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
);
echo json_encode( $data );
}
die();
}
然后 - 键 - WC_AJAX::get_refreshed_fragments 调用关键的 woocommerce_header_add_to_cart_fragment 函数 来更新你的购物车。我的购物车在单独的 PHP 文件中模块化。
只需确保 $fragments[xxx] 中的 'xxx' 与您的购物车代码的容器匹配。
function woocommerce_header_add_to_cart_fragment( $fragments ) {
ob_start();
include( dirname(__FILE__) . "/../views/checkout-bar.php");
$fragments['div.checkout'] = ob_get_clean();
return $fragments;
}
add_filter( 'woocommerce_add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment' );
我已经组装了 link 以将可变产品添加到我的购物车中,但我不知道如何在不重新加载页面的情况下 "refresh" 购物车。我的猜测是我没有正确地使这个 AJAX 添加到购物车请求,因此 woocommerce_add_to_cart_fragments (我相信我的购物车 HTML 将被放置以进行刷新)没有被打电话。
$addToCartLink = '?add-to-cart=' . $prod->id . '&variation_id=' . $var_id . '&attribute_pa_quantity-attribute=' . $var_quantity;
jQuery.get($addToCartLink, function() {
//refreshCart();
});
如果有人能指出正确的方向,我将不胜感激。 Variable/AJAX/WooCommerce 文档似乎相当稀疏。
@helgatheviking - 谢谢,我在发布后几个小时就发现了。这也提供了巨大的帮助 https://github.com/wp-plugins/woocommerce-ajax-add-to-cart-for-variable-products/blob/master/js/add-to-cart-variation.js.
这是我完成的解决方案,以防对任何人有帮助。
我将 var_id 和 product_id 存储为数据属性和数量,并且 var_name 在这种情况下是硬编码的。 .doodleVarButton 是 class 我应用于所有可变项目添加到购物车链接。
JS
jQuery( function( $ ) {
$( document ).on( 'click', '.doodleVarButton', function() {
var var_id = $(this).data("varid");
var product_id = $(this).data("prodid");
var data = {
action: 'woocommerce_add_to_cart_variable_rc',
product_id: product_id,
quantity: 1,
variation_id: var_id,
variation: 'quantity-attribute'
};
jQuery.post( woocommerce_params.ajax_url, data, function( response ) {
var fragments = response.fragments;
if ( fragments ) {
$.each(fragments, function(key, value) {
$(key).replaceWith(value);
});
}
});
});
扩展WC动作(投入functions.php)
add_action( 'wp_ajax_woocommerce_add_to_cart_variable_rc','woocommerce_add_to_cart_variable_rc_callback' );
function woocommerce_add_to_cart_variable_rc_callback() {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );
$quantity = empty( $_POST['quantity'] ) ? 1 : apply_filters( 'woocommerce_stock_amount', $_POST['quantity'] );
$variation_id = $_POST['variation_id'];
$variation = $_POST['variation'];
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ) ) {
do_action( 'woocommerce_ajax_added_to_cart', $product_id );
if ( get_option( 'woocommerce_cart_redirect_after_add' ) == 'yes' ) {
wc_add_to_cart_message( $product_id );
}
WC_AJAX::get_refreshed_fragments();
} else {
//$this->json_headers();
header('Content-Type: application/json');
$data = array(
'error' => true,
'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
);
echo json_encode( $data );
}
die();
}
然后 - 键 - WC_AJAX::get_refreshed_fragments 调用关键的 woocommerce_header_add_to_cart_fragment 函数 来更新你的购物车。我的购物车在单独的 PHP 文件中模块化。
只需确保 $fragments[xxx] 中的 'xxx' 与您的购物车代码的容器匹配。
function woocommerce_header_add_to_cart_fragment( $fragments ) {
ob_start();
include( dirname(__FILE__) . "/../views/checkout-bar.php");
$fragments['div.checkout'] = ob_get_clean();
return $fragments;
}
add_filter( 'woocommerce_add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment' );