如何在 Woocommerce 订阅中设置下一个付款日期?

Posted

技术标签:

【中文标题】如何在 Woocommerce 订阅中设置下一个付款日期?【英文标题】:How to set Next Payment date in Woocommerce Subscriptions? 【发布时间】:2016-09-01 07:39:08 【问题描述】:

我想在创建初始(第一个)订单后更改有效订阅的下一个付款日期。

当前代码不起作用。为什么?我错过了什么?

//fires when new order payment is complete (NOT RENEWAL but original order!)
add_action('woocommerce_payment_complete', 'fm_upate_next_payment_datetime');

function fm_upate_next_payment_datetime ( $order_id ) 

if (WC_Subscriptions_Order::order_contains_subscription( $order_id ) == false) return;      
$subscription_key = WC_Subscriptions_Manager::get_subscription_key( $order_id, $product_id
= '');

 //hard code next payment date...(must be in future)
$next_payment = date( 'Y-m-d H:i:s', '2016-05-20 00:10:10' );

//set the new payment date  
WC_Subscriptions_Manager::set_next_payment_date( $subscription_key, $user_id = '', $next_payment );


【问题讨论】:

【参考方案1】:

您所说的,我们还需要设定开始日期! (可以是现在)但如果它没有通过它会抛出一个错误。 让它像这样工作:

function saveNewDate($post_id) 

    $subscription = wcs_get_subscription( $post_id );
    $dates        = array();

    $datetime           = current_time( 'timestamp', true );
    $dates[ 'start' ] = date( 'Y-m-d H:i:s', $datetime );
    $datetime = strtotime( "08/23/2016 23:30" );
    $dates['next_payment'] = date( 'Y-m-d H:i:s', $datetime );

    try 
        $subscription->update_dates( $dates, 'gmt' );
        wp_cache_delete( $post_id, 'posts' );
     catch ( Exception $e ) 
        wcs_add_admin_notice( $e->getMessage(), 'error' );
    

【讨论】:

【参考方案2】:

对我来说可行的解决方案是(另见https://docs.woocommerce.com/document/subscriptions/develop/functions/#section-4):

function update_next_payment_date($subscription) 
    $date = new DateTime('2021-05-28');
    $date->setTime(8, 55);

    $subscription_next_payment_date = date_format($date, 'Y-m-d H:i:s'); // = '2021-05-28 08:55:00'

    $new_dates = array(
        'start' => $subscription->get_date('start'),
        'trial_end' => $subscription->get_date('trial_end'),
        'next_payment' => $subscription_next_payment_date,
        'last_payment' => $subscription->get_date('last_payment'),
        'end' => $subscription->get_date('end'),
    );

    $subscription->update_dates($new_dates);

【讨论】:

【参考方案3】:

我认为这不起作用,因为您使用空变量 $product_id 调用 $subscription_key。 在您的函数中,使用此代码,$product_id 没有任何价值。

您应该通过引用或从函数中提取来传递它。

【讨论】:

【参考方案4】:

Woocommerce 订阅在 3 天前更改了下一个付款日期:

add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);  

function nextpaymentdatechange( $order_id )
    if ( wcs_order_contains_subscription( $order_id ) ) 
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $threedays_ago = date( 'Y-m-d H:i:s', strtotime( '-3 days', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $threedays_ago, $nextdate );
    

【讨论】:

嘿,这个功能可以改变下一个付款日期吗?【参考方案5】:
add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);  

function nextpaymentdatechange( $order_id )
    if ( wcs_order_contains_subscription( $order_id ) ) 
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $threedays_ago = date( 'Y-m-d H:i:s', strtotime( '-3 days', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);
    

请不要在 update_post_meta() 中使用 4 个值。

通过更改仅使用 3 个值:

update_post_meta( $subid , '_schedule_next_payment', $threedays_ago, $nextdate );

到:

update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);

【讨论】:

感谢您的贡献。虽然此代码可能会解决 OP 的问题,但最好添加上下文,或解释此代码为何/如何解决问题。 SO 对于学习和分享知识很有价值(而不是为个别问题提供服务的代码)。通过这种方式,未来的访问者可以学习并将这些信息应用到他们自己的问题上,或者从一开始就阻止它们。还鼓励链接到源文档作为后续信息。 (另外,你为什么要求用户“请”传递 3 个值,而不是 4 个?如果这是根据定义,说明这一事实,并可能包括一个文档链接。)

以上是关于如何在 Woocommerce 订阅中设置下一个付款日期?的主要内容,如果未能解决你的问题,请参考以下文章

在 FSCalendar 中设置下一个上一个按钮

在位掩码中设置下一个工作日的算法

过滤 woocommerce 取消未付订单

以编程方式为 WooCommerce 订阅中的购物车项目设置免费试用

如何使用 WooCommerce 订阅获取特定用户的订阅?

如何显示用户的 WooCommerce 订阅详情?