2017-06-27 143 views
3

我尝试创建具有特定到期日期的订阅。Woocommerce订阅更改到期日期

在下面的函数中, $product_args是一个包含有关产品的详细信息的数组。此数组包含product_id,regular_price等。product_id引用订阅变量产品。

$start_date_timestamp是订阅的开始日期。这个时间戳可以在几个月前。

例如,我需要从2月前(4月1日)开始创建订阅。订阅期限为3个月,因此订阅期限必须为7月1日。

但现在的问题是,订阅过期设置为9月27日(因为我们目前6月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; 
    } 
+0

请发表您使用调用这个函数和正在传递给它的所有参数的代码工作正常。谢谢! – Spartacus

回答

0

如果您需要将现有产品的一些新订单的现有数据库中创建有过期日期,那么你可以做另一个函数来处理一些参数,如$ dateStart,$ dateEnd,并且作为奖励礼物,你将不计算日期范围。

您的第一个功能将应用于新订单。好。 新的已经注册的命令来处理您的应用程序中新实现的过期机制。

0

您的结束日期必须是有效的日期和它必须是格式'Y-M-d H:I:S'

请试试这个代码。这是我的最终

$current_date = date("Y-m-d H:i:s") ; 

// Setting start date to 1 day before the current date : you can set as require 
$start_date = date('Y-m-d H:i:s',strtotime($current_date . "-1 days"));   

// end date : setting 12 month after the current date : you can set as require 
$end_date = date('Y-m-d H:i:s',strtotime("+12 months", strtotime($start_date))); 

$dates_to_update = array(); 
$dates_to_update['end'] = $end_date; 
// $dates_to_update['next_payment'] = $end_date; 
// $dates_to_update['trial_end'] = $end_date; 
$subscription->update_dates($dates_to_update); 

https://hotexamples.com/examples/-/WC_Subscriptions_Product/get_expiration_date/php-wc_subscriptions_product-get_expiration_date-method-examples.html

https://hotexamples.com/examples/-/-/wcs_is_datetime_mysql_format/php-wcs_is_datetime_mysql_format-function-examples.html