Programmatically Create A WooCommerce Order
Today we’re going to dive into programmatically creating a WooCommerce order through a form submission. Quick background, we had a client that needed a custom funnel created that was a bit outside of what WooCommerce would have allowed. However, they were using a product fulfillment center that was planning to connect to WooCommerce via a pre-made plugin to download and fulfill/ship the orders. Therefore, we needed to create a custom page that housed the funnel process but then needed to hook back into WooCommerce to create the order.
What did we do?
We started with a basic form and collected the information we needed to collect. During the form submission we proceeded to create the order by hooking into pre-existing WooCommerce functions. Here’s some sample code that we’ll go through:
// here we are creating the users address. All of these variables have been assigned data previously in the submission process
$address = array(
'first_name' => $firstname,
'last_name' => $lastname,
'company' => '',
'email' => $youremail,
'phone' => $yourphone,
'address_1' => $youraddress,
'address_2' => '',
'city' => $yourcity,
'state' => $yourstate,
'postcode' => $yourzip,
'country' => 'US'
// first we create the order. We already have assigned $user_id the user ID of the customer placing the order.
$order = wc_create_order(array('customer_id' => $user_id));
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product( '782' ), 1 ); // This is the ID of an existing SIMPLE product
// You can add more products if needed by repeating the above line
$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
$shipping_tax = array();
// Here we're going to assign a custom shipping method.
$shipping_rate = new WC_Shipping_Rate( '', 'Flat Rate', '5.95', $shipping_tax, 'custom_shipping_method' );
// here we are adding some system notes to the order
$order->update_status("processing", 'Imported Order From Funnel', TRUE);
And that’s it! Please refer to the comments within the code to get a better understanding.