为什么ajax请求没有发送所有数据?

时间:2017-03-14 22:42:08

标签: javascript php jquery ajax woocommerce

我正在使用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;中发送另一个值。建立在上面的第一个功能。我尝试了很多东西,但行为仍然相同。

1 个答案:

答案 0 :(得分:0)

快速扫描您的代码,我注意到您使用ajax调用的操作不正确。它应该是woocommerce_add_variation_to_cart而不是customAdd_to_cart。此外,通常的做法是在ajax回调函数的末尾使用wp_send_json(或更具体的wp_send_json_successwp_send_json_error函数),以便在jQuery中获得可读且合理的响应。如果您之前没有使用过,请查看以下链接:

https://codex.wordpress.org/Function_Reference/wp_send_json

希望这有帮助。