Files
wordpress-theme-aksrt/inc/classes/settings/class-aksrt-settings-credits-runtime.php
T
kate522 6bad39a7ba chore(admin): clarify download points purchase mode copy
Rename residual 积分扣费/按次扣费 labels to 积分购买模式 and note cashier unlock; keep download_credit key for storage.
2026-07-14 21:18:26 +08:00

269 lines
9.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Settings credits/invite runtime helper.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
class AKSRT_Settings_Credits_Runtime {
/**
* 积分配置(合并默认值)。
* @return array
*/
public static function get_credit_settings(): array {
$defaults = [
'enabled' => true,
'currency_name' => '',
'register_bonus' => 10,
'daily_signin' => [
'enabled' => true,
'base' => 1,
'streak' => [
3 => 2,
7 => 5,
30 => 20,
],
],
'comment_reward' => [
'enabled' => true,
'amount' => 1,
'daily_cap' => 5,
'min_length' => 10,
'on_approved' => true,
],
'invite_reward' => [
'enabled' => true,
'inviter_amount' => 5,
'invitee_amount' => 2,
'require_verify' => true,
'ip_daily_cap' => 3,
'register_field' => 'optional',
'reject_invalid' => true,
],
'download_default_cost' => 0,
];
$saved = get_option('aksrt_credit_settings', []);
if (!is_array($saved)) {
$saved = [];
}
return array_replace_recursive($defaults, $saved);
}
/**
* Normalized runtime settings for daily sign-in rewards.
*
* @return array{enabled:bool,base:int,streak:array<int,int>,currency_name:string}
*/
public static function get_signin_reward_settings(): array {
$config = self::get_credit_settings();
$signin = is_array($config['daily_signin'] ?? null) ? $config['daily_signin'] : [];
$streak = [];
foreach ((array) ($signin['streak'] ?? []) as $day => $bonus) {
$day = (int) $day;
$bonus = (int) $bonus;
if ($day <= 0 || $bonus < 0) {
continue;
}
$streak[$day] = $bonus;
}
ksort($streak, SORT_NUMERIC);
return [
'enabled' => !empty($config['enabled']) && !empty($signin['enabled']),
'base' => max(0, (int) ($signin['base'] ?? 0)),
'streak' => $streak,
'currency_name' => self::get_currency_name(),
];
}
/**
* Normalized runtime settings for invite rewards and registration gating.
*
* @return array{
* enabled:bool,
* inviter_amount:int,
* invitee_amount:int,
* require_verify:bool,
* ip_daily_cap:int,
* register_field:string,
* reject_invalid:bool,
* registration_enabled:bool
* }
*/
public static function get_invite_reward_settings(): array {
$config = self::get_credit_settings();
$invite = is_array($config['invite_reward'] ?? null) ? $config['invite_reward'] : [];
$all = AKSRT_Settings::get_all();
$register_field = (string) ($invite['register_field'] ?? 'optional');
if (!in_array($register_field, ['hidden', 'optional', 'required'], true)) {
$register_field = 'optional';
}
$inviter_amount = array_key_exists('invit_reward_points', $all)
? max(0, (int) $all['invit_reward_points'])
: max(0, (int) ($invite['inviter_amount'] ?? 0));
$invitee_enabled = array_key_exists('invit_invitee_reward', $all)
? !empty($all['invit_invitee_reward'])
: max(0, (int) ($invite['invitee_amount'] ?? 0)) > 0;
$invitee_amount = $invitee_enabled
? max(0, (int) ($invite['invitee_amount'] ?? $inviter_amount))
: 0;
return [
'enabled' => !empty($config['enabled']) && !empty($invite['enabled']),
'inviter_amount' => $inviter_amount,
'invitee_amount' => $invitee_amount,
'require_verify' => !empty($invite['require_verify']),
'ip_daily_cap' => max(0, (int) ($invite['ip_daily_cap'] ?? 0)),
'register_field' => $register_field,
'reject_invalid' => !empty($invite['reject_invalid']),
'registration_enabled' => self::invite_registration_enabled(),
'invit_reward_points' => $inviter_amount,
'invit_reward_level' => max(0, (int) ($all['invit_reward_level'] ?? 0)),
'invit_reward_vip_days' => max(0, (int) ($all['invit_reward_vip_days'] ?? 0)),
'invit_invitee_reward' => $invitee_enabled,
];
}
/**
* Canonical invite registration config derived from users.invite fields.
*
* @return array{
* enabled:bool,
* mode:string,
* register_field:string,
* reject_invalid:bool,
* code_length:int,
* open_desc:string,
* must_desc:string
* }
*/
public static function get_invite_registration_config(): array {
$all = AKSRT_Settings::get_all();
$credit_config = self::get_credit_settings();
$enabled = array_key_exists('invit_code_s', $all)
? !empty($all['invit_code_s'])
: (!isset($all['invite_registration_enabled']) || !empty($all['invite_registration_enabled']));
$mode = isset($all['invit_code_mode']) ? (string) $all['invit_code_mode'] : '';
if (!in_array($mode, ['open', 'must', 'close'], true)) {
$legacy_mode = (string) ($credit_config['invite_reward']['register_field'] ?? 'optional');
if ($legacy_mode === 'required') {
$mode = 'must';
} elseif ($legacy_mode === 'hidden') {
$mode = 'close';
} else {
$mode = 'open';
}
}
$register_field = 'optional';
if (!$enabled || $mode === 'close') {
$register_field = 'hidden';
} elseif ($mode === 'must') {
$register_field = 'required';
}
$open_desc = trim((string) ($all['invit_code_open_desc'] ?? ''));
if ($open_desc === '') {
$open_desc = __('邀请码为选填,没有邀请码也可以注册', 'aksrt');
}
$must_desc = trim((string) ($all['invit_code_must_desc'] ?? ''));
if ($must_desc === '') {
$must_desc = __('请输入邀请码', 'aksrt');
}
$code_length = isset($all['invit_code_length']) ? (int) $all['invit_code_length'] : 0;
if ($code_length <= 0) {
$code_length = (int) ($all['invite_code_length'] ?? 6);
}
$code_length = max(4, min(12, $code_length));
return [
'enabled' => $enabled && $mode !== 'close',
'mode' => $mode,
'register_field' => $register_field,
'reject_invalid' => !empty($credit_config['invite_reward']['reject_invalid']),
'code_length' => $code_length,
'open_desc' => $open_desc,
'must_desc' => $must_desc,
];
}
/**
* 积分功能是否启用。
* 仅看积分系统开关;不再与 cms_features.download_credit 联合(该开关表示积分购买模式,非按次扣费)。
*/
public static function credits_enabled(): bool {
$config = self::get_credit_settings();
return !empty($config['enabled']);
}
/**
* 自定义货币名称,为空时回退"积分"。
*/
public static function get_currency_name(): string {
$config = self::get_credit_settings();
$name = trim((string) ($config['currency_name'] ?? ''));
return $name !== '' ? $name : __('积分', 'aksrt');
}
/**
* 邀请系统是否启用(=积分系统启用 && invite_reward.enabled)。
* 用于 UI 入口(个人中心邀请 Tab)的展示门禁。
*/
public static function invite_enabled(): bool {
$config = self::get_credit_settings();
return !empty($config['enabled']) && !empty($config['invite_reward']['enabled']);
}
/**
* 邀请注册功能总开关(独立于积分系统)。
* 控制邀请链接、注册页邀请码字段、用户中心邀请卡片的显示。
* 存储在 aksrt_settings(invit_code_s / invite_registration_enabled)。
*/
public static function invite_registration_enabled(): bool {
return !empty(self::get_invite_registration_config()['enabled']);
}
/**
* 注册页邀请码字段模式:'hidden' | 'optional' | 'required'
*/
public static function invite_register_field_mode(): string {
$mode = (string) (self::get_invite_registration_config()['register_field'] ?? 'hidden');
return in_array($mode, ['hidden', 'optional', 'required'], true) ? $mode : 'hidden';
}
/**
* 必填模式下邀请码无效是否拒绝注册。
*/
public static function invite_reject_invalid(): bool {
return !empty(self::get_invite_registration_config()['reject_invalid']);
}
public static function invite_code_length(): int {
return max(4, min(12, (int) (self::get_invite_registration_config()['code_length'] ?? 6)));
}
/**
* 资源下载默认积分价(当资源未单独设价时回退使用)。
*/
public static function download_default_cost(): int {
$config = self::get_credit_settings();
return max(0, (int) ($config['download_default_cost'] ?? 0));
}
}