*/ function aksrt_get_user_identity_signals(int $user_id): array { if ($user_id <= 0) { return []; } if (class_exists('AKSRT_User_Home')) { $signals = AKSRT_User_Home::get_instance()->get_profile_signals($user_id); return is_array($signals) ? array_values($signals) : []; } return []; } } if (!function_exists('aksrt_render_user_identity_chips')) { /** * Render compact identity chips (verify / level / badges). * * Badge signals with icon_url render as Zibll-like medal images. * * @param int $user_id * @param string $context author|comment|card */ function aksrt_render_user_identity_chips(int $user_id, string $context = 'author'): string { if ($user_id <= 0) { return ''; } $html = ''; if (function_exists('aksrt_render_vip_badge')) { $vip = aksrt_render_vip_badge($user_id, 'sm'); if (is_string($vip) && $vip !== '') { $html .= $vip; } } $signals = aksrt_get_user_identity_signals($user_id); // Comments stay compact; author/card can show more. $limit = $context === 'comment' ? 3 : 6; $n = 0; foreach ($signals as $signal) { if ($n >= $limit) { break; } $label = trim((string) ($signal['label'] ?? '')); if ($label === '') { continue; } $tone = sanitize_html_class((string) ($signal['tone'] ?? 'info')); $icon = sanitize_html_class((string) ($signal['icon'] ?? 'check')); $icon_url = esc_url((string) ($signal['icon_url'] ?? '')); $title = (string) ($signal['title'] ?? $label); $is_wear = !empty($signal['wear']); $type = sanitize_html_class((string) ($signal['type'] ?? '')); // Image medal when dictionary provides icon_url. if ($icon_url !== '') { $classes = 'medal-icon img-icon ml3 aksrt-identity-medal aksrt-identity-medal--' . $context; if ($is_wear) { $classes .= ' is-wear'; } if ($type !== '') { $classes .= ' aksrt-identity-medal--' . $type; } $html .= '' . esc_attr($label) . ''; $n++; continue; } // Font Awesome: map short names to fa-* if needed. if ($icon !== '' && !str_contains($icon, 'fa-')) { $icon = 'fa-' . $icon; } $html .= ''; if ($icon !== '') { $html .= ' '; } $html .= esc_html($label) . ''; $n++; } return $html; } } if (!function_exists('aksrt_is_blog_comment_hot')) { /** * "神评" for ordinary post comments when likes cross threshold. */ function aksrt_is_blog_comment_hot($comment): bool { $comment_id = $comment instanceof WP_Comment ? (int) $comment->comment_ID : (int) $comment; if ($comment_id <= 0) { return false; } if ('1' === (string) get_comment_meta($comment_id, '_aksrt_comment_hot', true)) { return true; } $threshold = 10; if (class_exists('AKSRT_Settings') && method_exists('AKSRT_Settings', 'get_comment_display_settings')) { $display = AKSRT_Settings::get_comment_display_settings(); if (isset($display['hot_threshold'])) { $threshold = max(1, (int) $display['hot_threshold']); } } $all = class_exists('AKSRT_Settings') ? AKSRT_Settings::get_all() : []; if (isset($all['comment_hot_threshold'])) { $threshold = max(1, (int) $all['comment_hot_threshold']); } $likes = function_exists('aksrt_get_comment_likes') ? aksrt_get_comment_likes($comment_id) : (int) get_comment_meta($comment_id, 'aksrt_comment_likes', true); if ($likes < $threshold) { return false; } update_comment_meta($comment_id, '_aksrt_comment_hot', '1'); return true; } }