diff --git a/assets/css/frontend/widget-batch5.css b/assets/css/frontend/widget-batch5.css index 8bd26f5b..4e20b93c 100644 --- a/assets/css/frontend/widget-batch5.css +++ b/assets/css/frontend/widget-batch5.css @@ -2414,3 +2414,15 @@ a.main-color > .icon-cover-card:hover, } .aksrt-forum-widget__rank-row badge.img-badge { position: static; flex: 0 0 auto; margin-top: 4px; } .aksrt-stats__item[data-aksrt-animate] { will-change: transform, opacity; } + + +/* batch28-30 residual */ +.aksrt-ftab.widget-tab-posts .aksrt-ftab__nav { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0 0 12px; padding: 0; } +.aksrt-ftab__btn.widget-tab-posts__tab { + border: 0; background: var(--surface-2, #f3f4f6); color: inherit; + border-radius: 999px; padding: 6px 12px; cursor: pointer; font-size: 13px; +} +.aksrt-ftab__btn.is-active { background: var(--theme-color, #f04494); color: #fff; } +.aksrt-ftab__panel[hidden] { display: none !important; } +.aksrt-ftab__panel.is-ajax-loading { opacity: .65; pointer-events: none; } +.aksrt-reviews__avatar.aksrt-lazy { object-fit: cover; border-radius: 50%; } diff --git a/src/AKSRT/Core/WidgetAjax.php b/src/AKSRT/Core/WidgetAjax.php index 82145a25..8e60cbbf 100644 --- a/src/AKSRT/Core/WidgetAjax.php +++ b/src/AKSRT/Core/WidgetAjax.php @@ -204,10 +204,16 @@ class WidgetAjax { if (!class_exists('\AKSRT\Widgets\WidgetForumHotTopics')) { return $this->fail(); } + $style = sanitize_key((string) ($request->get_param('style') ?? 'mini')); + if (!in_array($style, ['mini', 'rank'], true)) { + $style = 'mini'; + } $instance = [ 'count' => max(1, min(20, (int) ($request->get_param('count') ?? 5))), 'period' => sanitize_key((string) ($request->get_param('period') ?? 'week')), 'orderby' => sanitize_key((string) ($request->get_param('orderby') ?? 'views')), + 'style' => $style, + 'plate' => max(0, (int) ($request->get_param('plate') ?? $request->get_param('plate_id') ?? 0)), 'paginate' => sanitize_key((string) ($request->get_param('paginate') ?? 'ajax')), ]; $page = max(1, (int) ($request->get_param('page') ?? 1)); diff --git a/src/AKSRT/Widgets/AboutWidget.php b/src/AKSRT/Widgets/AboutWidget.php index 953b3913..2de84c6b 100644 --- a/src/AKSRT/Widgets/AboutWidget.php +++ b/src/AKSRT/Widgets/AboutWidget.php @@ -61,12 +61,12 @@ class AboutWidget extends \WP_Widget { ?>
- > +
- > +
@@ -111,13 +111,13 @@ class AboutWidget extends \WP_Widget {
- > +
- > +
diff --git a/src/AKSRT/Widgets/WidgetAnnouncement.php b/src/AKSRT/Widgets/WidgetAnnouncement.php index dda10886..9f9b939b 100644 --- a/src/AKSRT/Widgets/WidgetAnnouncement.php +++ b/src/AKSRT/Widgets/WidgetAnnouncement.php @@ -40,6 +40,13 @@ class WidgetAnnouncement extends \WP_Widget { $lines = array_values(array_filter(array_map('trim', explode("\n", $items)))); if (!$lines) { + if (current_user_can('manage_options')) { + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo function_exists('aksrt_get_widget_null') + ? aksrt_get_widget_null(__('请添加至少一条公告', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + : '

' . esc_html__('请添加至少一条公告', 'aksrt') . '

'; + echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } return; } diff --git a/src/AKSRT/Widgets/WidgetAuthorCard.php b/src/AKSRT/Widgets/WidgetAuthorCard.php index 9afe9744..f6015201 100644 --- a/src/AKSRT/Widgets/WidgetAuthorCard.php +++ b/src/AKSRT/Widgets/WidgetAuthorCard.php @@ -97,7 +97,8 @@ class WidgetAuthorCard extends \WP_Widget { } echo '
'; echo '
'; - echo ''; + $ph = get_template_directory_uri() . '/assets/img/placeholder.svg'; + echo ''; echo '
' . $name_html . '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ($bio !== '') { echo '
' . esc_html(wp_trim_words($bio, 28)) . '
'; diff --git a/src/AKSRT/Widgets/WidgetForumBoardList.php b/src/AKSRT/Widgets/WidgetForumBoardList.php index c66869fa..369276df 100644 --- a/src/AKSRT/Widgets/WidgetForumBoardList.php +++ b/src/AKSRT/Widgets/WidgetForumBoardList.php @@ -140,7 +140,10 @@ class WidgetForumBoardList extends \WP_Widget { echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $rest = rest_url('aksrt/v1/widgets/forum-boards'); + echo '
'; echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } diff --git a/src/AKSRT/Widgets/WidgetForumTabTopics.php b/src/AKSRT/Widgets/WidgetForumTabTopics.php index f1ef2d76..96adebd1 100644 --- a/src/AKSRT/Widgets/WidgetForumTabTopics.php +++ b/src/AKSRT/Widgets/WidgetForumTabTopics.php @@ -1,6 +1,6 @@ esc_html__('热门/最新/精华等栏目切换的帖子列表(懒加载)。', 'aksrt'), + 'description' => esc_html__('热门/最新/精华等栏目切换的帖子列表(共享迷你行 + 懒加载)。', 'aksrt'), 'classname' => 'widget_aksrt_forum_tab_topics', ] ); @@ -35,8 +35,14 @@ class WidgetForumTabTopics extends \WP_Widget { ]; } $count = max(1, min(20, (int) ($instance['count'] ?? 6))); - $uid = 'aksrt-ftab-' . esc_attr($this->id); - $rest = rest_url('aksrt/v1/forum/frontend/widgets/topics'); + $style = sanitize_key((string) ($instance['style'] ?? 'mini')); + if (!in_array($style, ['mini', 'rank'], true)) { + $style = 'mini'; + } + $plate = max(0, (int) ($instance['plate'] ?? 0)); + $uid = 'aksrt-ftab-' . esc_attr($this->id); + // Prefer WidgetAjax forum-topics (HotTopics payload with style/plate). + $rest = rest_url('aksrt/v1/widgets/forum-topics'); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); @@ -44,23 +50,25 @@ class WidgetForumTabTopics extends \WP_Widget { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - echo '
'; - echo '
    '; + echo '
    '; + echo '
      '; foreach ($tabs as $i => $tab) { $cls = $i === 0 ? ' is-active' : ''; - echo '
    • '; + echo '
    • '; } echo '
    '; foreach ($tabs as $i => $tab) { - $cls = $i === 0 ? ' is-active' : ''; + $cls = $i === 0 ? ' is-active' : ''; $loaded = $i === 0 ? '1' : '0'; - echo '
    '; + echo '
    '; if ($i === 0) { - $payload = WidgetForumTopicLists::query_payload([ + $payload = WidgetForumHotTopics::query_payload([ 'count' => $count, 'orderby' => $tab['orderby'], - 'style' => 'mini', + 'period' => 'all', + 'style' => $style, + 'plate' => $plate, 'paginate' => 'none', ], 1); echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped @@ -77,11 +85,13 @@ class WidgetForumTabTopics extends \WP_Widget { if(!root||root._aksrtFtab)return; root._aksrtFtab=1; var rest=root.getAttribute('data-rest')||''; var count=root.getAttribute('data-count')||'6'; + var style=root.getAttribute('data-style')||'mini'; + var plate=root.getAttribute('data-plate')||'0'; var btns=[].slice.call(root.querySelectorAll('.aksrt-ftab__btn')); var panels=[].slice.call(root.querySelectorAll('.aksrt-ftab__panel')); function load(panel, orderby){ if(!panel||panel.getAttribute('data-loaded')==='1'||!rest)return; - var qs=new URLSearchParams({page:'1',count:count,orderby:orderby||'date',style:'mini',paginate:'none'}); + var qs=new URLSearchParams({page:'1',count:count,orderby:orderby||'date',style:style,plate:plate,period:'all',paginate:'none'}); var url=rest+(rest.indexOf('?')>-1?'&':'?')+qs.toString(); panel.classList.add('is-ajax-loading'); fetch(url,{credentials:'same-origin',headers:{Accept:'application/json','X-WP-Nonce':(window.aksrtData&&aksrtData.restNonce)||''}}) @@ -94,8 +104,16 @@ class WidgetForumTabTopics extends \WP_Widget { }).catch(function(){panel.classList.remove('is-ajax-loading');}); } function go(i){ - btns.forEach(function(b,idx){b.classList.toggle('is-active',idx===i);}); - panels.forEach(function(p,idx){p.classList.toggle('is-active',idx===i);}); + btns.forEach(function(b,idx){ + var on=idx===i; + b.classList.toggle('is-active',on); + b.setAttribute('aria-selected',on?'true':'false'); + }); + panels.forEach(function(p,idx){ + var on=idx===i; + p.classList.toggle('is-active',on); + if(on){p.removeAttribute('hidden');}else{p.setAttribute('hidden','');} + }); var btn=btns[i], panel=panels[i]; if(btn&&panel) load(panel, btn.getAttribute('data-orderby')||'date'); } @@ -148,6 +166,8 @@ class WidgetForumTabTopics extends \WP_Widget { $defaults = [ 'title' => __('论坛栏目', 'aksrt'), 'count' => 6, + 'style' => 'mini', + 'plate' => 0, 'tabs' => "最新|date\n热门|views\n精华|essence", ]; $instance = wp_parse_args($instance, $defaults); @@ -170,6 +190,19 @@ class WidgetForumTabTopics extends \WP_Widget {

    +

    + +

    +

    + +

    '; + $rest = rest_url('aksrt/v1/widgets/forum-terms'); + echo '
    '; echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '
    '; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped diff --git a/src/AKSRT/Widgets/WidgetPricingPlans.php b/src/AKSRT/Widgets/WidgetPricingPlans.php index 45f94d25..8fc48622 100644 --- a/src/AKSRT/Widgets/WidgetPricingPlans.php +++ b/src/AKSRT/Widgets/WidgetPricingPlans.php @@ -25,6 +25,13 @@ class WidgetPricingPlans extends \WP_Widget { public function widget($args, $instance): void { $plans = $this->normalize_plans($instance['lists'] ?? $instance['plans'] ?? []); if (!$plans) { + if (current_user_can('manage_options')) { + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo function_exists('aksrt_get_widget_null') + ? aksrt_get_widget_null(__('请配置至少一个价格方案', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + : '

    ' . esc_html__('请配置至少一个价格方案', 'aksrt') . '

    '; + echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } return; } $trust = $this->normalize_trust($instance['trust_items'] ?? []); diff --git a/src/AKSRT/Widgets/WidgetReviews.php b/src/AKSRT/Widgets/WidgetReviews.php index 43d77a01..0bad742f 100644 --- a/src/AKSRT/Widgets/WidgetReviews.php +++ b/src/AKSRT/Widgets/WidgetReviews.php @@ -25,6 +25,13 @@ class WidgetReviews extends \WP_Widget { public function widget($args, $instance): void { $reviews = $this->normalize($instance['reviews'] ?? []); if (!$reviews) { + if (current_user_can('manage_options')) { + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo function_exists('aksrt_get_widget_null') + ? aksrt_get_widget_null(__('请添加至少一条评价', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + : '

    ' . esc_html__('请添加至少一条评价', 'aksrt') . '

    '; + echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } return; } $pc = max(1, min(6, (float) ($instance['desktop_per_view'] ?? 3))); @@ -44,7 +51,8 @@ class WidgetReviews extends \WP_Widget { echo '
    '; echo '
    '; if ($r['avatar'] !== '') { - echo ''; + $ph = get_template_directory_uri() . '/assets/img/placeholder.svg'; + echo ''; } else { echo ''; } diff --git a/src/AKSRT/Widgets/WidgetUserCard.php b/src/AKSRT/Widgets/WidgetUserCard.php index 61f42ac8..4cbe68b3 100644 --- a/src/AKSRT/Widgets/WidgetUserCard.php +++ b/src/AKSRT/Widgets/WidgetUserCard.php @@ -130,7 +130,8 @@ class WidgetUserCard extends \WP_Widget { } } echo '
    '; - echo '' . esc_attr($user->display_name) . ''; + $ph = get_template_directory_uri() . '/assets/img/placeholder.svg'; + echo '' . esc_attr($user->display_name) . ''; echo '
    '; echo '

    ' . $name_html . '

    '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ($bio !== '') {