From d97174dadbaae647f27270b6bc455179d8a51011 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 16 Aug 2026 15:03:49 +0800 Subject: [PATCH] refactor(widgets): remove shared redundant settings --- inc/modules/widget-areas.php | 148 +++++ inc/modules/widget-common.php | 638 ---------------------- inc/modules/widgets-register.php | 320 +---------- src/Widgets/ButtonsWidget.php | 31 +- src/Widgets/CategoriesWidget.php | 14 +- src/Widgets/CategoryBlockWidget.php | 5 +- src/Widgets/CategoryRecommendWidget.php | 5 +- src/Widgets/CategoryTabsWidget.php | 5 +- src/Widgets/HotPostsWidget.php | 11 +- src/Widgets/IconCardsWidget.php | 20 +- src/Widgets/NoticeWidget.php | 12 +- src/Widgets/RecentCommentsWidget.php | 14 +- src/Widgets/SearchWidget.php | 11 +- src/Widgets/TabPostsWidget.php | 5 +- src/Widgets/TagCloudWidget.php | 14 +- src/Widgets/Traits/CommonWidgetFields.php | 73 --- src/Widgets/WidgetAnnouncement.php | 5 +- src/Widgets/WidgetComboInfo.php | 26 +- src/Widgets/WidgetCoverCards.php | 5 +- src/Widgets/WidgetIconCoverCards.php | 5 +- src/Widgets/WidgetIframe.php | 5 +- src/Widgets/WidgetMainPosts.php | 11 +- src/Widgets/WidgetOnelinePosts.php | 5 +- src/Widgets/WidgetPostPayBox.php | 5 +- src/Widgets/WidgetSlider.php | 5 +- src/Widgets/WidgetTermAggregation.php | 5 +- src/Widgets/WidgetTermCards.php | 5 +- src/Widgets/WidgetTextTitle.php | 61 +-- src/Widgets/WidgetUserCard.php | 14 - src/Widgets/WidgetVideoPlayer.php | 5 +- src/Widgets/WidgetYiyan.php | 32 +- 31 files changed, 199 insertions(+), 1321 deletions(-) create mode 100644 inc/modules/widget-areas.php delete mode 100644 inc/modules/widget-common.php delete mode 100644 src/Widgets/Traits/CommonWidgetFields.php diff --git a/inc/modules/widget-areas.php b/inc/modules/widget-areas.php new file mode 100644 index 00000000..a1743864 --- /dev/null +++ b/inc/modules/widget-areas.php @@ -0,0 +1,148 @@ + __('仅限侧栏区域:首页侧栏、文章页侧边栏、全站侧栏、分类/标签/搜索侧栏。', 'aksrt'), + 'homepage' => __('仅限首页挂载区域:首页顶部/底部全宽、首页内容上方/下方。', 'aksrt'), + 'hybrid' => __('支持侧栏、首页和归档页挂载区域。', 'aksrt'), + 'archive' => __('仅限归档页挂载区域:分类页、标签页、搜索页的顶部/底部/侧栏。', 'aksrt'), + ]; + if (empty($messages[$scope])) { + return; + } + printf('

%s

', esc_html($messages[$scope])); +} + +function aksrt_filter_widget_display_by_area($instance, WP_Widget $widget, array $args) { + if ($instance === false) { + return false; + } + $sidebar_id = isset($args['id']) ? (string) $args['id'] : ''; + $widget_base_id = isset($widget->id_base) ? (string) $widget->id_base : ''; + return aksrt_widget_is_allowed_in_sidebar($widget_base_id, $sidebar_id) ? $instance : false; +} +add_filter('widget_display_callback', 'aksrt_filter_widget_display_by_area', 10, 3); + +function aksrt_filter_widget_sidebar_assignments($new_value, $old_value) { + if (!is_array($new_value)) { + return $new_value; + } + $removed = []; + foreach ($new_value as $sidebar_id => $widget_ids) { + if (!is_array($widget_ids) || $sidebar_id === 'wp_inactive_widgets') { + continue; + } + $filtered = []; + foreach ($widget_ids as $widget_id) { + if (!is_string($widget_id) || $widget_id === '') { + continue; + } + $widget_base_id = aksrt_widget_base_from_id($widget_id); + if (aksrt_widget_is_allowed_in_sidebar($widget_base_id, (string) $sidebar_id)) { + $filtered[] = $widget_id; + } else { + $removed[] = $widget_id; + } + } + $new_value[$sidebar_id] = array_values($filtered); + } + if (empty($removed)) { + return $new_value; + } + if (!isset($new_value['wp_inactive_widgets']) || !is_array($new_value['wp_inactive_widgets'])) { + $new_value['wp_inactive_widgets'] = []; + } + $assigned = []; + foreach ($new_value as $widget_ids) { + if (!is_array($widget_ids)) { + continue; + } + foreach ($widget_ids as $widget_id) { + if (is_string($widget_id) && $widget_id !== '') { + $assigned[$widget_id] = true; + } + } + } + foreach (array_values(array_unique($removed)) as $widget_id) { + if (!isset($assigned[$widget_id]) && !in_array($widget_id, $new_value['wp_inactive_widgets'], true)) { + $new_value['wp_inactive_widgets'][] = $widget_id; + } + } + return $new_value; +} +add_filter('pre_update_option_sidebars_widgets', 'aksrt_filter_widget_sidebar_assignments', 10, 2); diff --git a/inc/modules/widget-common.php b/inc/modules/widget-common.php deleted file mode 100644 index c26baba8..00000000 --- a/inc/modules/widget-common.php +++ /dev/null @@ -1,638 +0,0 @@ - - */ - function aksrt_widget_common_defaults(): array { - return [ - 'subtitle' => '', - 'title_style' => '', - 'title_highlight' => '', - 'title_highlight_color'=> 'focus-color', - 'title_link' => ['url' => '', 'text' => '', 'target' => ''], - 'title_link2' => ['url' => '', 'text' => '', 'target' => ''], - 'title_link3' => ['url' => '', 'text' => '', 'target' => ''], - 'title_link_style' => ['color_1' => 'jb-blue', 'color_2' => 'jb-yellow', 'color_3' => 'jb-green'], - 'sidebar_affix' => false, - 'show_type' => 'all', - 'show_id_type' => '', - 'show_ids' => '', - 'animation_in' => '', - 'animation_repeat' => false, - 'layout_pin_pc' => ['top' => '', 'bottom' => ''], - 'layout_pin_m' => ['top' => '', 'bottom' => ''], - 'layout_bg' => ['img_white' => [], 'img_dark' => []], - ]; - } -} - -if (!function_exists('aksrt_widget_normalize_link')) { - /** - * Normalize a title_linkN array {url,text,target}. - * - * @param mixed $raw - * @return array{url:string,text:string,target:string} - */ - function aksrt_widget_normalize_link($raw): array { - $raw = is_array($raw) ? $raw : []; - return [ - 'url' => esc_url_raw(trim((string) ($raw['url'] ?? ''))), - 'text' => sanitize_text_field((string) ($raw['text'] ?? '')), - 'target' => ($raw['target'] ?? '') === '_blank' ? '_blank' : '', - ]; - } -} - -if (!function_exists('aksrt_widget_normalize_common')) { - /** - * Normalize common widget instance fields, filling defaults for legacy instances. - * - * Accepts both the new structured shape (title_link as array) and legacy - * flat shapes (title_link as URL string, in_affix bool) emitted by older - * widget versions, normalizing them onto the canonical shared schema. - * - * @param array $instance - * @return array - */ - function aksrt_widget_normalize_common(array $instance): array { - $defaults = aksrt_widget_common_defaults(); - $result = array_merge($defaults, $instance); - - $result['subtitle'] = sanitize_text_field($result['subtitle'] ?? ''); - - $result['title_style'] = in_array($result['title_style'] ?? '', ['', 'big'], true) ? $result['title_style'] : ''; - $result['title_highlight'] = sanitize_text_field($result['title_highlight'] ?? ''); - $result['title_highlight_color'] = sanitize_html_class((string) ($result['title_highlight_color'] ?? 'focus-color')); - if ($result['title_highlight_color'] === '') { - $result['title_highlight_color'] = 'focus-color'; - } - - // Legacy flat title_link (URL string) → structured first link. - if (is_string($result['title_link'] ?? null)) { - $result['title_link'] = ['url' => esc_url_raw(trim($result['title_link'])), 'text' => '', 'target' => '']; - } - $result['title_link'] = aksrt_widget_normalize_link($result['title_link'] ?? []); - $result['title_link2'] = aksrt_widget_normalize_link($result['title_link2'] ?? []); - $result['title_link3'] = aksrt_widget_normalize_link($result['title_link3'] ?? []); - - $tl_style = is_array($result['title_link_style'] ?? null) ? $result['title_link_style'] : []; - $result['title_link_style'] = [ - 'color_1' => sanitize_html_class((string) ($tl_style['color_1'] ?? 'jb-blue')) ?: 'jb-blue', - 'color_2' => sanitize_html_class((string) ($tl_style['color_2'] ?? 'jb-yellow')) ?: 'jb-yellow', - 'color_3' => sanitize_html_class((string) ($tl_style['color_3'] ?? 'jb-green')) ?: 'jb-green', - ]; - - // show_type: accept both AKSRT legacy (pc/mobile) and Zibll (only_pc/only_sm) tokens. - $show_type = (string) ($result['show_type'] ?? 'all'); - if ($show_type === 'only_pc' || $show_type === 'pc') { - $show_type = 'only_pc'; - } elseif ($show_type === 'only_sm' || $show_type === 'mobile') { - $show_type = 'only_sm'; - } else { - $show_type = 'all'; - } - $result['show_type'] = $show_type; - - // show_id_type: Zibll (show/hide) ↔ AKSRT legacy (include/exclude). - $id_type = (string) ($result['show_id_type'] ?? ''); - if ($id_type === 'include') { - $id_type = 'show'; - } elseif ($id_type === 'exclude') { - $id_type = 'hide'; - } elseif (!in_array($id_type, ['', 'show', 'hide'], true)) { - $id_type = ''; - } - $result['show_id_type'] = $id_type; - $result['show_ids'] = sanitize_text_field($result['show_ids'] ?? ''); - - $result['sidebar_affix'] = !empty($result['sidebar_affix']) || !empty($result['in_affix'] ?? false); - - $result['animation_in'] = sanitize_key($result['animation_in'] ?? ''); - $result['animation_repeat'] = !empty($result['animation_repeat']); - - foreach (['layout_pin_pc', 'layout_pin_m'] as $pin_key) { - $pin = is_array($result[$pin_key] ?? null) ? $result[$pin_key] : []; - $result[$pin_key] = [ - 'top' => preg_match('/^-?\d+$/', (string) ($pin['top'] ?? '')) ? (string) (int) $pin['top'] : '', - 'bottom' => preg_match('/^-?\d+$/', (string) ($pin['bottom'] ?? '')) ? (string) (int) $pin['bottom'] : '', - ]; - } - - $bg = is_array($result['layout_bg'] ?? null) ? $result['layout_bg'] : []; - $result['layout_bg'] = [ - 'img_white' => aksrt_widget_normalize_bg($bg['img_white'] ?? []), - 'img_dark' => aksrt_widget_normalize_bg($bg['img_dark'] ?? []), - ]; - - return $result; - } -} - -if (!function_exists('aksrt_widget_normalize_bg')) { - /** - * Normalize a layout_bg sub-block (background CSS props). - * - * @param mixed $raw - * @return array - */ - function aksrt_widget_normalize_bg($raw): array { - $raw = is_array($raw) ? $raw : []; - $out = []; - foreach (['background-color', 'background-image', 'background-position', 'background-repeat', 'background-attachment', 'background-size', 'background-origin'] as $k) { - $v = trim((string) ($raw[$k] ?? '')); - if ($k === 'background-image' && $v !== '') { - $v = esc_url_raw($v); - } elseif ($k === 'background-color' && $v !== '') { - // Allow hex / rgb / rgba / named; strip tags defensively. - $v = sanitize_text_field($v); - } else { - $v = sanitize_text_field($v); - } - if ($v !== '') { - $out[$k] = $v; - } - } - return $out; - } -} - -if (!function_exists('aksrt_widget_animation_options')) { - /** - * Zibll-aligned module entrance animation options. - * - * @return array - */ - function aksrt_widget_animation_options(): array { - return [ - '' => __('无动画', 'aksrt'), - 'fade' => __('淡入', 'aksrt'), - 'slideup' => __('从下往上滑出', 'aksrt'), - 'slidedown' => __('从上往下滑出', 'aksrt'), - 'slideright' => __('从左往右滑出', 'aksrt'), - 'slideleft' => __('从右往左滑出', 'aksrt'), - 'zoomin' => __('由小变大', 'aksrt'), - 'zoomout' => __('由大变小', 'aksrt'), - ]; - } -} - -if (!function_exists('aksrt_widget_highlight_color_options')) { - /** - * Highlight color palette (Zibll zib_palette parity, theme classes). - * - * @return array - */ - function aksrt_widget_highlight_color_options(): array { - return [ - 'focus-color' => __('主题色', 'aksrt'), - 'jb-blue' => __('渐变蓝', 'aksrt'), - 'jb-green' => __('渐变绿', 'aksrt'), - 'jb-yellow' => __('渐变黄', 'aksrt'), - 'jb-orange' => __('渐变橙', 'aksrt'), - 'jb-red' => __('渐变红', 'aksrt'), - 'jb-purple' => __('渐变紫', 'aksrt'), - 'jb-pink' => __('渐变粉', 'aksrt'), - 'jb-cyan' => __('渐变青', 'aksrt'), - 'c-blue' => __('蓝色', 'aksrt'), - 'c-green' => __('绿色', 'aksrt'), - 'c-red' => __('红色', 'aksrt'), - 'c-yellow' => __('黄色', 'aksrt'), - 'c-purple' => __('紫色', 'aksrt'), - ]; - } -} - -if (!function_exists('aksrt_widget_render_link_field')) { - /** - * Render a single title-link sub-field (url/text/target) for the admin form. - * - * @param string $base Field base name, e.g. 'title_link'. - * @param array $link Normalized link {url,text,target}. - * @param string $label Field label. - */ - function aksrt_widget_render_link_field(string $base, array $link, string $label): void { - ?> -

- - - -

- $instance Current widget instance. - */ - function aksrt_widget_render_common_form(array $instance): void { - $instance = aksrt_widget_normalize_common($instance); - $pin_pc = $instance['layout_pin_pc']; - $pin_m = $instance['layout_pin_m']; - $bg_w = $instance['layout_bg']['img_white']; - $bg_d = $instance['layout_bg']['img_dark']; - ?> -
-

- -

- -

-

- - - -

-

- -

-

- -

- - - - - - -

- - - - -

- - -

-

- - - - -

-

- - - - -

-

- -

-

- -

-

- -

-

- -

- -

-

- -

-

- -

-

- - -

-

- - -

- $new_instance - * @param array $old_instance - * @return array - */ - function aksrt_widget_update_common(array $new_instance, array $old_instance): array { - $merged = array_merge($old_instance, $new_instance); - return aksrt_widget_normalize_common($merged); - } -} - -if (!function_exists('aksrt_widget_render_common_before')) { - /** - * Build common wrapper classes/attrs for a widget instance. - * - * Zibll CSF_Widget::wrap_attributes() parity: show-type class, sidebar - * affix data-affix, entrance animation class, layout padding/bg CSS vars. - * Call this at the start of widget() before rendering content. - * - * @param array $args Sidebar args. - * @param array $instance Widget instance. - * @return array CSS class names (Zibll show_class style). - */ - function aksrt_widget_get_common_wrapper_classes(array $args, array $instance): array { - $instance = aksrt_widget_normalize_common($instance); - $classes = []; - - // Show type: PC or mobile (Zibll hidden-xs / visible-xs-block). - if ($instance['show_type'] === 'only_pc') { - $classes[] = 'hidden-xs'; - } elseif ($instance['show_type'] === 'only_sm') { - $classes[] = 'visible-xs-block'; - } - - // Sidebar affix - if ($instance['sidebar_affix']) { - $classes[] = 'is-affix'; - } - - // Animation (Zibll obs-animate ani-*). - if ($instance['animation_in'] !== '') { - $classes[] = 'obs-animate'; - $classes[] = 'ani-' . $instance['animation_in']; - if ($instance['animation_repeat']) { - $classes[] = 'obs-animate-repeat'; - } - } - - return $classes; - } -} - -if (!function_exists('aksrt_widget_common_wrapper_attr')) { - /** - * Build the full wrapper attribute string (class + style + data-affix) for - * the Zibll .zib-widget-wrap parity layer. - * - * Combine with a widget-specific class via a leading space, or use as-is. - * - * @param array $instance Widget instance. - * @param string $extra_class Additional class (widget-specific). - * @return string Escaped attribute string beginning with a leading space, e.g. ' class="…" style="…" data-affix="true"'. - */ - function aksrt_widget_common_wrapper_attr(array $instance, string $extra_class = ''): string { - $instance = aksrt_widget_normalize_common($instance); - $classes = ['zib-widget-wrap']; - foreach (aksrt_widget_get_common_wrapper_classes([], $instance) as $c) { - $classes[] = $c; - } - $extra_class = trim($extra_class); - if ($extra_class !== '') { - $classes[] = $extra_class; - } - - $styles = []; - if ($instance['layout_pin_pc']['top'] !== '') { - $styles[] = '--pt-pc:' . (int) $instance['layout_pin_pc']['top'] . 'px;'; - } - if ($instance['layout_pin_pc']['bottom'] !== '') { - $styles[] = '--pb-pc:' . (int) $instance['layout_pin_pc']['bottom'] . 'px;'; - } - if ($instance['layout_pin_m']['top'] !== '') { - $styles[] = '--pt-m:' . (int) $instance['layout_pin_m']['top'] . 'px;'; - } - if ($instance['layout_pin_m']['bottom'] !== '') { - $styles[] = '--pb-m:' . (int) $instance['layout_pin_m']['bottom'] . 'px;'; - } - foreach (['white' => 'img_white', 'dark' => 'img_dark'] as $mode => $bg_key) { - $bg = $instance['layout_bg'][$bg_key] ?? []; - if (!empty($bg['background-color'])) { - $styles[] = '--bg-color-' . $mode . ':' . $bg['background-color'] . ';'; - } - if (!empty($bg['background-image'])) { - $styles[] = '--bg-img-' . $mode . ':url("' . $bg['background-image'] . '");'; - } - } - - $attr = ' class="' . esc_attr(implode(' ', $classes)) . '"'; - if ($styles) { - $attr .= ' style="' . esc_attr(implode('', $styles)) . '"'; - } - if ($instance['sidebar_affix']) { - $attr .= ' data-affix="true"'; - } - return $attr; - } -} - -if (!function_exists('aksrt_widget_affix_attrs')) { - /** - * Compact affix class+attribute helper for widgets that apply affix onto an - * inner wrapper (the two-family pattern from the legacy in_affix widgets). - * - * @param array $instance Widget instance. - * @return array{class:string,attr:string} class includes leading space when active; attr includes leading space. - */ - function aksrt_widget_affix_attrs(array $instance): array { - $instance = aksrt_widget_normalize_common($instance); - if (empty($instance['sidebar_affix'])) { - return ['class' => '', 'attr' => '']; - } - return ['class' => ' is-affix', 'attr' => ' data-affix="true"']; - } -} - -if (!function_exists('aksrt_widget_render_title')) { - /** - * Render the Zibll-aligned widget title block (CSF_Widget::show_title parity). - * - * Two styles: - * - '' (简约): .box-body notop > .title-theme with optional subtitle + more link - * - 'big' (居中大标题): .big-title-wrap with up to 3 button links - * - * Highlight wraps the matched substring in a colored span. - * - * @param array $instance Widget instance. - * @return string Title HTML (empty when no title). - */ - function aksrt_widget_render_title(array $instance): string { - $instance = aksrt_widget_normalize_common($instance); - $title = trim((string) ($instance['title'] ?? '')); - if ($title === '') { - return ''; - } - - $highlight = trim((string) $instance['title_highlight']); - $subtitle = (string) $instance['subtitle']; - $anim = function_exists('aksrt_widget_animation_class') - ? aksrt_widget_animation_class($instance) - : ''; - - $title = esc_html($title); - - if ($highlight !== '' && $highlight !== $title) { - $color = $instance['title_highlight_color']; - $hl_esc = esc_html($highlight); - $title = str_replace($hl_esc, '' . $hl_esc . '', $title); - } - - if ($instance['title_style'] === 'big') { - $style = $instance['title_link_style']; - $links = ''; - foreach (['title_link' => 'color_1', 'title_link2' => 'color_2', 'title_link3' => 'color_3'] as $key => $color_key) { - $link = $instance[$key]; - if ($link['url'] !== '' && $link['text'] !== '') { - $blank = $link['target'] === '_blank' ? ' target="_blank"' : ''; - $links .= '' . esc_html($link['text']) . ''; - } - } - $links = $links !== '' ? '
' . $links . '
' : ''; - $sub = $subtitle !== '' ? '

' . esc_html($subtitle) . '

' : ''; - return '

' . $title . '

' . $sub . $links . '
'; - } - - // Simple style. - $link = $instance['title_link']; - $sub = $subtitle !== '' ? '' . esc_html($subtitle) . '' : ''; - $more = ''; - if ($link['url'] !== '') { - $text = $link['text'] !== '' ? $link['text'] : '' . __('更多', 'aksrt'); - $blank = $link['target'] === '_blank' ? ' target="_blank"' : ''; - $more = '
' . wp_kses_post($text) . '
'; - } - return '
' . $title . $sub . $more . '
'; - } -} - -if (!function_exists('aksrt_widget_animation_class')) { - /** - * Zibll CSF_Widget::animation_class parity: obs-animate ani-* [+repeat]. - * - * @param array $instance Normalized widget instance. - * @param bool $is_title Reserved for title-specific animation. - * @return string - */ - function aksrt_widget_animation_class(array $instance, bool $is_title = false): string { - $animation = (string) ($instance['animation_in'] ?? ''); - if ($animation === '') { - return ''; - } - $class = ' obs-animate ani-' . $animation; - if (!empty($instance['animation_repeat'])) { - $class .= ' obs-animate-repeat'; - } - return $class; - } -} - -if (!function_exists('aksrt_widget_should_display_by_ids')) { - /** - * Check if the current post/page should display the widget based on show_id_type and show_ids. - * - * show_id_type tokens: '' (no limit) | 'show' (whitelist) | 'hide' (blacklist). - * Accepts legacy 'include'/'exclude' via normalize_common. - * - * @param array $instance Widget instance. - * @return bool - */ - function aksrt_widget_should_display_by_ids(array $instance): bool { - $instance = aksrt_widget_normalize_common($instance); - - if ($instance['show_id_type'] === '' || $instance['show_ids'] === '') { - return true; - } - - $current_id = get_the_ID(); - if (!$current_id) { - return true; // Not on a singular page, allow display - } - - // Zibll splits on comma/Chinese-comma/whitespace/newline. - $ids = array_filter(array_map('absint', preg_split('/[,,\s]+/', $instance['show_ids']) ?: [])); - - if ($instance['show_id_type'] === 'show') { - return in_array($current_id, $ids, true); - } - - if ($instance['show_id_type'] === 'hide') { - return !in_array($current_id, $ids, true); - } - - return true; - } -} diff --git a/inc/modules/widgets-register.php b/inc/modules/widgets-register.php index 23f51e95..3c454227 100644 --- a/inc/modules/widgets-register.php +++ b/inc/modules/widgets-register.php @@ -7,7 +7,7 @@ defined('ABSPATH') || exit; -require_once AKSRT_DIR . '/inc/modules/widget-common.php'; +require_once AKSRT_DIR . '/inc/modules/widget-areas.php'; /** * Register custom widgets. @@ -71,324 +71,6 @@ function aksrt_register_widgets() { } add_action('widgets_init', 'aksrt_register_widgets'); -if (!function_exists('aksrt_widget_sidebar_area_ids')) { - /** - * Sidebars intended for sidebar-only widgets. - * - * @return array - */ - function aksrt_widget_sidebar_area_ids(): array { - return [ - 'home_sidebar', - 'sidebar-article', - 'all_sidebar_top', - 'all_sidebar_bottom', - 'cat_sidebar', - 'tag_sidebar', - 'search_sidebar', - ]; - } -} - -if (!function_exists('aksrt_widget_archive_area_ids')) { - /** - * Widget zones for archive pages (cat/tag/search). - * - * @return array - */ - function aksrt_widget_archive_area_ids(): array { - return [ - 'cat_top_fluid', - 'cat_top_content', - 'cat_bottom_content', - 'cat_bottom_fluid', - 'cat_sidebar', - 'tag_top_fluid', - 'tag_top_content', - 'tag_bottom_content', - 'tag_bottom_fluid', - 'tag_sidebar', - 'search_top_fluid', - 'search_top_content', - 'search_bottom_content', - 'search_bottom_fluid', - 'search_sidebar', - ]; - } -} - -if (!function_exists('aksrt_widget_homepage_area_ids')) { - /** - * Homepage widget zones for homepage-only widgets. - * - * @return array - */ - function aksrt_widget_homepage_area_ids(): array { - return [ - 'home_top_fluid', - 'home_top_content', - 'home_bottom_content', - 'home_bottom_fluid', - ]; - } -} - -if (!function_exists('aksrt_widget_single_area_ids')) { - /** - * Single post/page widget zones. - * - * @return array - */ - function aksrt_widget_single_area_ids(): array { - return [ - 'single_top_fluid', - 'single_top_content', - 'single_bottom_content', - 'single_bottom_fluid', - ]; - } -} - -if (!function_exists('aksrt_widget_base_from_id')) { - /** - * Get widget base id from a stored widget instance id. - */ - function aksrt_widget_base_from_id(string $widget_id): string { - return preg_replace('/-\d+$/', '', $widget_id) ?: $widget_id; - } -} - -if (!function_exists('aksrt_widget_allowed_sidebars')) { - /** - * Allowed sidebar ids for a widget base id. - * - * @return array - */ - function aksrt_widget_allowed_sidebars(string $widget_base_id): array { - $sidebar_only = [ - 'aksrt_categories', - 'aksrt_tag_cloud', - 'aksrt_hot_posts', - ]; - $homepage_only = [ - 'aksrt_category_recommend', - ]; - $hybrid = [ - 'aksrt_tab_posts', - 'aksrt_category_block', - 'aksrt_category_tabs', - ]; - - if (in_array($widget_base_id, $sidebar_only, true)) { - return aksrt_widget_sidebar_area_ids(); - } - - if (in_array($widget_base_id, $homepage_only, true)) { - return aksrt_widget_homepage_area_ids(); - } - - if (in_array($widget_base_id, $hybrid, true)) { - return array_values(array_unique(array_merge( - aksrt_widget_sidebar_area_ids(), - aksrt_widget_homepage_area_ids() - ))); - } - - if ($widget_base_id === 'aksrt_post_pay_box') { - return ['sidebar-article']; - } - - return []; - } -} - -if (!function_exists('aksrt_widget_is_allowed_in_sidebar')) { - /** - * Whether a widget base id can be assigned to the given sidebar id. - */ - function aksrt_widget_is_allowed_in_sidebar(string $widget_base_id, string $sidebar_id): bool { - if ($widget_base_id === '' || $sidebar_id === '') { - return true; - } - - if ($sidebar_id === 'wp_inactive_widgets' || strpos($sidebar_id, 'orphaned_widgets') === 0) { - return true; - } - - $allowed = aksrt_widget_allowed_sidebars($widget_base_id); - if (empty($allowed)) { - return true; - } - - return in_array($sidebar_id, $allowed, true); - } -} - -if (!function_exists('aksrt_widget_get_area_context')) { - /** - * Resolve widget area context from sidebar args. - */ - function aksrt_widget_get_area_context(array $args): string { - $sidebar_id = isset($args['id']) ? (string) $args['id'] : ''; - - if (in_array($sidebar_id, aksrt_widget_sidebar_area_ids(), true)) { - return 'sidebar'; - } - - if (in_array($sidebar_id, aksrt_widget_homepage_area_ids(), true)) { - return 'homepage'; - } - - if (in_array($sidebar_id, aksrt_widget_archive_area_ids(), true)) { - return 'archive'; - } - - if (in_array($sidebar_id, aksrt_widget_single_area_ids(), true)) { - return 'single'; - } - - return 'other'; - } -} - -if (!function_exists('aksrt_widget_render_location_help')) { - /** - * Render placement hint inside widget admin forms. - */ - function aksrt_widget_render_location_help(string $scope): void { - $messages = [ - 'sidebar' => __('仅限侧栏区域:首页侧栏、文章页侧边栏、全站侧栏、分类/标签/搜索侧栏。', 'aksrt'), - 'homepage' => __('仅限首页挂载区域:首页顶部/底部全宽、首页内容上方/下方。', 'aksrt'), - 'hybrid' => __('支持侧栏、首页和归档页挂载区域。', 'aksrt'), - 'archive' => __('仅限归档页挂载区域:分类页、标签页、搜索页的顶部/底部/侧栏。', 'aksrt'), - ]; - - if (empty($messages[$scope])) { - return; - } - - printf( - '

%s

', - esc_html($messages[$scope]) - ); - } -} - -if (!function_exists('aksrt_filter_widget_display_by_area')) { - /** - * Prevent widgets from rendering outside their allowed areas, - * and apply per-widget display rules (show_type, show_id_type/show_ids). - * - * @param array|false $instance Widget instance. - * @param WP_Widget $widget Widget object. - * @param array $args Sidebar args. - * @return array|false - */ - function aksrt_filter_widget_display_by_area($instance, WP_Widget $widget, array $args) { - $sidebar_id = isset($args['id']) ? (string) $args['id'] : ''; - $widget_base_id = isset($widget->id_base) ? (string) $widget->id_base : ''; - - if ($instance === false) { - return false; - } - - // Layer 1: Area legality check - if (!aksrt_widget_is_allowed_in_sidebar($widget_base_id, $sidebar_id)) { - return false; - } - - // Layer 2: Display rule check (show_type for PC/mobile) - if (is_array($instance) && function_exists('aksrt_widget_normalize_common')) { - $normalized = aksrt_widget_normalize_common($instance); - - // Show type: PC / mobile filter (Zibll only_pc / only_sm). - if ($normalized['show_type'] === 'only_pc' && wp_is_mobile()) { - return false; - } - if ($normalized['show_type'] === 'only_sm' && !wp_is_mobile()) { - return false; - } - - // Show IDs: whitelist / blacklist filter - if (!aksrt_widget_should_display_by_ids($normalized)) { - return false; - } - } - - return $instance; - } -} -add_filter('widget_display_callback', 'aksrt_filter_widget_display_by_area', 10, 3); - -if (!function_exists('aksrt_filter_widget_sidebar_assignments')) { - /** - * Move disallowed widget assignments back to the inactive widgets bucket. - * - * @param mixed $new_value New sidebars_widgets option value. - * @param mixed $old_value Previous option value. - * @return mixed - */ - function aksrt_filter_widget_sidebar_assignments($new_value, $old_value) { - if (!is_array($new_value)) { - return $new_value; - } - - $removed = []; - - foreach ($new_value as $sidebar_id => $widget_ids) { - if (!is_array($widget_ids) || $sidebar_id === 'wp_inactive_widgets') { - continue; - } - - $filtered = []; - foreach ($widget_ids as $widget_id) { - if (!is_string($widget_id) || $widget_id === '') { - continue; - } - - $widget_base_id = aksrt_widget_base_from_id($widget_id); - if (aksrt_widget_is_allowed_in_sidebar($widget_base_id, (string) $sidebar_id)) { - $filtered[] = $widget_id; - } else { - $removed[] = $widget_id; - } - } - - $new_value[$sidebar_id] = array_values($filtered); - } - - if (empty($removed)) { - return $new_value; - } - - if (!isset($new_value['wp_inactive_widgets']) || !is_array($new_value['wp_inactive_widgets'])) { - $new_value['wp_inactive_widgets'] = []; - } - - $assigned = []; - foreach ($new_value as $widget_ids) { - if (!is_array($widget_ids)) { - continue; - } - - foreach ($widget_ids as $widget_id) { - if (is_string($widget_id) && $widget_id !== '') { - $assigned[$widget_id] = true; - } - } - } - - foreach (array_values(array_unique($removed)) as $widget_id) { - if (!isset($assigned[$widget_id]) && !in_array($widget_id, $new_value['wp_inactive_widgets'], true)) { - $new_value['wp_inactive_widgets'][] = $widget_id; - } - } - - return $new_value; - } -} -add_filter('pre_update_option_sidebars_widgets', 'aksrt_filter_widget_sidebar_assignments', 10, 2); - /** * Register a block editor collection for AKSRT widgets. */ diff --git a/src/Widgets/ButtonsWidget.php b/src/Widgets/ButtonsWidget.php index 1b000775..d7b89b56 100644 --- a/src/Widgets/ButtonsWidget.php +++ b/src/Widgets/ButtonsWidget.php @@ -7,17 +7,15 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class ButtonsWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct('aksrt_buttons', esc_html__('AKSRT 按钮组', 'aksrt'), [ - 'description' => esc_html__('显示一组自定义按钮,支持外链跳转、色系与入场动画。', 'aksrt'), + 'description' => esc_html__('显示一组自定义按钮,支持外链跳转与色系。', 'aksrt'), 'classname' => 'widget_aksrt_buttons', ]); } @@ -60,8 +58,6 @@ class ButtonsWidget extends \WP_Widget { if (!in_array($m_pad, ['small', 'medium', 'large'], true)) { $m_pad = 'medium'; } - $anim = sanitize_key((string) ($instance['obs_animation'] ?? '')); - $anim_repeat = !empty($instance['animation_repeat']); $pc_width = max(0, min(400, (int) ($instance['pc_width'] ?? 0))); $m_width = max(0, min(400, (int) ($instance['m_width'] ?? 0))); @@ -74,7 +70,6 @@ class ButtonsWidget extends \WP_Widget { } $buts = ''; - $key = 0; foreach ($buttons as $btn) { if (!is_array($btn)) { continue; @@ -122,19 +117,13 @@ class ButtonsWidget extends \WP_Widget { $left_html = $icon_left !== '' ? ' ' : ''; $right_html = $icon_right !== '' ? ' ' : ''; - $anim_pack = function_exists('aksrt_obs_animate_attrs') - ? aksrt_obs_animate_attrs($anim, $anim_repeat, $key * 0.15) - : ['class' => '', 'attr' => '']; - $tgt = $target !== '' && strpos($url, 'javascript:') !== 0 ? ' target="' . esc_attr($target) . '" rel="noopener noreferrer"' : ''; - $buts .= '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - $buts .= '' + $buts .= ''; - $key++; } if ($buts === '') { @@ -192,17 +181,6 @@ class ButtonsWidget extends \WP_Widget {

-

- -

$btn) : ?>
" value="" placeholder=""> @@ -217,7 +195,6 @@ class ButtonsWidget extends \WP_Widget {
render_common_form_section($instance); } /** @@ -262,9 +239,7 @@ class ButtonsWidget extends \WP_Widget { 'm_padding' => in_array(($new_instance['m_padding'] ?? 'medium'), ['small', 'medium', 'large'], true) ? $new_instance['m_padding'] : 'medium', 'pc_width' => max(0, min(500, (int) ($new_instance['pc_width'] ?? 0))), 'm_width' => max(0, min(500, (int) ($new_instance['m_width'] ?? 0))), - 'obs_animation' => sanitize_key((string) ($new_instance['obs_animation'] ?? '')), - 'animation_repeat'=> !empty($new_instance['animation_repeat']) ? 1 : 0, 'buttons' => $buttons, - ]; return $this->update_common_fields($new_instance, $old_instance, $business); + ]; return $business; } } diff --git a/src/Widgets/CategoriesWidget.php b/src/Widgets/CategoriesWidget.php index e779def6..07a492d6 100644 --- a/src/Widgets/CategoriesWidget.php +++ b/src/Widgets/CategoriesWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class CategoriesWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct( @@ -179,14 +177,7 @@ class CategoriesWidget extends \WP_Widget { if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; - if ($affix['class'] !== '') { - echo '
'; - } echo self::render_html($instance); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - if ($affix['class'] !== '') { - echo '
'; - } echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } @@ -241,7 +232,6 @@ class CategoriesWidget extends \WP_Widget {

- render_common_form_section($instance); ?> update_common_fields($new_instance, $old_instance, [ + return [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'count' => max(1, min(50, (int) ($new_instance['count'] ?? 8))), 'orderby' => $orderby, @@ -268,6 +258,6 @@ class CategoriesWidget extends \WP_Widget { 'show_thumb' => !empty($new_instance['show_thumb']) ? 1 : 0, 'hide_empty' => !empty($new_instance['hide_empty']) ? 1 : 0, 'hierarchical' => !empty($new_instance['hierarchical']) ? 1 : 0, - ]); + ]; } } diff --git a/src/Widgets/CategoryBlockWidget.php b/src/Widgets/CategoryBlockWidget.php index 9a466718..815998b8 100644 --- a/src/Widgets/CategoryBlockWidget.php +++ b/src/Widgets/CategoryBlockWidget.php @@ -5,7 +5,6 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; @@ -313,7 +312,6 @@ if (!function_exists('aksrt_home_widget_get_lazyload_args')) { * Homepage category block widget. */ class CategoryBlockWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { @@ -490,7 +488,6 @@ class CategoryBlockWidget extends \WP_Widget {

render_common_form_section($instance); } public function update($new_instance, $old_instance): array { @@ -502,7 +499,7 @@ class CategoryBlockWidget extends \WP_Widget { 'layout' => aksrt_home_widget_resolve_layout($new_instance['layout'] ?? 'card', 'card'), 'show_more' => ! empty($new_instance['show_more']) ? 1 : 0, 'paginate' => in_array(sanitize_key((string) ($new_instance['paginate'] ?? 'none')), ['none', 'ajax', 'number'], true) ? sanitize_key((string) ($new_instance['paginate'] ?? 'none')) : 'none', - ]; return $this->update_common_fields($new_instance, $old_instance, $business); + ]; return $business; } public static function resolve_category_id_static(array $instance): int { diff --git a/src/Widgets/CategoryRecommendWidget.php b/src/Widgets/CategoryRecommendWidget.php index 88b8a3ac..985c9ea1 100644 --- a/src/Widgets/CategoryRecommendWidget.php +++ b/src/Widgets/CategoryRecommendWidget.php @@ -5,7 +5,6 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; @@ -13,7 +12,6 @@ defined('ABSPATH') || exit; * Homepage category recommend cards widget. */ class CategoryRecommendWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { @@ -198,7 +196,6 @@ class CategoryRecommendWidget extends \WP_Widget {

render_common_form_section($instance); } public function update($new_instance, $old_instance): array { @@ -211,7 +208,7 @@ class CategoryRecommendWidget extends \WP_Widget { 'show_description' => ! empty($new_instance['show_description']) ? 1 : 0, 'show_dates' => ! empty($new_instance['show_dates']) ? 1 : 0, 'show_more' => ! empty($new_instance['show_more']) ? 1 : 0, - ]; return $this->update_common_fields($new_instance, $old_instance, $business); + ]; return $business; } /** diff --git a/src/Widgets/CategoryTabsWidget.php b/src/Widgets/CategoryTabsWidget.php index 2ebb625e..86c7c6ef 100644 --- a/src/Widgets/CategoryTabsWidget.php +++ b/src/Widgets/CategoryTabsWidget.php @@ -5,7 +5,6 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; @@ -13,7 +12,6 @@ defined('ABSPATH') || exit; * Homepage category tabs widget. */ class CategoryTabsWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { @@ -161,7 +159,6 @@ public function form($instance): void {

render_common_form_section($instance); } public function update($new_instance, $old_instance): array { @@ -172,7 +169,7 @@ public function form($instance): void { 'columns' => max(1, min(4, absint($new_instance['columns'] ?? 3))), 'layout' => aksrt_home_widget_resolve_layout($new_instance['layout'] ?? 'card', 'card'), 'show_more' => ! empty($new_instance['show_more']) ? 1 : 0, - ]; return $this->update_common_fields($new_instance, $old_instance, $business); + ]; return $business; } /** diff --git a/src/Widgets/HotPostsWidget.php b/src/Widgets/HotPostsWidget.php index 69ce081a..1a559e9b 100644 --- a/src/Widgets/HotPostsWidget.php +++ b/src/Widgets/HotPostsWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class HotPostsWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct( @@ -209,12 +207,10 @@ class HotPostsWidget extends \WP_Widget { if ($title) { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; $instance['paginate'] = sanitize_key((string) ($instance['paginate'] ?? 'ajax')); $payload = self::query_payload($instance, 1); $rest = rest_url('aksrt/v1/widgets/hot-posts'); - $wrap = 'ajaxpager' . $affix['class']; - echo '
'; + echo '
'; echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $payload['paginate_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; @@ -263,12 +259,11 @@ class HotPostsWidget extends \WP_Widget {

- render_common_form_section($instance); ?> update_common_fields($new_instance, $old_instance, [ + return [ 'title' => sanitize_text_field($new_instance['title'] ?? ''), 'count' => absint($new_instance['count'] ?? 5), 'order_by' => in_array($new_instance['order_by'] ?? '', ['views', 'comments', 'likes', 'favorites', 'downloads'], true) ? $new_instance['order_by'] : 'views', @@ -276,6 +271,6 @@ class HotPostsWidget extends \WP_Widget { 'show_thumb' => !empty($new_instance['show_thumb']) ? 1 : 0, 'target_blank' => !empty($new_instance['target_blank']) ? 1 : 0, 'paginate' => in_array(sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')), ['none', 'ajax', 'number'], true) ? sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')) : 'ajax', - ]); + ]; } } diff --git a/src/Widgets/IconCardsWidget.php b/src/Widgets/IconCardsWidget.php index 1d573ff5..a2490125 100644 --- a/src/Widgets/IconCardsWidget.php +++ b/src/Widgets/IconCardsWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class IconCardsWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { @@ -45,8 +43,6 @@ class IconCardsWidget extends \WP_Widget { $show_bg = !isset($instance['show_widget_bg']) || !empty($instance['show_widget_bg']); $icon_size = max(0, min(64, (int) ($instance['icon_size'] ?? $instance['size'] ?? 0))); $icon_radius = !empty($instance['icon_radius']); - $anim = sanitize_key((string) ($instance['obs_animation'] ?? '')); - $anim_repeat = !empty($instance['animation_repeat']); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); @@ -64,7 +60,6 @@ class IconCardsWidget extends \WP_Widget { echo '
'; } - $idx = 0; foreach ($cards as $card) { $url = (string) ($card['url'] ?? ''); if ($url !== '' && $go_link && function_exists('aksrt_go_link')) { @@ -86,24 +81,17 @@ class IconCardsWidget extends \WP_Widget { ], ]; - $anim_pack = function_exists('aksrt_obs_animate_attrs') - ? aksrt_obs_animate_attrs($anim, $anim_repeat, $idx * 0.08) - : ['class' => '', 'attr' => '']; - if ($is_row) { - echo '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } elseif ($anim_pack['class'] !== '') { - echo '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } if (function_exists('aksrt_icon_card')) { echo aksrt_icon_card($card_args); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - if ($is_row || $anim_pack['class'] !== '') { + if ($is_row) { echo '
'; } - $idx++; } if ($is_row) { @@ -197,7 +185,6 @@ class IconCardsWidget extends \WP_Widget { " value="" placeholder="">
render_common_form_section($instance); } /** @@ -213,8 +200,7 @@ class IconCardsWidget extends \WP_Widget { 'go_link' => !empty($new_instance['go_link']) ? 1 : 0, 'show_widget_bg' => !empty($new_instance['show_widget_bg']) ? 1 : 0, 'icon_radius' => !empty($new_instance['icon_radius']) ? 1 : 0, - 'obs_animation' => sanitize_key((string) ($new_instance['obs_animation'] ?? '')), 'cards' => $this->normalize($new_instance['cards'] ?? []), - ]; return $this->update_common_fields($new_instance, $old_instance, $business); + ]; return $business; } } diff --git a/src/Widgets/NoticeWidget.php b/src/Widgets/NoticeWidget.php index a88c67f4..e76541fd 100644 --- a/src/Widgets/NoticeWidget.php +++ b/src/Widgets/NoticeWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class NoticeWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct('aksrt_notice', esc_html__('AKSRT 滚动公告', 'aksrt'), [ @@ -39,7 +37,6 @@ if (!$items) { $radius = !empty($instance['radius']); $interval = max(2, min(15, (int) ($instance['interval'] ?? 4))); $align = sanitize_html_class((string) ($instance['alignment'] ?? '')); - $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); @@ -54,9 +51,7 @@ if (!$items) { if ($align !== '') { $wrap_cls .= ' ' . $align; } - $wrap_cls .= $affix['class']; - - echo '
'; + echo '
'; echo '
'; // Prefer shared vertical new-swiper (zib_notice parity) via slider.js Type C. @@ -194,12 +189,11 @@ if (!$items) {

- render_common_form_section($instance); ?> update_common_fields($new_instance, $old_instance, [ + return [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'items' => $this->normalize_items(['items' => $new_instance['items'] ?? []]), 'interval' => max(2, min(15, (int) ($new_instance['interval'] ?? 4))), @@ -207,6 +201,6 @@ if (!$items) { 'alignment' => sanitize_html_class((string) ($new_instance['alignment'] ?? '')), 'blank' => !empty($new_instance['blank']) ? 1 : 0, 'radius' => !empty($new_instance['radius']) ? 1 : 0, - ]); + ]; } } diff --git a/src/Widgets/RecentCommentsWidget.php b/src/Widgets/RecentCommentsWidget.php index 2677750e..94efa233 100644 --- a/src/Widgets/RecentCommentsWidget.php +++ b/src/Widgets/RecentCommentsWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class RecentCommentsWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct('aksrt_recent_comments', esc_html__('AKSRT 最新评论', 'aksrt'), [ @@ -162,14 +160,7 @@ class RecentCommentsWidget extends \WP_Widget { if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; - if ($affix['class'] !== '') { - echo '
'; - } echo self::render_html($instance); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - if ($affix['class'] !== '') { - echo '
'; - } echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } @@ -202,7 +193,6 @@ class RecentCommentsWidget extends \WP_Widget {

- render_common_form_section($instance); ?> */ public function update($new_instance, $old_instance): array { - return $this->update_common_fields($new_instance, $old_instance, [ + return [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'count' => max(1, min(50, (int) ($new_instance['count'] ?? 5))), 'show_avatar' => !empty($new_instance['show_avatar']) ? 1 : 0, 'outpost' => sanitize_text_field((string) ($new_instance['outpost'] ?? '')), 'outer' => sanitize_text_field((string) ($new_instance['outer'] ?? '')), 'outer_keywords' => sanitize_text_field((string) ($new_instance['outer_keywords'] ?? '')), - ]); + ]; } } diff --git a/src/Widgets/SearchWidget.php b/src/Widgets/SearchWidget.php index affd5456..6f9ca2ee 100644 --- a/src/Widgets/SearchWidget.php +++ b/src/Widgets/SearchWidget.php @@ -7,12 +7,10 @@ namespace AKSRT\Widgets; -use AKSRT\Widgets\Traits\CommonWidgetFields; defined('ABSPATH') || exit; class SearchWidget extends \WP_Widget { - use CommonWidgetFields; public function __construct() { parent::__construct('aksrt_search', esc_html__('AKSRT 搜索', 'aksrt'), [ @@ -35,9 +33,6 @@ class SearchWidget extends \WP_Widget { $show_kw = !empty($instance['show_keywords']); $kw_title = sanitize_text_field((string) ($instance['keywords_title'] ?? __('热门搜索', 'aksrt'))); $keyword_limit = max(1, min(50, (int) ($instance['keyword_limit'] ?? 12))); - // Affix helper (shared layer sidebar_affix). - $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; - $search_type = function_exists('aksrt_get_default_search_type') ? aksrt_get_default_search_type() : 'post'; @@ -71,7 +66,7 @@ class SearchWidget extends \WP_Widget { $uid = 'aksrt-sw-' . esc_attr($this->id); ?> -