Files
wordpress-theme-aksrt/inc/classes/settings/class-aksrt-settings-credits-runtime.php
T
kate522 91b083b2b0 refactor(settings): collapse get_all to aksrt_settings and drop migration UI
Make aksrt_settings the sole theme settings store for get_all(), remove
aksrt_seo_settings/aksrt_basic_settings merge paths, point global.logo
schema at aksrt_settings, and delete the retired settings migration page,
route, REST endpoint, and related SPA surface.
2026-07-11 16:55:27 +08:00

268 lines
9.4 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));
}
}