修正Paid Memberships Pro会员订单结束日期设为Never的问题
解决Paid Memberships Pro自定义PayStack支付后订单结束日期显示Never的问题
问题分析
你通过自定义PayStack inline JS处理支付,支付成功后调用pmpro_changeMembershipLevel切换会员等级并创建订单,但30天期限的会员订单结束日期显示为"Never"。这是因为自定义支付流程没有触发PMPro官方网关的周期计算逻辑,需要手动计算并设置会员到期日期及订单的开始/结束日期。
解决方案
需要在代码中补充两个关键步骤:
- 计算会员的开始和结束日期
- 调用
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
相关产品推荐
相关产品推荐

