What constitutes an e-Commerce store? You have products (of course), which are the core of your store. You have associated prices, taxes, payment gateways, sales, coupons and so on. For every purchase made, you have invoices and orders. In an e-Commerce store based on WordPress, your e-Commerce plugin would manage all of the said functionality. So, WooCommerce would manage all of this.
When you think about it, managing product information, such as description, pricing, sales, are the primary responsibilities of an e-Commerce plugin like WooCommerce. Whereas, invoices, order management, shipment tracking, become part of peripheral responsibilities. WooCommerce handles products well. You can set up various types of products (some using extensions), add sale banners, link related products, categorize and tag products, and manage purchases using various payment methods. It makes the task of a buyer real simple.
When it comes to admin activities, the task is a bit tricky, because your options are limited. Several WooCommerce store owners prefer integrating external services. For example, a client needed e-conomic, an external accounting system, to be integrated with WooCommerce. This was achievable, because e-conomic provided the needed API.
Similarly, if a system has a ready API, you could integrate it with the WooCommerce plugin. In this article, we’ll explore how to integrate an external order management system with WooCommerce.
Integrating WooCommerce with an Order Management System
When it comes to order management, the data which is part of a WooCommerce order, should be sent across to the external system. Let’s assume, that your Order Management system offers an API, which accepts order details (as listed below) and processes it.
Details which can be sent to the external system:
- Customer e-mail (customer_email)
- Customer Phone (customer_phone)
- Billing Details
- First Name (bill_firstname)
- Last Name (bill_surname)
- Address Line 1 (bill_address1)
- Address Line 2 (bill_address2)
- City (bill_city)
- State (bill_state)
- ZIP Code (bill_zip)
- Shipping Details
- First Name (ship_firstname)
- Last Name (ship_surname)
- Address Line 1 (ship_address1)
- Address Line 2 (ship_address2)
- City (ship_city)
- State (ship_state)
- ZIP Code (ship_zip)
- Shipping Method (shipping_type)
- Shipping Cost (shipping_cost)
- Item SKU (item_sku)
- Item Price (item_price)
- Quantity (quantity)
- Transaction ID/Key (transaction_key)
- Coupon Code (coupon_code)
[space]
Send Order Details to an External System
To send details from WooCommerce to this external order management system, you have to use cURL. For this, use the below code, by adding it to functions.php of your theme or a custom plugin (recommended).
/* after an order has been processed, we will use the 'woocommerce_thankyou' hook, to add our function, to send the data */ add_action('woocommerce_thankyou', 'wdm_send_order_to_ext'); function wdm_send_order_to_ext( $order_id ){ // get order object and order details $order = new WC_Order( $order_id ); $email = $order->billing_email; $phone = $order->billing_phone; $shipping_type = $order->get_shipping_method(); $shipping_cost = $order->get_total_shipping(); // set the address fields $user_id = $order->user_id; $address_fields = array('country', 'title', 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'address_3', 'address_4', 'city', 'state', 'postcode'); $address = array(); if(is_array($address_fields)){ foreach($address_fields as $field){ $address['billing_'.$field] = get_user_meta( $user_id, 'billing_'.$field, true ); $address['shipping_'.$field] = get_user_meta( $user_id, 'shipping_'.$field, true ); } } // get coupon information (if applicable) $cps = array(); $cps = $order->get_items( 'coupon' ); $coupon = array(); foreach($cps as $cp){ // get coupon titles (and additional details if accepted by the API) $coupon[] = $cp['name']; } // get product details $items = $order->get_items(); $item_name = array(); $item_qty = array(); $item_price = array(); $item_sku = array(); foreach( $items as $key => $item){ $item_name[] = $item['name']; $item_qty[] = $item['qty']; $item_price[] = $item['line_total']; $item_id = $item['product_id']; $product = new WC_Product($item_id); $item_sku[] = $product->get_sku(); } /* for online payments, send across the transaction ID/key. If the payment is handled offline, you could send across the order key instead */ $transaction_key = get_post_meta( $order_id, '_transaction_id', true ); $transaction_key = empty($transaction_key) ? $_GET['key'] : $transaction_key; // set the username and password $api_username = 'testuser'; $api_password = 'testpass'; // to test out the API, set $api_mode as ‘sandbox’ $api_mode = 'sandbox'; if($api_mode == 'sandbox'){ // sandbox URL example $endpoint = "http://sandbox.example.com/"; } else{ // production URL example $endpoint = "http://example.com/"; } // setup the data which has to be sent $data = array( 'apiuser' => $api_username, 'apipass' => $api_password, 'customer_email' => $email, 'customer_phone' => $phone, 'bill_firstname' => $address['billing_first_name'], 'bill_surname' => $address['billing_last_name'], 'bill_address1' => $address['billing_address_1'], 'bill_address2' => $address['billing_address_2'], 'bill_city' => $address['billing_city'], 'bill_state' => $address['billing_state'], 'bill_zip' => $address['billing_postcode'], 'ship_firstname' => $address['shipping_first_name'], 'ship_surname' => $address['shipping_last_name'], 'ship_address1' => $address['shipping_address_1'], 'ship_address2' => $address['shipping_address_2'], 'ship_city' => $address['shipping_city'], 'ship_state' => $address['shipping_state'], 'ship_zip' => $address['shipping_postcode'], 'shipping_type' => $shipping_type, 'shipping_cost' => $shipping_cost, 'item_sku' => implode(',', $item_sku), 'item_price' => implode(',', $item_price), 'quantity' => implode(',', $item_qty), 'transaction_key' => $transaction_key, 'coupon_code' => implode( ",", $coupon ) ); // send API request via cURL $ch = curl_init(); /* set the complete URL, to process the order on the external system. Let’s consider http://example.com/buyitem.php is the URL, which invokes the API */ curl_setopt($ch, CURLOPT_URL, $endpoint."buyitem.php"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec ($ch); curl_close ($ch); // the handle response if (strpos($response,'ERROR') !== false) { print_r($response); } else { // success } }
The above code is a very basic example. You can enhance it, based on the APIs available, or as per your requirements. Also, this can be used only to send order details from WooCommerce to an external system (and not vice versa). To send data back to WooCommerce, you will need to make use of additional API, the system provides.
[space]
Do you intend to use an external Order Management system with WooCommerce? Hope this article can get you started. If you have any doubts, you can write them to me, via the comment section below.
[freepik]
22 Responses
Can I use similar method to update order coming from external system into my woocommerce site – essentially I have a ecommerce store but also sell with other market place vendors who allow API integration… I need to write code so that when they take can order it should update my system as well…
Hi,
You can use the
wc_create_order()
function to create a new order. I think this thread https://github.com/woothemes/woocommerce/issues/4169 can help you out. You’ll need version 2.2 or higher of WooCommerce.im trying to et your function to work with http: // www. promosoftware.co. uk / rest-api /
any tips?
Hi Aaron,
The key is to replace the endpoints (I’m sure you’ve done that), and to replace the data being sent (keys for $data), with values the API would accept.
Im stuck… spent all night trying to get it to work…. 🙁
Sorted it… Thanks
Hello,
thanks for inspiration. But can I ask from where you filled the $address array? Because in my code I have problems with getting data which are stored in your $address variable.
Thanks for pointing out the slip-up. Hope that resolves your problem.
I have pasted the code at the bottom of my functions.php doc…what do I do now? Or is it good to go?
I am trying to use Shopatron as the order management system and they have API’s but I cannot find anyone online with the same problem. I have downloaded a theme and woocommerce but am not sure where to go from here.
Kelley,
I’ve provided a template. What you’ll need to do, is replace the endpoints, and the data being sent (keys for $data), with values Shopatron’s API would accept.
Hi
I have been studying the code above. I have one question; I have a woocommerce site, and I got a airtme API from an external company..basically what the API does is to topup airtime, a user would buy airtime(in this case it will be a normal woocommerce product) and then from there I need the API to invoked, and then return to the site to checkout.
I am not sure if this makes sense?
Thanks in advance
Katlego Ntimane
I make dresses and sell them on my WooCommerce site. Now third party online retailers want to sell my goods and have ME drop-ship to their customers. I have found plugins to automatically send inventory update .csv files in cron nightly, and also to import orders. But the order import does not deduct from inventory, nor will it invoice or even charge a credit card. Any advice?
Hello,
I have added above code into function.php but now what I have to do. Can anyone please help next step.
I want to send Woocommerce subscription checkout and register(name, email, address, password..etc) details to external api at the time of checkout. Please suggest me any solution
Hi, how much cost to develop this for my Woocommerce site? I want to connect it to SuiteCRM. Thanks.
i delete phone no and city /state field from checkout page and in order mail not dispaly any shipping information.i dont know why this issue is genereate?
Great resource! Thanks for the pointer..
Is there as simple of a solution available for using an external database for items? Not importing a csv, but using an external item API to retrieve one or many items?
So..
I import the entire item table to load WC for the first time, and do periodic (daily late at night..) updates.
Then, on an ongoing basis, what function could I then use to check external stock (multiple locations too!) for whether or not an item is available for sale.
Oh yeah.. I’m a complete noob with WP & WooCommerce, but I have been a developer since 1985..
Nice article, but can you please write tutorial how to import woo order from another system using API?
I’d been trying to find a solution to hook up WooCommerce to a distributer of mine for hours, and this was what I needed to find! Thank you so much!
I changed the trigger to woocommerce_order_status_completed. There’s a free plugin called WooCommerce autocomplete, which will then only trigger this function if payment was successful.
I know that it has been a long time since you posted this, but I don’t seem to have access to the shipping item and the items data with your code.
Hi Praveen,
Hi want to send Variations as well, but I don’t think that you have not speak about that. So, it’s an excellent article, very clear !