[ 'jio_user_badges' => [ 'manual-owned' => '2026-01-02 03:04:05', 'auto-owned' => '2026-02-03 04:05:06', ], 'jio_wear_badge' => 'manual-owned', ], 2 => [ 'jio_user_badges' => [ 'manual-owned' => '2026-03-04 05:06:07', 'auto-owned' => '2026-04-05 06:07:08', ], 'jio_wear_badge' => 'auto-owned', ], ]; $GLOBALS['jio_test_users'] = [ 1 => (object) ['ID' => 1, 'display_name' => 'Self '], 2 => (object) ['ID' => 2, 'display_name' => 'Other '], 9 => (object) ['ID' => 9, 'display_name' => 'Admin'], ]; $GLOBALS['jio_test_null_calls'] = []; function sanitize_key($value): string { return strtolower(preg_replace('/[^a-z0-9_\-]/', '', (string) $value)); } function esc_html($value): string { return htmlspecialchars((string) $value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function esc_attr($value): string { return esc_html($value); } function esc_url($value): string { return htmlspecialchars((string) $value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function esc_html__($text, $domain = null): string { return esc_html($text); } function esc_attr__($text, $domain = null): string { return esc_attr($text); } function __($text, $domain = null): string { return (string) $text; } function wp_kses_post($text): string { return (string) $text; } function wp_unslash($value) { return $value; } function absint($value): int { return abs((int) $value); } function admin_url($path = ''): string { return 'https://example.test/wp-admin/' . ltrim($path, '/'); } function add_query_arg($args, $url): string { return $url . '?' . http_build_query($args); } function get_current_user_id(): int { return (int) $GLOBALS['jio_test_current_user']; } function get_userdata($user_id) { return $GLOBALS['jio_test_users'][(int) $user_id] ?? false; } function get_the_author_meta($field, $user_id) { $user = get_userdata($user_id); return $user ? ($user->{$field} ?? '') : ''; } function get_user_meta($user_id, $key, $single = false) { return $GLOBALS['jio_test_meta'][(int) $user_id][$key] ?? ''; } function user_can($user_id, $capability): bool { return (int) $user_id === 9 && $capability === 'manage_options'; } function jio_get_avatar_html($subject, $size = 96, $attrs = []): string { return ''; } function jio_get_avatar_box($subject, string $class = 'avatar-img', bool $link = true, bool $vip = true): string { return ''; } function get_theme_file_uri($path = ''): string { return 'https://example.test/theme' . $path; } function jio_get_null($text = null, $margin = 60, $img = 'null.svg', $class = '', $width = 280, $height = 0): string { $GLOBALS['jio_test_null_calls'][] = [$text, $margin, $img]; return '
' . esc_html($text) . '
'; } require dirname(__DIR__, 2) . '/src/User/Badges.php'; \Jio\Settings\Settings::$settings = [ 'medal' => [ 'enabled' => true, 'public_display' => true, 'categories' => [ [ 'cat_name' => '类别 ', 'items' => [ ['slug' => 'manual-new', 'name' => '手动未得 危险', 'desc' => '说明 ', 'icon' => '/manual-new.svg', 'get_type' => 'manually_add'], ['slug' => 'auto-owned', 'name' => '自动已得', 'desc' => '自动描述', 'icon' => '/auto-owned.svg', 'get_type' => 'new_post'], ['slug' => 'manual-owned', 'name' => '手动已得', 'desc' => '手动说明', 'icon' => '/manual-owned.svg', 'get_type' => 'manually_add'], ['slug' => 'auto-new', 'name' => '自动未得', 'desc' => '自动未得说明', 'icon' => '/auto-new.svg', 'get_type' => 'new_post'], ], ], ], 'items_by_slug' => [ ['slug' => 'manual-new', 'name' => '手动未得 危险', 'desc' => '说明 ', 'icon' => '/manual-new.svg', 'get_type' => 'manually_add'], ['slug' => 'auto-owned', 'name' => '自动已得', 'desc' => '自动描述', 'icon' => '/auto-owned.svg', 'get_type' => 'new_post'], ['slug' => 'manual-owned', 'name' => '手动已得', 'desc' => '手动说明', 'icon' => '/manual-owned.svg', 'get_type' => 'manually_add'], ['slug' => 'auto-new', 'name' => '自动未得', 'desc' => '自动未得说明', 'icon' => '/auto-new.svg', 'get_type' => 'new_post'], ], ], ]; function render_private(string $method, array $args): string { $reflection = new \ReflectionMethod(\Jio\User\Badges::class, $method); return (string) $reflection->invokeArgs(null, $args); } function reset_badge_caches(): void { \Jio\User\Badges::invalidate_cache(); $property = new \ReflectionProperty(\Jio\User\Badges::class, 'dictionary_cache'); $property->setValue(null, null); } function render_case(int $viewer, string $template, int $user_id, string $slug = ''): array { $GLOBALS['jio_test_current_user'] = $viewer; reset_badge_caches(); $args = $template === 'single' ? [$user_id, $slug] : [$user_id]; if ($template === 'grant') $args = [$user_id]; return [ 'html' => render_private($template === 'grant' ? 'modal_grant_html' : ($template === 'single' ? 'modal_single_html' : 'modal_info_html'), $args), 'null_calls' => $GLOBALS['jio_test_null_calls'], ]; } $output = [ 'self' => render_case(1, 'info', 1), 'other' => render_case(1, 'info', 2), 'admin_other' => render_case(9, 'info', 2), 'admin_self' => render_case(9, 'info', 9), 'single_owned_self' => render_case(1, 'single', 1, 'auto-owned'), 'single_unowned_self' => render_case(1, 'single', 1, 'manual-new'), 'single_wearing_self' => render_case(1, 'single', 1, 'manual-owned'), 'single_manual_admin' => render_case(9, 'single', 2, 'manual-owned'), 'single_auto_admin' => render_case(9, 'single', 2, 'auto-owned'), 'single_auto_unowned_admin' => render_case(9, 'single', 2, 'auto-new'), 'grant_admin' => render_case(9, 'grant', 2), ]; $output['illustrated_empty'] = render_case(1, 'single', 1, 'missing'); $output['null_calls'] = $GLOBALS['jio_test_null_calls']; echo json_encode($output, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); }