我正在使用wordpresss和woocommerce进行电子商务,即时添加商店页面和类别页面按钮,显示每种产品的尺寸。在主题函数中使用此代码:
function woocommerce_variable_add_to_carts() {
global $product, $post;
$variations = $product->get_available_variations();
$product_sku = $product->get_sku();
$out = '<ul class="iconic-was-swatches iconic-was-swatches--loop iconic-was-swatches--text-swatch iconic-was-swatches--square">';
foreach ($variations as $key => $value) {
if (!empty($value['attributes'])) {
foreach ($value['attributes'] as $attr_key => $attr_value) {
$out .= '<li><a id="'.esc_attr($post->ID).'" data-quantity="1" data-product_id="'.esc_attr($post->ID).'" data-product_sku="'.$product_sku.'" class="iconic-was-swatch iconic-was-swatch--follow iconic-was-swatch--text-swatch add_to_cart_button">';
$out .= $attr_value . '</a></li>';
}
}
}
$out .= '</ul>';
echo $out;
}
add_action('woocommerce_before_shop_loop_item_title', 'woocommerce_variable_add_to_carts');
这个想法是,当用户点击其中一个尺寸按钮时,产品会直接在该页面(商店页面,类别页面)中添加到购物车中。我根据提供的答案here制作了一个自定义端点来解决这个问题。我在包含这个的js文件中调用ajax函数:
$('.add_to_cart_button').on('click',function(){
jQuery.ajax({
url: WC_VARIATION_ADD_TO_CART.ajax_url,
type: "POST",
data: {
action : "customAdd_to_cart",
product_id : "697",
variation_id : "707",
quantity : 1,
variation : {
size : "s",
color: "pink"
}
},
success: function(){
alert('Ajax Success ');
}
});
});
(我正在使用特定的product_id和variation_id进行测试)然后我在主题功能页面添加回调函数,将产品添加到购物车:
function customAddToCart() {
ob_start();
try {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $data['product_id'] ) );
$quantity = empty( $data['quantity'] ) ? 1 : wc_stock_amount( $data['quantity'] );
$variation_id = isset( $data['variation_id'] ) ? absint( $data['variation_id'] ) : '';
$variations = $variation_id ? (array) get_variation_data_from_variation_id( $variation_id ) : null;
$product_status = get_post_status( $product_id );
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $variation_id, $variations, $cart_item_data );
if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations ) && 'publish' === $product_status ) {
do_action( 'woocommerce_ajax_added_to_cart', $product_id );
$res = getCartFragments();
} else {
$res = array(
'error' => true
);
}
return $res;
} catch (Exception $e) {
return new WP_Error('add_to_cart_error', $e->getMessage(), array('status' => 500));
}
}
add_action( 'wp_ajax_nopriv_woocommerce_add_variation_to_cart', 'customAddToCart' );
所有这一切似乎都运行正常,因为在控制台中没有出现任何错误,但问题是未添加选择的产品的变化大小只是添加产品。我不知道为什么会这样,我甚至在ajax成功函数中添加警报
alert('Ajax Success');
并显示该警报,但看起来似乎没有按照它应该发送的数据。
我想知道我在这些代码中缺少什么,或者它可能是js文件和他的位置,或者我需要在a&gt;中发送另一个值。建立在上面的第一个功能。我尝试了很多东西,但行为仍然相同。
答案 0 :(得分:0)
快速扫描您的代码,我注意到您使用ajax调用的操作不正确。它应该是woocommerce_add_variation_to_cart
而不是customAdd_to_cart
。此外,通常的做法是在ajax回调函数的末尾使用wp_send_json
(或更具体的wp_send_json_success
和wp_send_json_error
函数),以便在jQuery中获得可读且合理的响应。如果您之前没有使用过,请查看以下链接:
https://codex.wordpress.org/Function_Reference/wp_send_json
希望这有帮助。