feat(user): badge wear and grant service

Add AKSRT_User_Badges own/wear/grant REST and WP profile admin grant
UI, and route identity signals through the service.
This commit is contained in:
kate522 committed 2026-07-16 23:39:41 +08:00
1 parent c45a0ecef5
commit 219cd0236e
5 files changed
+592 -40

No files matched your search

+53 -40
View File
@@ -162,48 +162,61 @@ class AKSRT_User_Home {
}
if (!empty($settings['badge']['enabled']) && !empty($settings['badge']['public_display'])) {
$badge_map = [];
foreach ((array) ($settings['badge']['dictionary'] ?? []) as $item) {
if (!empty($item['slug'])) {
$badge_map[(string) $item['slug']] = $item;
}
}
$assigned = get_user_meta($user_id, 'aksrt_user_badges', true);
if (!is_array($assigned)) {
$assigned = preg_split('/[\s,]+/', (string) $assigned, -1, PREG_SPLIT_NO_EMPTY);
}
$assigned = array_values(array_filter(array_map(static function ($slug) {
return sanitize_key((string) $slug);
}, (array) $assigned)));
// Prefer worn badge first (Zibll wear-medal).
$wear = sanitize_key((string) get_user_meta($user_id, 'aksrt_wear_badge', true));
if ($wear !== '' && in_array($wear, $assigned, true) && isset($badge_map[$wear])) {
$assigned = array_values(array_unique(array_merge([$wear], $assigned)));
}
$limit = max(1, (int) ($settings['badge']['limit'] ?? 3));
$badge_count = 0;
foreach ($assigned as $slug) {
if ($slug === '' || !isset($badge_map[$slug])) {
continue;
if (class_exists('AKSRT_User_Badges')) {
$list = AKSRT_User_Badges::list_for_user($user_id, true);
$badge_count = 0;
foreach ((array) ($list['items'] ?? []) as $item) {
if ($badge_count >= $limit) {
break;
}
$signals[] = [
'type' => 'badge',
'slug' => (string) ($item['slug'] ?? ''),
'label' => (string) ($item['label'] ?? ''),
'icon' => 'award',
'tone' => (string) ($item['tone'] ?? 'neutral'),
'icon_url' => (string) ($item['icon_url'] ?? ''),
'wear' => !empty($item['wear']),
];
$badge_count++;
}
$icon_url = (string) ($badge_map[$slug]['icon_url'] ?? '');
$signals[] = [
'type' => 'badge',
'slug' => $slug,
'label' => (string) $badge_map[$slug]['label'],
'icon' => 'award',
'tone' => (string) ($badge_map[$slug]['tone'] ?? 'neutral'),
'icon_url' => $icon_url,
'wear' => ($wear !== '' && $slug === $wear),
];
$badge_count++;
if ($badge_count >= $limit) {
break;
} else {
$badge_map = [];
foreach ((array) ($settings['badge']['dictionary'] ?? []) as $item) {
if (!empty($item['slug'])) {
$badge_map[(string) $item['slug']] = $item;
}
}
$assigned = get_user_meta($user_id, 'aksrt_user_badges', true);
if (!is_array($assigned)) {
$assigned = preg_split('/[\s,]+/', (string) $assigned, -1, PREG_SPLIT_NO_EMPTY);
}
$wear = sanitize_key((string) get_user_meta($user_id, 'aksrt_wear_badge', true));
$assigned = array_values(array_filter(array_map(static function ($slug) {
return sanitize_key((string) $slug);
}, (array) $assigned)));
if ($wear !== '' && in_array($wear, $assigned, true) && isset($badge_map[$wear])) {
$assigned = array_values(array_unique(array_merge([$wear], $assigned)));
}
$badge_count = 0;
foreach ($assigned as $slug) {
if ($slug === '' || !isset($badge_map[$slug])) {
continue;
}
$signals[] = [
'type' => 'badge',
'slug' => $slug,
'label' => (string) $badge_map[$slug]['label'],
'icon' => 'award',
'tone' => (string) ($badge_map[$slug]['tone'] ?? 'neutral'),
'icon_url' => (string) ($badge_map[$slug]['icon_url'] ?? ''),
'wear' => ($wear !== '' && $slug === $wear),
];
$badge_count++;
if ($badge_count >= $limit) {
break;
}
}
}
}