2

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

在下面的函数中, $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;
    }
4

3 回答 3

1

您的结束日期必须是有效日期,并且必须采用“Ymd 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

于 2017-07-04T15:01:23.223 回答
1

默认情况下,WooCommerce 订阅将从上次付款时间开始计算订阅的下一个付款日期。此挂钩将其更改为从预定付款日期计算下一个付款日期,而不是实际处理付款的时间。

要解决此问题,请在您的 function.php 主题文件中添加此挂钩:

add_filter( 'wcs_calculate_next_payment_from_last_payment', '__return_false' );
于 2020-07-08T09:26:30.777 回答
0

如果您需要在现有产品的现有数据库中创建一些具有到期日期的新订单,那么您可以创建另一个函数来处理 $dateStart、$dateEnd 等一些参数,作为奖励,您将无需计算日期范围。

您的第一个函数将应用于新订单。好的。已注册订单的新订单以处理您的应用程序中新实施的到期机制。

于 2017-07-03T19:23:32.683 回答