首页 文章

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

提问于
浏览
0

我正在使用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制作了一个自定义 endpoints 来解决这个问题 . 我在包含这个的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>中发送另一个值 . 我尝试了很多东西,但行为仍然相同 .

1 回答

  • 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

    希望这可以帮助 .

相关问题