You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修正Paid Memberships Pro会员订单结束日期设为Never的问题

解决Paid Memberships Pro自定义PayStack支付后订单结束日期显示Never的问题

问题分析

你通过自定义PayStack inline JS处理支付,支付成功后调用pmpro_changeMembershipLevel切换会员等级并创建订单,但30天期限的会员订单结束日期显示为"Never"。这是因为自定义支付流程没有触发PMPro官方网关的周期计算逻辑,需要手动计算并设置会员到期日期及订单的开始/结束日期。

解决方案

需要在代码中补充两个关键步骤:

  1. 计算会员的开始和结束日期
  2. 调用pmpro_changeMembershipLevel时传入日期参数,同时给订单对象设置对应日期字段

修改后的完整代码片段

// 获取会员等级ID和等级对象
$level_id = substr($decrypted_data, 19, 1);
$level = pmpro_getLevel($level_id);

// 计算开始日期(当前时间)和结束日期(根据等级周期计算)
$start_date = current_time('mysql');
// 利用PMPro内置函数计算到期日期,适配等级设置的周期(这里对应30天)
$end_date = pmpro_addDuration($start_date, $level->cycle_number, $level->cycle_period);

// 更新用户会员等级,传入开始和结束日期
pmpro_changeMembershipLevel($level_id, $user_id, $start_date, $end_date);

if (!$order->payment_transaction_id) { 
    // 检查订单ID是否已存在(防止重复提交)
    $order->code = $order_id;
    $order->user_id = $user_id;
    $order->payment_transaction_id = $order_id;
    $order->total = $membership_amount;
    $order->membership_id = $level_id;
    $order->gateway = 'PayStack';
    $order->status = 'success';
    // 给订单设置开始和结束日期,与会员到期日期同步
    $order->startdate = $start_date;
    $order->enddate = $end_date;
    // 保存订单
    $order->saveOrder();
}

关键说明

  • pmpro_addDuration是PMPro内置函数,会根据等级设置的cycle_number(周期数)和cycle_period(周期单位,如day/month)自动计算到期日期,无需手动写时间计算逻辑,确保和后台等级配置一致。
  • 必须同时更新用户会员记录和订单记录的日期字段,否则订单列表中仍会显示"Never"。

内容的提问来源于stack exchange,提问作者Samuel Omoniwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:10:20