简体   繁体   English

使用AJAX - WooCommerce API将变体添加到购物车?

[英]Add a Variation to Cart using 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"
  }
};

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. 当用户点击“添加到购物车”时,我想使用WC API制作Ajax请求,并将上述项目添加到购物车。

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

Then on the Cart Page I'd like to make another Ajax Request using the WC API and retrieve the contents of the cart. 然后在购物车页面上,我想使用WC API制作另一个Ajax请求并检索购物车的内容。

I haven't found any documentation (official or unofficial) on how to do that from the client using Javascript. 我没有找到任何关于如何使用Javascript从客户端执行此操作的文档(官方或非官方)。

Does anyone know and can provide me with an example please? 有谁知道并且能为我提供一个例子吗?

Also, does anyone know why the WooCommerce Api Documentation is so horrible (lacking any kind of information regarding obvious/standard questions like the above). 此外,有谁知道为什么WooCommerce Api文档是如此可怕(缺乏有关如上所述的明显/标准问题的任何信息)。 I'm seriously thinking of having our company switch to Shopify. 我正在认真考虑让我们公司改用Shopify。

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如何通过代码中的ajax直接向购物车添加商品....回调位于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已经在产品“循环”(产品档案)上做了这个,所以我认为你不需要重新发明轮子,如果他们现有的代码不能用于你想要做的事情,那么你应该能够借用很重要的。

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: 该文件的开头有一个包含所有WooCommerce Ajax操作的循环,但我们可以追踪到添加到购物车基本上是这样的:

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

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 . 如果你想查看他们的add to cart ajax调用,那个JS就位于assest/js/frontend/add-to-cart.js

EDIT 编辑

Now that I know you are looking to add a variation, maybe we can tweak the above. 现在我知道你想要添加一个变体, 也许我们可以调整上面的内容。

First, I think you'll need to pass the AJAX url to your script: 首先,我认为你需要将AJAX url传递给你的脚本:

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

Then your AJAX call would look something like this: 然后你的AJAX调用看起来像这样:

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

Basically to add a specific variation you need the variation's ID in addition to all its specific options. 基本上要添加特定变体,除了所有特定选项外,还需要变体ID。

And finally the new callback for the woocommerce_add_variation_to_cart ajax action would be along the lines of the following: 最后, woocommerce_add_variation_to_cart ajax操作的新回调将遵循以下内容:

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

Mostly, I'm just copying WooCommerce's approach and adding in the 2 variables needed for adding variations. 大多数情况下,我只是复制WooCommerce的方法并添加添加变体所需的2个变量。 Totally untested, but I hope it helps. 完全未经测试,但我希望它有所帮助。

If anyone is interested I've also written a "remove from cart" function to counter the add to cart. 如果有人有兴趣,我也写了一个“从购物车中删除”功能,以对抗添加到购物车。 My project called for radio buttons on checkout so I needed to add a product and remove the alternative it was already there: 我的项目在结账时调用了单选按钮,所以我需要添加一个产品并删除已存在的替代品:

Here's the php: 这是php:

function remove_from_cart( $product_id ) {
    $cart_contents  = WC()->cart->get_cart();

    if (empty($product_id)) { $product_id = $_POST['product_id']; }

    foreach ($cart_contents as $product_key => $product){
        if ($product['variation_id'] == $product_id){
            WC()->cart->remove_cart_item($product_key);
        }
    }
}

add_action( 'wp_ajax_nopriv_remove_from_cart', 'remove_from_cart' );

And then here's the jQuery: 接下来是jQuery:

function remove_item_from_cart(product){

    var data = {
                "action" : "remove_from_cart",
                "product_id" : product,
    };

    jQuery.post(WC_VARIATION_ADD_TO_CART.ajax_url, data, function(response) {
        $(document.body).trigger("update_checkout");
    });

}

The if(empty)... in the php was so I could call the function from the server side as well if I needed to. php中的if(空)...所以我可以从服务器端调用该函数,如果我需要的话。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM