Files
wordpress-theme-aksrt/tests/widget-system/user-card-runtime-harness.php
T
kate522 6f815678ec feat(frontend): replicate reference header user box 1:1
顶导航点击小人弹出的用户信息浮层,从 AKSRT 定制结构改为与参考主题 zib_header_user_box() 逐行同构:头像链接包裹、钱包双瓷砖、会员条、签到、消息图标、统计徽章行全部改用参考主题遗留类,渲染交回 main.css(.sub-user-box 242px、.avatar-img 38px、.msg-news-icon、badge.top、.payvip-icon 深色渐变加 gem 水印、.vip-expdate-tag、.muted-box)。

头像改走 aksrt_get_avatar_box(用户ID, avatar-img, true, false),得到参考的 a 链接包裹 avatar-img 结构。消息图标改参考标记 msg-news-icon abs-right 加 toggle-radius msg-icon,未读徽章用 badge.top,avatar_dropdown 位置门控契约保留。管理端行在「后台管理」前插入「支付中心」,跳 admin.php?page=aksrt_pay,即参考主题「商城中心」槽位,图标 fa-credit-card。

钱包重写为参考双瓷砖:余额在前(c-blue-2 加 fa-money-bill-wave)、积分在后(c-yellow 加 fa-coins),分别按充值开关与积分总开关门控,两块皆关则不渲染,并保留 data-aksrt-wallet-value 与 data-aksrt-points-value 两个 JS 刷新钩子。会员条去掉 AKSRT 自创的 vipbg-v2 level-N 金色背景,改参考的 payvip-icon 加 badg jb-yellow vip-expdate-tag,到期文案按参考语义分为已过期、永久会员、裸日期三种。签到入口由 button 改为 a.but block c-yellow,并去掉随之失效的 compact 形参,data-signin 挂载与 wp_footer 验证码不变。统计行删掉文章徽章(本站不做帖子),图标由 SVG sprite 换 FA5+ 的 fa-comment-dots、fa-thumbs-up、fa-fire。

会员等级图标契约不动:aksrt_get_vip_icon 与 User\Level::get_badge_html 的调用与参数保持原样。

顺带清死代码:aksrt_header_user_badges_row 原本取到函数后直接返回空串,现在真正输出统计行;删掉 header-userbox.css 里整套 bespoke 规则与 vip-modal.css 的 vipbg-v2 死规则。

显式偏差:统计行链接保持扁平用户主页 URL(AKSRT 用户主页是干净 URL 加 JS tab,没有 query tab 路由);签到入口沿用积分签到总开关门控,不新增管理端可配置项。

public.css 与 public.min.css 用 tools/build-public-assets.mjs 重建:该 bundle 打包了 header-userbox.css 且作为依赖先于单模块入队,旧的 width 260px 会压过新源码、把卡片钉在 260px 而不是参考的 242px。

验证:node --test tests/**/*.test.cjs 573 项全通过;六个改动 PHP 文件 php -l 无语法错误;卡片用到的 FA5 token 逐个核对 5.15.4 全部命中。未做真实视觉效果验收。
2026-10-10 16:17:01 +08:00

