使用 AJAX - WooCommerce API 向购物车添加变体? [英] Add a Variation to Cart using AJAX - WooCommerce API?

查看:18
本文介绍了使用 AJAX - WooCommerce API 向购物车添加变体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含以下数据的项目:

I have an item with the following data :

var item = {
  id : "124",
  name : "xxx",
  price : "13.13",
  quantity : 1,
  options : {
    "size" : "xl",
    "color": "pink"
  }
};

当用户单击添加到购物车"时,我想使用 WC API 发出 Ajax 请求并将上述项目添加到购物车.

When the user clicks on "Add to Cart" I'd like to make an Ajax Request using the WC API and add the above item to the Cart.

jQuery.ajax({
   url: "some/woocommerce/api/add/to/cart/request/path",
   data: item,
   type: "POST"
});

然后在购物车页面上,我想使用 WC API 发出另一个 Ajax 请求并检索购物车的内容.

Then on the Cart Page I'd like to make another Ajax Request using the WC API and retrieve the contents of the cart.

我没有找到任何关于如何使用 Javascript 从客户端执行此操作的文档(官方或非官方).

I haven't found any documentation (official or unofficial) on how to do that from the client using Javascript.

有谁知道并且可以给我提供一个例子吗?

Does anyone know and can provide me with an example please?

此外,有谁知道为什么 WooCommerce Api 文档如此糟糕(缺乏关于上述明显/标准问题的任何类型的信息).我正在认真考虑让我们公司改用 Shopify.

Also, does anyone know why the WooCommerce Api Documentation is so horrible (lacking any kind of information regarding obvious/standard questions like the above). I'm seriously thinking of having our company switch to Shopify.

推荐答案

您可以直接在代码中调查 WooCommerce 如何通过 ajax 将商品添加到购物车中....回调位于 includes/class-wc-ajax.php.WooCommerce 已经在产品循环"(产品档案)上做到了这一点,所以我认为你不需要重新发明轮子,如果他们现有的代码对你想要做的事情不起作用,那么你应该能够借用严重从它.

You can investigate how WooCommerce is adding items to the cart via ajax directly in the code.... the callback is located in includes/class-wc-ajax.php. WooCommerce already does this on product "loops" (product archives), so I don't think you need to reinvent the wheel and if their existing code doesn't work for what you are trying to do, then you should be able to borrow heavily from it.

该文件的开头有一个包含所有 WooCommerce Ajax 操作的循环,但我们可以追踪到添加到购物车的内容基本上是这样的:

The beginning of that file has a loop with all the WooCommerce Ajax actions, but we can track down that the add to cart is basically this:

add_action( 'wp_ajax_nopriv_woocommerce_add_to_cart', array( 'WC_AJAX', 'add_to_cart' ) );

它的回调在文件的更深处:

And it's callback is a little further down the file:

/**
 * AJAX add to cart
 */
public static function add_to_cart() {
    ob_start();

    $product_id        = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );
    $quantity          = empty( $_POST['quantity'] ) ? 1 : wc_stock_amount( $_POST['quantity'] );
    $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 ) ) {

        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 );
        }

        // Return fragments
        self::get_refreshed_fragments();

    } else {

        // If there was an error adding to the cart, redirect to the product page to show any errors
        $data = array(
            'error' => true,
            'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
        );

        wp_send_json( $data );

    }

    die();
}

如果您想查看他们添加到购物车的 ajax 调用,其 JS 位于 assest/js/frontend/add-to-cart.js.

If you want to view their add to cart ajax call, the JS for that is located in assest/js/frontend/add-to-cart.js.

编辑

既然我知道您要添加一个变体,也许我们可以调整上面的内容.

Now that I know you are looking to add a variation, maybe we can tweak the above.

首先,我认为您需要将 AJAX 网址传递给您的脚本:

First, I think you'll need to pass the AJAX url to your script:

wp_enqueue_script( 'wc-variation-add-to-cart', 'source-to-script/your-script.js' );

$vars = array( 'ajax_url' => admin_url( 'admin-ajax.php' ) );
wp_localize_script( 'wc-variation-add-to-cart', 'WC_VARIATION_ADD_TO_CART', $vars );

然后您的 AJAX 调用将如下所示:

Then your AJAX call would look something like this:

jQuery.ajax({
    url: WC_VARIATION_ADD_TO_CART.ajax_url,
    data: {
        "action" : "woocommerce_add_variation_to_cart",
        "product_id" : "124",
        "variation_id" : "125",
        "quantity" : 1,
        "variation" : {
            "size" : "xl",
            "color": "pink"
        },
    },
    type: "POST"
});

基本上要添加特定变体,除了所有特定选项之外,您还需要变体 ID.

Basically to add a specific variation you need the variation's ID in addition to all its specific options.

最后,woocommerce_add_variation_to_cart ajax 操作的新回调将遵循以下内容:

And finally the new callback for the woocommerce_add_variation_to_cart ajax action would be along the lines of the following:

add_action( 'wp_ajax_nopriv_woocommerce_add_variation_to_cart', 'so_27270880_add_variation_to_cart' );

function so_27270880_add_variation_to_cart() {

    ob_start();

    $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      = isset( $_POST['variation_id'] ) ? absint( $_POST['variation_id'] ) : '';
    $variations         = ! empty( $_POST['variation'] ) ? (array) $_POST['variation'] : '';

    $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 ) ) {

        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 );
        }

        // Return fragments
        WC_AJAX::get_refreshed_fragments();

    } else {

        // If there was an error adding to the cart, redirect to the product page to show any errors
        $data = array(
            'error' => true,
            'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
        );

        wp_send_json( $data );

    }

    die();
}

大多数情况下,我只是复制 WooCommerce 的方法并添加添加变体所需的 2 个变量.完全未经测试,但我希望它有所帮助.

Mostly, I'm just copying WooCommerce's approach and adding in the 2 variables needed for adding variations. Totally untested, but I hope it helps.

这篇关于使用 AJAX - WooCommerce API 向购物车添加变体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