From c3f66e9a1403491044f1fe233e1ca478ce9bf1bb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 23 Aug 2026 14:20:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=BF=A1=E6=81=AF=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/frontend/sidebar.css | 5 ++ src/WidgetSystem/Renderers/UserRenderer.php | 55 +++++++++++++++---- src/WidgetSystem/WidgetSchemas.php | 6 +- .../page-display-contract.test.cjs | 7 ++- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/assets/css/frontend/sidebar.css b/assets/css/frontend/sidebar.css index 8ee1cc5a..6aea4584 100644 --- a/assets/css/frontend/sidebar.css +++ b/assets/css/frontend/sidebar.css @@ -55,6 +55,11 @@ color: var(--color-primary, #f04494); } +/* .widget a 的链接色不得覆盖 .but 按钮自身配色(zibll 的 zib-widget 不设置链接色) */ +.widget a.but { + color: var(--this-color, #fff); +} + /* Widget 标签云 */ .widget-tag-cloud .tagcloud { display: flex; diff --git a/src/WidgetSystem/Renderers/UserRenderer.php b/src/WidgetSystem/Renderers/UserRenderer.php index 8b6ed1cc..09d19632 100644 --- a/src/WidgetSystem/Renderers/UserRenderer.php +++ b/src/WidgetSystem/Renderers/UserRenderer.php @@ -22,23 +22,54 @@ final class UserRenderer { private static function user_card(array $i): string { $user_id = get_current_user_id(); if ($user_id <= 0) { - $login = function_exists('aksrt_get_login_url') ? aksrt_get_login_url() : wp_login_url(); - $register = function_exists('aksrt_get_register_url') ? aksrt_get_register_url() : wp_registration_url(); - $oauth_html = ''; - if (class_exists('AKSRT\\Auth\\OAuth')) { - $oauth = \AKSRT\Auth\OAuth::get_instance(); - if (is_callable([$oauth, 'render_social_buttons'])) { - $oauth_html = (string) $oauth->render_social_buttons(__('社交账号登录', 'aksrt')); - } elseif (is_callable([$oauth, 'get_login_buttons'])) { - $oauth_html = (string) $oauth->get_login_buttons(); - } - } - return '
' . (function_exists('aksrt_get_avatar_html') ? aksrt_get_avatar_html(0, 88) : get_avatar(0, 88)) . '

' . esc_html__('Hi,请登录', 'aksrt') . '

' . esc_html__('登录后管理课程、会员、订单与创作内容。', 'aksrt') . '

' . ($oauth_html !== '' ? '
' . $oauth_html . '
' : '') . '
'; + return self::guest_card($i); } $user = get_userdata($user_id); return $user instanceof \WP_User ? self::profile_card($user, $i, true) : ''; } + /** + * 未登录卡片 — legacy parity zib_widget_ui_user(zibll inc/widgets/widget-user.php:29-43) + * 与 zib_get_user_singin_page_box(zibll inc/functions/user/user.php:178-203)。 + */ + private static function guest_card(array $i): string { + $login = function_exists('aksrt_get_login_url') ? aksrt_get_login_url() : wp_login_url(); + $register = function_exists('aksrt_get_register_url') ? aksrt_get_register_url() : wp_registration_url(); + $title = trim((string) ($i['loged_title'] ?? '')); + if ($title === '') { + $title = __('Hi!请登录', 'aksrt'); + } + + $cover = ''; + if (!empty($i['show_cover'])) { + $cover = '
'; + } + + $buttons = '' . esc_html__('登录', 'aksrt') . ''; + if (get_option('users_can_register')) { + $buttons .= '' . esc_html__('注册', 'aksrt') . ''; + } + + $oauth_html = ''; + if (class_exists('AKSRT\\Auth\\OAuth')) { + $oauth = \AKSRT\Auth\OAuth::get_instance(); + if (is_callable([$oauth, 'render_social_buttons'])) { + $oauth_html = (string) $oauth->render_social_buttons(__('社交账号登录', 'aksrt')); + } + } + + $avatar = '' . aksrt_get_avatar_html(0, 80, ['class' => 'avatar fit-cover']) . ''; + + return '
' . $cover + . '
' + . '
' . $avatar . '
' + . '
'; + } + private static function author_card(array $i): string { $post = get_post(); if (!$post instanceof \WP_Post) { diff --git a/src/WidgetSystem/WidgetSchemas.php b/src/WidgetSystem/WidgetSchemas.php index b213e749..1ce5567f 100644 --- a/src/WidgetSystem/WidgetSchemas.php +++ b/src/WidgetSystem/WidgetSchemas.php @@ -251,13 +251,17 @@ final class WidgetSchemas { ['id' => 'orderby', 'type' => 'select', 'label' => '排序', 'default' => 'registered', 'options' => ['registered' => '注册时间', 'display_name' => '名称', 'post_count' => '文章数', 'points' => '积分', 'followers' => '粉丝']], ]; } - return [ + $fields = [ ['id' => 'show_cover', 'type' => 'switcher', 'label' => '显示封面', 'default' => true], ['id' => 'show_posts', 'type' => 'switcher', 'label' => '显示文章', 'default' => $slug === 'author_card'], ['id' => 'show_buttons', 'type' => 'switcher', 'label' => '显示快捷按钮', 'default' => true], ['id' => 'primary_action', 'type' => 'select', 'label' => '主按钮', 'default' => 'submit', 'options' => self::user_actions()], ['id' => 'secondary_action', 'type' => 'select', 'label' => '次按钮', 'default' => 'home', 'options' => self::user_actions()], ]; + if ($slug === 'user_card') { + $fields[] = ['id' => 'loged_title', 'type' => 'text', 'label' => '未登录文案', 'default' => 'Hi!请登录']; + } + return $fields; } private static function icon_card_fields(): array { diff --git a/tests/widget-system/page-display-contract.test.cjs b/tests/widget-system/page-display-contract.test.cjs index d8517be6..d053d70f 100644 --- a/tests/widget-system/page-display-contract.test.cjs +++ b/tests/widget-system/page-display-contract.test.cjs @@ -264,8 +264,11 @@ test('user profile widget owns its only card surface and keeps membership below assert.match(userRenderer, /aksrt-user-card__identity.*aksrt_render_user_identity_chips\(\$user_id, 'widget'\)/s) assert.doesNotMatch(userRenderer, /display_name\) \. '<\/a>' \. \(function_exists\('aksrt_render_vip_badge'/) assert.match(userRenderer, /\$variant = \$primary \? ' is-primary' : ' is-secondary'/) - assert.match(userRenderer, /aksrt-widget-button is-primary signin-loader/) - assert.match(userRenderer, /aksrt-widget-button is-secondary signup-loader/) + // 未登录卡片复刻 zibll user-card 结构(zib_widget_ui_user + zib_get_user_singin_page_box) + assert.match(userRenderer, /user-card widget/) + assert.match(userRenderer, /signin-loader but jb-blue/) + assert.match(userRenderer, /signup-loader but jb-yellow/) + assert.doesNotMatch(userRenderer, /aksrt-user-card is-guest/) assert.doesNotMatch(userRenderer, /aksrt-widget-button is-ghost/) })