182 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace AKSRT\Settings {
final class Settings {
public static bool $closed = false;
public static bool $registration = true;
public static function close_sign(): bool {
return self::$closed;
}
public static function registration_enabled(): bool {
return self::$registration;
}
}
}
namespace AKSRT\Auth {
final class OAuth {
public static function get_instance(): self {
return new self();
}
public function get_auth_providers_data(): array {
return [
[
'name' => 'github',
'label' => 'GitHub',
'icon' => '<i class="fa fab fa-github"></i>',
'url' => 'https://example.test/oauth/github',
],
[
'name' => 'clogin_qq',
'label' => 'QQ · 聚合',
'icon' => '<i class="fa fab fa-qq"></i>',
'url' => 'https://example.test/oauth/qq',
],
];
}
}
}
namespace {
if (!defined('ABSPATH')) {
define('ABSPATH', __DIR__);
}
final class WP_User {
public int $ID;
public string $display_name;
public function __construct(int $id, string $display_name) {
$this->ID = $id;
$this->display_name = $display_name;
}
}
final class WP_Post {
public int $ID;
public int $post_author;
public function __construct(int $id, int $post_author) {
$this->ID = $id;
$this->post_author = $post_author;
}
}
$GLOBALS['aksrt_user_card_state'] = [
'current_user_id' => 0,
'post' => null,
];
function __($text, $domain = null): string { unset($domain); return (string) $text; }
function esc_html__($text, $domain = null): string { return esc_html(__($text, $domain)); }
function esc_attr__($text, $domain = null): string { return esc_attr(__($text, $domain)); }
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 esc_attr((string) $value); }
function sanitize_key($value): string { return preg_replace('/[^a-z0-9_\-]/', '', strtolower((string) $value)) ?? ''; }
function sanitize_html_class($value): string { return preg_replace('/[^A-Za-z0-9_-]/', '', (string) $value) ?? ''; }
function wp_parse_args($args, array $defaults = []): array { return array_merge($defaults, is_array($args) ? $args : []); }
function get_option($name, $default = false) { unset($name); return $default; }
function get_current_user_id(): int { return (int) $GLOBALS['aksrt_user_card_state']['current_user_id']; }
function get_userdata($user_id): ?WP_User {
$user_id = (int) $user_id;
return $user_id > 0 ? new WP_User($user_id, 'User ' . $user_id) : null;
}
function get_post(): ?WP_Post { return $GLOBALS['aksrt_user_card_state']['post']; }
function aksrt_get_user_cover_url(int $user_id): string {
return $user_id > 0 ? 'https://example.test/cover-' . $user_id . '.jpg' : 'https://example.test/default-cover.jpg';
}
function aksrt_get_lazy_thumb(): string { return 'https://example.test/lazy.svg'; }
function aksrt_get_lazy_attr(string $type, string $url, string $class, string $placeholder = ''): string {
return ' class="' . esc_attr($class) . '" data-lazy-type="' . esc_attr($type) . '" src="' . esc_url($placeholder ?: $url) . '" data-src="' . esc_url($url) . '"';
}
function aksrt_get_default_avatar_url(): string { return 'https://example.test/default-avatar.png'; }
function aksrt_get_avatar_html($subject, int $size, array $attrs = []): string {
unset($subject);
return '<img class="' . esc_attr((string) ($attrs['class'] ?? 'avatar')) . '" alt="' . esc_attr((string) ($attrs['alt'] ?? '')) . '" width="' . $size . '" height="' . $size . '">';
}
function aksrt_get_avatar_box($user_id, string $class, bool $link = true, bool $vip = true): string {
$inner = '<span class="' . esc_attr($class) . '"><img class="avatar"></span>';
return $link ? '<a href="https://example.test/user/' . (int) $user_id . '">' . $inner . '</a>' : $inner;
}
function aksrt_get_user_name(array $args): string {
return '<name class="' . esc_attr((string) ($args['class'] ?? '')) . '"><a class="display-name">User ' . (int) ($args['id'] ?? 0) . '</a></name>';
}
function aksrt_get_user_badges(int $user_id): string { return '<span class="badg">' . $user_id . '</span>'; }
function aksrt_get_user_description(int $user_id): string { return 'Description ' . $user_id; }
function aksrt_header_user_checkin_btn(int $user_id, string $class): string {
unset($user_id);
return '<a class="' . esc_attr($class) . '" href="javascript:;">签到</a>';
}
function aksrt_render_user_card_posts(array $args): string {
return '<div data-post-type="' . esc_attr((string) ($args['post_type'] ?? '')) . '" data-post-style="' . esc_attr((string) ($args['post_style'] ?? '')) . '"></div>';
}
function aksrt_get_new_post_url(): string { return 'https://example.test/new-post'; }
function aksrt_get_user_home_url($user_id): string { return 'https://example.test/user/' . (int) $user_id; }
function aksrt_get_user_center_url(): string { return 'https://example.test/user-center'; }
function aksrt_renderer_svg_icon(string $name): string { return '<svg data-icon="' . esc_attr($name) . '"></svg>'; }
require dirname(__DIR__, 2) . '/src/WidgetSystem/Renderers/UserRenderer.php';
function aksrt_render_user_widget_state(string $slug, array $instance): string {
return \AKSRT\WidgetSystem\Renderers\UserRenderer::render($slug, $instance);
}
\AKSRT\Settings\Settings::$closed = false;
\AKSRT\Settings\Settings::$registration = true;
$GLOBALS['aksrt_user_card_state']['current_user_id'] = 0;
$guest = aksrt_render_user_widget_state('user_card', [
'show_img_bg' => true,
'loged_title' => 'HI!请登录',
]);
\AKSRT\Settings\Settings::$registration = false;
$guest_no_registration = aksrt_render_user_widget_state('user_card', [
'show_img_bg' => true,
'loged_title' => 'HI!请登录',
]);
\AKSRT\Settings\Settings::$closed = true;
$closed = aksrt_render_user_widget_state('user_card', []);
\AKSRT\Settings\Settings::$closed = false;
\AKSRT\Settings\Settings::$registration = true;
$GLOBALS['aksrt_user_card_state']['current_user_id'] = 7;
$logged = aksrt_render_user_widget_state('user_card', [
'show_img_bg' => true,
'show_button' => false,
]);
$logged_buttons = aksrt_render_user_widget_state('user_card', [
'show_img_bg' => false,
'button_1_text' => '发布文章',
'button_2_text' => '用户中心',
]);
$GLOBALS['aksrt_user_card_state']['current_user_id'] = 2;
$GLOBALS['aksrt_user_card_state']['post'] = new WP_Post(33, 9);
$author = aksrt_render_user_widget_state('author_card', [
'show_img_bg' => true,
'show_posts' => true,
'post_style' => 'card',
'limit' => 6,
'orderby' => 'date',
'show_button' => true,
]);
echo json_encode([
'guest' => $guest,
'guest_no_registration' => $guest_no_registration,
'closed' => $closed,
'logged' => $logged,
'logged_buttons' => $logged_buttons,
'author' => $author,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}