I try to create a subscription with a specific expiration date.
In the function below,
$product_args
is an array with details about the product. This array contain product_id, regular_price, etc. The product_id refers to a subscription variable product.
$start_date_timestamp
is the subscription start date. This timestamp can be some month before.
By example, I need to create a subscription starting 2 month before (the April 1st). The subscription length is 3 months, so the subscription expiration must be July 1st.
But the problem right now is that the subscription expiration is set to September 27. (Because we are currently June 27)
static function create_subscription($customer_id,$product_args,$billing_args,$shipping_args = false,$order_notes = false,$client_notes = false,$order_status = false,$start_date_timestamp = false) {
$start_date = false;
if($start_date_timestamp==false)
{
$start_date = date( 'Y-m-d H:i:s', strtotime( 'now' ) );
}
else
{
$start_date = date( 'Y-m-d H:i:s', $start_date_timestamp);
}
$order_id = \perfo\woocommerce\order::create_order( $customer_id, $product_args, $billing_args,$shipping_args,$order_notes,$client_notes,$order_status);
if ( ! is_wp_error($order_id) )
{
$wc_product = wc_get_product($product_args['product_id']);
$period = \WC_Subscriptions_Product::get_period( $wc_product );
$interval = \WC_Subscriptions_Product::get_interval( $wc_product );
$length = \WC_Subscriptions_Product::get_length( $wc_product );
$expiration = \WC_Subscriptions_Product::get_expiration_date( $product_args['product_id'],$start_date );
$subscription = wcs_create_subscription(array('order_id' => $order_id, 'billing_period' => $period, 'billing_interval' => $interval, 'start_date' => $start_date,'end'=>$expiration));
if(!is_wp_error($subscription))
{
$wc_product->set_regular_price($product_args['regular_price']);
$wc_product->set_price($product_args['regular_price']);
$subscription->add_product( $wc_product, $product_args['quantity']);
$subscription->set_address( $billing_args, 'billing' );
if($shipping_args)
$subscription->set_address( $shipping_args, 'shipping' );
$subscription->update_dates( array(
'end' => $expiration,
) );
$subscription->calculate_totals();
$subscription->save();
}
else
{
wp_delete_post($order_id,true);
}
return $subscription;
}
return $order_id;
}