Skip to content

Instantly share code, notes, and snippets.

@vishalbasnet23
Created June 28, 2016 07:51
Show Gist options
  • Save vishalbasnet23/181f640053d5400530a4411a93cf87f7 to your computer and use it in GitHub Desktop.
Save vishalbasnet23/181f640053d5400530a4411a93cf87f7 to your computer and use it in GitHub Desktop.
Create WooCommerce Subscription and activate Subscription for a user programatically.
<?php
function cpm_create_order($customer_data, $the_customer) {
global $woocommerce;
$product_id = $customer_data['sub_product'];
$variation_id = $customer_data['sub_variation'];
$user_first_name = $customer_data['first_name'];
$user_last_name = $customer_data['last_name'];
$user_email = $customer_data['user_email'];
$billing_email = $customer_data['user_email'];
$billing_state = $customer_data['cpm_state'];
$billing_post_code = $customer_data['cpm_zip'];
$billing_country = $customer_data['cpm_country'];
$variation_factory = new WC_Product_Variation($variation_id);
$variation_obj = $variation_factory->get_variation_attributes();
$quantity = 1;
$user_id = $the_customer->user_id;
$order = wc_create_order();
update_post_meta( $order->id, '_billing_first_name', $user_first_name );
update_post_meta( $order->id, '_billing_last_name', $user_last_name );
update_post_meta( $order->id, '_billing_email', $billing_email );
update_post_meta( $order->id, '_billing_state', $billing_state );
update_post_meta( $order->id, '_billing_postcode', $billing_post_code );
update_post_meta( $order->id, '_shipping_first_name', $user_first_name );
update_post_meta( $order->id, '_shipping_last_name', $user_last_name );
$product_to_add = get_product( $product_id );
$price = $variation_factory->get_price();
$price_params = array( 'variation' => $variation_obj, 'totals' => array( 'subtotal' => $price*$quantity, 'total' => $price*$quantity, 'subtotal_tax' => 0, 'tax' => 0 ) );
$order->add_product( wc_get_product( $product_id ), $quantity, $price_params ); // pid 8 & qty 1
$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
$order->set_total( $price*$quantity , 'order_discount'); // not pennies (use dollar amount)
$order->set_payment_method($this);
$order->calculate_totals();
update_post_meta( $order->id, '_customer_user', $user_id );
cpm_create_subscription( $order, $product_id, $price_params, $variation_id );
}
function cpm_create_subscription( $order, $product_id, $price_args, $variation_id ) {
$quantity = 1;
$start_date = $order->order_date;
$period = WC_Subscriptions_Product::get_period( $variation_id );
$interval = WC_Subscriptions_Product::get_interval( $variation_id );
$sub = wcs_create_subscription( array( 'order_id' => $order->id, 'billing_period' => $period, 'billing_interval' => $interval, 'start_date' => $start_date )) ;
$sub->add_product( wc_get_product( $product_id ), $quantity, $price_args );
$sub->calculate_totals();
WC_Subscriptions_Manager::activate_subscriptions_for_order($order);
}
@maartents
Copy link

Where can i use this?

@maartents
Copy link

Can you maybe update it to the new version?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment