Files
wordpress-theme-aksrt/inc/helpers/user-center-renderers/credits-level.php
T
kate522 aaf458af1c refactor(autoload): migrate theme classes to Composer PSR-4
Move 288 types from global AKSRT_* + inc/classes manual requires into
namespace AKSRT\{Domain} under src/AKSRT/, wire composer.json psr-4,
and slim bootstrap to helpers/modules/hooks only. Split multi-class
widget/gateway files, update admin contract audit paths, and document
the layout in ADR/README.
2026-07-17 13:29:22 +08:00

108 lines
4.0 KiB
PHP

<?php
/**
* User center: my level + integral growth (Zibll level card parity).
*
* Expects $user_id from profile-credits context when required.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
if (!class_exists('\AKSRT\User\Level')) {
return;
}
$cfg = \AKSRT\User\Level::settings();
if (empty($cfg['enabled'])) {
return;
}
$user_id = (int) ($user_id ?? get_current_user_id());
if ($user_id <= 0) {
return;
}
$level = \AKSRT\User\Level::get_level($user_id);
$integral = \AKSRT\User\Level::get_integral($user_id);
$max = max(1, (int) ($cfg['max'] ?? 10));
$prefix = (string) ($cfg['prefix'] ?? 'Lv.');
$opt = is_array($cfg['level_opt'] ?? null) ? $cfg['level_opt'] : [];
$name = (string) ($opt['name_' . $level] ?? ($prefix . $level));
$next_need = 0;
$is_max = $level >= $max;
if (!$is_max) {
$next_need = (int) ($opt['upgrade_integral_' . ($level + 1)] ?? 0);
if ($next_need <= $integral) {
// Resolve again in case meta lag.
$level = \AKSRT\User\Level::resolve_level($integral, $cfg);
$is_max = $level >= $max;
$next_need = $is_max ? $integral : (int) ($opt['upgrade_integral_' . ($level + 1)] ?? $integral);
$name = (string) ($opt['name_' . $level] ?? ($prefix . $level));
}
}
if ($is_max) {
$proportion = 100;
$need_html = esc_html__('已为最高等级', 'aksrt');
$frac_html = esc_html((string) $integral) . '/' . esc_html((string) $integral);
} else {
$den = max(1, $next_need);
$proportion = (int) min(100, max(0, ($integral / $den) * 100));
$need_left = max(0, $next_need - $integral);
$need_html = sprintf(
/* translators: %s: remaining XP */
esc_html__('升级还需%s经验', 'aksrt'),
'<span class="em14 font-bold ml3 mr3">' . esc_html((string) $need_left) . '</span>'
);
$frac_html = esc_html((string) $integral) . '/' . esc_html((string) $next_need);
}
$avatar = function_exists('aksrt_get_avatar_html')
? aksrt_get_avatar_html($user_id, 42, ['class' => 'avatar avatar-mini'])
: get_avatar($user_id, 42);
// Growth rows (next few levels).
$growth = '';
$from = max(1, $level);
$to = min($max, $level + 5);
for ($i = $from; $i <= $to; $i++) {
$need_i = (int) ($opt['upgrade_integral_' . $i] ?? 0);
$nm = (string) ($opt['name_' . $i] ?? ($prefix . $i));
$state = $integral >= $need_i ? 'is-done' : ($i === $level + 1 ? 'is-next' : '');
$growth .= '<div class="uc-level-growth__row ' . esc_attr($state) . '">';
$growth .= '<span class="uc-level-growth__lv">' . esc_html($prefix . $i) . '</span>';
$growth .= '<span class="uc-level-growth__name">' . esc_html($nm) . '</span>';
$growth .= '<span class="uc-level-growth__need">' . esc_html((string) $need_i) . '</span>';
$growth .= '</div>';
}
?>
<div class="uc-level-card zib-widget">
<div class="uc-level-card__head flex ac">
<div class="avatar-mini mr10"><?php echo $avatar; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
<div class="font-bold"><?php esc_html_e('我的等级', 'aksrt'); ?></div>
</div>
<div class="uc-level-card__body">
<div class="uc-level-card__badge flex ac em14">
<span class="badg badg-sm mr10 aksrt-identity-chip aksrt-identity-chip--info"><?php echo esc_html($prefix . $level); ?></span>
<span class="font-bold"><?php echo esc_html($name); ?></span>
</div>
<div class="uc-level-card__progress mt10">
<div class="flex jsb mb6 ab">
<div class="em12 font-bold"><?php echo $frac_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
<div class="opacity8 em09"><?php echo $need_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
</div>
<div class="integral-progress progress">
<div class="progress-bar" style="width: <?php echo (int) $proportion; ?>%;"></div>
</div>
</div>
</div>
<?php if ($growth !== '') : ?>
<div class="uc-level-growth mt12">
<div class="uc-level-growth__title muted-2-color em09 mb6"><?php esc_html_e('成长路线', 'aksrt'); ?></div>
<?php echo $growth; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<?php endif; ?>
</div>