Merge pull request 'fix(vip): preserve layered membership expirations' (#414) from worktree-vip-points-entry-modal into main
Reviewed-on: CYL/wordpress-theme-aksrt#414
This commit is contained in:
commit
1bd09dcda3
4 files changed
+43
-11
No files matched your search
@@ -65,10 +65,20 @@ function aksrt_get_user_vip_level(int $user_id = 0): int {
|
|||||||
|
|
||||||
if ($meta_level > 0) {
|
if ($meta_level > 0) {
|
||||||
if ($expires > 0 && $expires < time()) {
|
if ($expires > 0 && $expires < time()) {
|
||||||
// 过期:lazy 清 level,记录上次等级(zibll vip_level_expired)。
|
$base_level = (int) get_user_meta($user_id, 'aksrt_vip_base_level', true);
|
||||||
update_user_meta($user_id, 'aksrt_vip_level_expired', min(2, max(1, $meta_level)));
|
$base_expires = (int) get_user_meta($user_id, 'aksrt_vip_base_expires', true);
|
||||||
update_user_meta($user_id, 'aksrt_vip_level', 0);
|
if ($base_level > 0) {
|
||||||
$candidate = 0;
|
update_user_meta($user_id, 'aksrt_vip_level', $base_level);
|
||||||
|
update_user_meta($user_id, 'aksrt_vip_expires', $base_expires);
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_level');
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_expires');
|
||||||
|
$candidate = min(2, max(0, $base_level));
|
||||||
|
} else {
|
||||||
|
// 过期:lazy 清 level,记录上次等级(zibll vip_level_expired)。
|
||||||
|
update_user_meta($user_id, 'aksrt_vip_level_expired', min(2, max(1, $meta_level)));
|
||||||
|
update_user_meta($user_id, 'aksrt_vip_level', 0);
|
||||||
|
$candidate = 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// expires === 0 视为永久;expires >= now 视为有效。
|
// expires === 0 视为永久;expires >= now 视为有效。
|
||||||
$candidate = min(2, max(0, $meta_level));
|
$candidate = min(2, max(0, $meta_level));
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ if (class_exists('\\AKSRT\\Content\\VipService')) {
|
|||||||
$currency_name = (string) ($vip_catalog['currency_name'] ?? $currency_name);
|
$currency_name = (string) ($vip_catalog['currency_name'] ?? $currency_name);
|
||||||
}
|
}
|
||||||
$expires = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
$expires = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
||||||
|
$base_level = (int) get_user_meta($user_id, 'aksrt_vip_base_level', true);
|
||||||
|
$base_expires = (int) get_user_meta($user_id, 'aksrt_vip_base_expires', true);
|
||||||
$expired_level = (int) get_user_meta($user_id, 'aksrt_vip_level_expired', true);
|
$expired_level = (int) get_user_meta($user_id, 'aksrt_vip_level_expired', true);
|
||||||
$levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : [];
|
$levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : [];
|
||||||
$desc_top = (string) ($vip_settings['desc'] ?? '');
|
$desc_top = (string) ($vip_settings['desc'] ?? '');
|
||||||
@@ -62,7 +64,14 @@ if ($level > 0) {
|
|||||||
$vip_state = 'active';
|
$vip_state = 'active';
|
||||||
$vip_state_label = __('生效中', 'aksrt');
|
$vip_state_label = __('生效中', 'aksrt');
|
||||||
$vip_expiry_text = sprintf(__('到期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires));
|
$vip_expiry_text = sprintf(__('到期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires));
|
||||||
$btn_type = 'renew_' . $level;
|
if ($base_level > 0 && $base_level < $level) {
|
||||||
|
$base_name = (string) ($levels[$base_level]['name'] ?? ('VIP' . $base_level));
|
||||||
|
$base_expiry_text = $base_expires > 0
|
||||||
|
? wp_date('Y年m月d日', $base_expires)
|
||||||
|
: __('永久', 'aksrt');
|
||||||
|
$vip_expiry_text .= ';' . sprintf(__('%s:%s', 'aksrt'), $base_name, $base_expiry_text);
|
||||||
|
}
|
||||||
|
$btn_type = 'renew_' . $level;
|
||||||
}
|
}
|
||||||
} elseif ($expired_level > 0) {
|
} elseif ($expired_level > 0) {
|
||||||
$vip_state = 'expired';
|
$vip_state = 'expired';
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ class SchemaPayment {
|
|||||||
]],
|
]],
|
||||||
['key' => 'points_exchange', 'title' => '积分兑换会员', 'fields' => [
|
['key' => 'points_exchange', 'title' => '积分兑换会员', 'fields' => [
|
||||||
['key' => 'pay_vip_points_exchange_s', 'label' => '启用积分兑换', 'type' => 'switch', 'default' => false],
|
['key' => 'pay_vip_points_exchange_s', 'label' => '启用积分兑换', 'type' => 'switch', 'default' => false],
|
||||||
['key' => 'payment_vip_points_packages', 'label' => '兑换套餐', 'type' => 'textarea', 'default' => "1|500|30|积分月卡\n1|5000|0|积分永久", 'dependsOn' => ['key' => 'pay_vip_points_exchange_s', 'value' => true], 'help' => '每行:等级|积分|天数|标题(天数 0=永久;仅未开通会员可兑)'],
|
['key' => 'payment_vip_points_packages', 'label' => '兑换套餐', 'type' => 'textarea', 'default' => "1|500|30|积分月卡\n1|5000|0|积分永久", 'dependsOn' => ['key' => 'pay_vip_points_exchange_s', 'value' => true], 'help' => '每行:等级|积分|天数|标题(天数 0=永久;普通用户可开通,已有会员可续费同等级或升级更高等级)'],
|
||||||
['key' => 'pay_vip_points_exchange_desc', 'label' => '兑换说明', 'type' => 'textarea', 'default' => '', 'dependsOn' => ['key' => 'pay_vip_points_exchange_s', 'value' => true]],
|
['key' => 'pay_vip_points_exchange_desc', 'label' => '兑换说明', 'type' => 'textarea', 'default' => '', 'dependsOn' => ['key' => 'pay_vip_points_exchange_s', 'value' => true]],
|
||||||
]],
|
]],
|
||||||
['key' => 'benefit', 'title' => '下载权益', 'fields' => [
|
['key' => 'benefit', 'title' => '下载权益', 'fields' => [
|
||||||
|
|||||||
@@ -515,6 +515,16 @@ trait VipServicePurchase {
|
|||||||
|
|
||||||
$previous_level = (int) get_user_meta($user_id, 'aksrt_vip_level', true);
|
$previous_level = (int) get_user_meta($user_id, 'aksrt_vip_level', true);
|
||||||
$previous_expiry = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
$previous_expiry = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
||||||
|
$finite_duration = $time > 0 || $days > 0;
|
||||||
|
if ($previous_level > 0 && $previous_expiry === 0 && $level > $previous_level && $finite_duration) {
|
||||||
|
// Preserve a permanent lower tier while a finite higher-tier upgrade is active.
|
||||||
|
update_user_meta($user_id, 'aksrt_vip_base_level', $previous_level);
|
||||||
|
update_user_meta($user_id, 'aksrt_vip_base_expires', 0);
|
||||||
|
} else {
|
||||||
|
// Only a finite higher-tier upgrade may keep a layered base membership.
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_level');
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_expires');
|
||||||
|
}
|
||||||
$fulfilled = false;
|
$fulfilled = false;
|
||||||
// unit upgrade: raise level only, keep current expiry (zibll).
|
// unit upgrade: raise level only, keep current expiry (zibll).
|
||||||
if ($upgrade_mode === 'unit') {
|
if ($upgrade_mode === 'unit') {
|
||||||
@@ -574,14 +584,15 @@ trait VipServicePurchase {
|
|||||||
|
|
||||||
if ($days <= 0) {
|
if ($days <= 0) {
|
||||||
// Permanent.
|
// Permanent.
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_level');
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_expires');
|
||||||
update_user_meta($user_id, 'aksrt_vip_expires', 0);
|
update_user_meta($user_id, 'aksrt_vip_expires', 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$current_exp = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
$current_exp = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
||||||
if ($current_exp === 0 && $current_level > 0) {
|
if ($current_exp === 0 && $current_level > 0 && $level <= $current_level) {
|
||||||
// Already permanent — keep permanent.
|
return; // keep an existing permanent level when not upgrading it
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
$base = max($current_exp, time());
|
$base = max($current_exp, time());
|
||||||
update_user_meta($user_id, 'aksrt_vip_expires', $base + ($days * DAY_IN_SECONDS));
|
update_user_meta($user_id, 'aksrt_vip_expires', $base + ($days * DAY_IN_SECONDS));
|
||||||
@@ -603,13 +614,15 @@ trait VipServicePurchase {
|
|||||||
delete_user_meta($user_id, 'aksrt_vip_level_expired');
|
delete_user_meta($user_id, 'aksrt_vip_level_expired');
|
||||||
|
|
||||||
if ($time <= 0) {
|
if ($time <= 0) {
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_level');
|
||||||
|
delete_user_meta($user_id, 'aksrt_vip_base_expires');
|
||||||
update_user_meta($user_id, 'aksrt_vip_expires', 0);
|
update_user_meta($user_id, 'aksrt_vip_expires', 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$current_exp = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
$current_exp = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
||||||
if ($current_exp === 0 && $current_level > 0) {
|
if ($current_exp === 0 && $current_level > 0 && $level <= $current_level) {
|
||||||
return; // keep permanent
|
return; // keep an existing permanent level when not upgrading it
|
||||||
}
|
}
|
||||||
$base = max($current_exp, time());
|
$base = max($current_exp, time());
|
||||||
$modifier = $unit === 'month'
|
$modifier = $unit === 'month'
|
||||||
|
|||||||
Reference in new issue
Block a user