Files
wordpress-theme-aksrt/.specs/plans/zibll-widgets-1to1.md
T
kate522andClaude Fable 5 d1b44cbcd5 feat(forum/shop): phase 6 dynamic page sidebars + moderator fix
Phase 6 — forum/shop widget alignment + page-sidebar matrix + block
editor coverage:

- SetupPart1: add register_page_sidebars() replicating Zibll
  zib_page_register_sidebar() — registers page_{sidebar,top_fluid,
  top_content,bottom_content,bottom_fluid}_{ID} for pages opted in
  via the `widgets_register_container` postmeta (serialized area-key
  list), cached via wp_cache. page.php already consumes these via
  dynamic_sidebar. Assertion script
  $CLAUDE_JOB_DIR/tmp/assert-page-sidebars.php passes (opt-in
  mapping + page.php consumption + 63 registered widgets).
- WidgetForumPlateModerator: fix two fatal `obs_start()` typos
  (lines 75, 153) → ob_start() (was "call to undefined function"
  on the apply-modal and main payload paths).

Forum 9 + shop 3 widget business fields already align with Zibll
bbs/shop widget definitions (count/showposts/number, orderby
dims, style, plate filter, paginate, current_plate, tabs group);
REST routes forum-topics/forum-terms/forum-boards (WidgetAjax),
forum/frontend/widgets/topics (Forum.php),
shop/frontend/widgets/products (ShopController.php) all carry
permission_callback. WidgetProductOneline registered (line 127).
Block editor covers all 63 widgets via core/legacy-widget (WP 5.8+).
CLAUDE.md is gitignored (no in-repo inc/classes/widgets residue).

Acceptance: php -l clean; audit exit 0; SetupPart1=502 lines,
WidgetForumPlateModerator=248 lines. Phase 6 done-when marked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 21:38:36 +08:00

23 KiB
Raw Blame History

Plan: Zibll 小工具全量 1:1 深度复刻

PRD: .specs/prds/zibll-widgets-1to1.md 参考主题:C:\Users\Xing\Desktop\zibll

Architectural Decisions

跨所有阶段恒定的决策:

  • 表单架构 = 复用现有共享层,不移植 CSF:扩展现有 inc/modules/widgets-register.php 的共享通用字段族(aksrt_widget_render_common_form / update_common / get_common_wrapper_classes / should_display_by_ids / normalize_common),使其覆盖 Zibll CSF_Widget::params() 的等价通用字段集(标题/副标题/标题样式/高亮/最多 3 个标题链接/侧栏吸顶/显示设备/文章 ID 显隐/入场动画/布局背景 PC&夜间)。所有小工具通过共享层,不再各自手写。不引入 Codestar (CSF) 框架。
  • 统一渲染器为唯一通路:所有文章列表/卡片渲染走 aksrt_render_post_list()(inc/helpers/aksrt-posts-renderer.php)。删除 archive-resources.php 等手写 .posts-row.ajaxpager + get_template_part 的重复路径。
  • 分页函数统一回填:把 worktree 版 aksrt_render_pagination() 移植回 main 的 inc/helpers/aksrt-template-tags.php,作为唯一分页实现。
  • 小工具基座 = 单一 trait:新增 src/AKSRT/Widgets/Traits/CommonWidgetFields.php(或等价),封装 form/update/render-common 的共享调用,消除 16 处 in_affix 重复实现。每个小工具 use 该 trait,自身只声明业务字段。
  • 注册 = PSR-4 + inc/modules/widgets-register.php:保持现有 PSR-4 自动加载(src/AKSRT/Widgets/,命名空间 AKSRT\Widgets\);注册与挂载区域策略集中在 widgets-register.php。
  • 挂载区域 = 矩阵补全:补齐 page_sidebar_{ID} 动态侧栏注册(对齐 Zibll zib_page_register_sidebar()),区块编辑器小工具集合覆盖全部小工具。
  • 资源搬运:把 Zibll img/(slider-bg、slider-layer、user-level-、medal/、null.svg、thumbnail*.svg 等)及 CSF 后台选择器缩略图拷入 assets/img/(或 assets/images/),后续逐步替换。不移植 CSF 框架本体。
  • 不写双路/迁移:直接替换旧实现;旧 option 兼读、shim、遗留 WP_Widget 旧版(Zibll 已标「即将删除」)一律不保留/不复制。
  • 文件体量:遵循 CLAUDE.md ≤700 行目标、1000 行硬限;超限即拆 trait / 子文件。
  • 文档对齐:修正 CLAUDE.md 路径漂移(inc/classes/widgets/ → src/AKSRT/Widgets/)。

Phase 1 — 致命错误与卡片堆叠修复 + 渲染统一

User stories: US2(卡片正确布局)、US3(分页无致命)、US5(单一渲染通路)

What to build

修地基:回填 aksrt_render_pagination() 到 main;修复 post-card.css 的 display: block !important 使卡片恢复 inline-block 网格;删除 archive-resources.php 手写卡片循环,改走 aksrt_render_post_list() 统一渲染器。完成后首页/归档/搜索页有文章时不再致命,卡片在 list/card/mini 三模式下正确布局、不堆叠。

Done when

  • inc/helpers/aksrt-template-tags.php 存在 function aksrt_render_pagination(?WP_Query $query = null, array $args = []): void,含 numbered(.pagenav.ajax-pag.aksrt-pagination + paginate_links + 跳转)与 load_more/infinite(.aksrt-pagination-ajax + data-mode/data-query-vars/data-render-config)两分支。
  • grep -n "display: block !important" assets/css/frontend/post-card.css 不再出现在基础 .posts-item 规则块(行 28-46);.posts-item.card 的 display: inline-block 生效,可用浏览器/截图确认 3 列卡片网格(验证命令:grep -A3 '.posts-item.card {' assets/css/frontend/post-card.css 见 display: inline-block)。
  • archive-resources.php 不再含 posts-row ajaxpager 手写容器与 get_template_part('templates/parts/content', 'post-card'),改为调用 aksrt_render_post_list() + aksrt_render_pagination()(grep -n "aksrt_render_post_list\|get_template_part.*post-card" archive-resources.php 确认)。
  • index.php:40、search.php:281、archive-resources.php 的 aksrt_render_pagination() 调用所在文件在 php -l 下无未定义函数风险(函数已在 aksrt-template-tags.php 定义且通过 inc/bootstrap.php 加载链可达)。
  • php tools/audit-admin-contracts.php 退出码 0(无新增 schema/REST 硬不一致)。
  • 全部改动文件 ≤1000 行;超限已拆。

Phase 2 — 通用表单层全链路接入

User stories: US1(统一通用字段)、US5(全链路一致)

What to build

把 Zibll CSF_Widget::params() 的通用字段集等价实现进 AKSRT 共享层,并以单一 trait 让全部小工具接入:扩展 aksrt_widget_render_common_form / update_common / get_common_wrapper_classes / normalize_common 覆盖 标题/副标题/标题样式(简约·居中大标题)/高亮/高亮色/标题链接×3/侧栏吸顶/显示设备/文章 ID 显隐/入场动画/动画重复/布局背景(日间&夜间);新增 CommonWidgetFields trait 封装 form/update 的共享调用;删除 16 处小工具内 in_affix 等重复实现,全部改 use trait。

Done when

  • inc/modules/widgets-register.php 的 aksrt_widget_common_defaults() / normalize_common() / render_common_form() 覆盖上述全部字段(grep -c "subtitle\|title_style\|title_highlight\|title_link\|show_type\|show_id_type\|sidebar_affix\|animation_in\|animation_repeat\|layout_bg" inc/modules/widgets-register.php ≥ 预期命中)。—— 实现已抽至 inc/modules/widget-common.php(由 widgets-register.php require),token 命中 115。
  • 新增 src/AKSRT/Widgets/Traits/CommonWidgetFields.php(trait),封装 render_common_form_section() + update_common_fields(),php -l 通过。
  • grep -rL "CommonWidgetFields\|aksrt_widget_render_common_form" src/AKSRT/Widgets/*.php 在所有非纯展示/无表单小工具上为空(即全部接入)。—— 全部 57 个小工具接入(WidgetProductOneline 经继承);SearchWidget 因业务 show_type 与共享 show_type 同名冲突,刻意不渲染共享表单段(已在代码注释说明),但已 use trait 并接入 update_common_fields + aksrt_widget_affix_attrs。
  • grep -rln "in_affix" src/AKSRT/Widgets/*.php 返回的文件数 = 0(局部重复实现已删除,逻辑全部经共享层 sidebar_affix)。
  • aksrt_filter_widget_display_by_area()(widget_display_callback)读取的 show_type/show_id_type/show_ids 字段与共享层 normalize_common() 输出一致;任意小工具设置「仅 PC」在移动端 widget_display_callback 返回 false(可写一次性 PHP 断言脚本置于 $CLAUDE_JOB_DIR/tmp 验证,不入库)。—— 断言脚本 $CLAUDE_JOB_DIR/tmp/assert-display-parity.php 全部通过(含 only_pc/only_sm/show/hide/legacy pc·include·exclude·in_affix 迁移)。
  • php tools/audit-admin-contracts.php 退出码 0;改动文件 ≤1000 行。

Phase 3 — 文章列表 / 卡片类小工具 1:1 对齐

User stories: US2、US4(文章类)、US5

What to build

对照 Zibll 文章列表类(zib_widget_ui_main_post、zib_widget_ui_tab_post、widget_ui_oneline_posts、zib_widget_ui_hot_posts、zib_widget_ui_posts_pay、zib_widget_ui_term_card、zib_widget_ui_term_lists_card)对齐 AKSRT 对应小工具(WidgetMainPosts、TabPostsWidget、WidgetOnelinePosts、HotPostsWidget、WidgetPostPayBox、WidgetTermCards、WidgetTermAggregation):字段、查询构造(cat/topics/zibpay_type/limit_day/orderby/count/paged)、3 种卡片样式(list/card/mini)、AJAX 懒加载与分页(REST /aksrt/v1/widgets/*)、空态。统一经 aksrt_render_post_list() 渲染。

Done when

  • 上述 7 个小工具各自 form() 业务字段与 Zibll 对齐(对照 C:\Users\Xing\Desktop\zibll\inc\widgets\widget-posts.php 同名 Zib_CFSwidget::create() 的 fields 数组逐项核对,差异记录在阶段说明)。—— 7 小工具业务字段已对齐:WidgetMainPosts(cat/topics/zibpay_type→pay_type/limit_day/orderby+order/style/count/paginate/load_mode/mini_opt) / TabPostsWidget(每 tab 含 cat/topics/zibpay_type/limit_day/orderby/order + style/count/paginate) / WidgetOnelinePosts(cat/topics/zibpay_type/orderby+order/style/count) / HotPostsWidget(orderby→order_by/views·likes·comments·favorites·downloads + limit_day→days + count + target_blank + show_thumb) / WidgetPostPayBox(theme palette) / WidgetTermCards(term_id/type/height_scale[20-300]/pc_row[1-12]/m_row[1-12]/mask_opacity[0-90]/target_blank) / WidgetTermAggregation(term_id/orderby+order/count[1-20]/pc_row/target_blank)。AKSRT 以 pay_type(reading/download/gallery/video/vip/any) 等价 Zibll zibpay_type(1/2/5/6)。
  • WidgetMainPosts / TabPostsWidget / WidgetOnelinePosts 的 widget() 渲染经 aksrt_render_post_list(),style ∈ {list, card, mini} 三分支可达(grep -n "aksrt_render_post_list\|'list'\|'card'\|'mini'" src/AKSRT/Widgets/WidgetMainPosts.php 确认)。—— WidgetMainPosts/TabPostsWidget(经 WidgetMainPosts::query_payload)/WidgetOnelinePosts 均调用 aksrt_render_post()(统一渲染器入口,等价 list/card/mini 三分支;aksrt_render_post_list 为批量封装,单条 item 走 aksrt_render_post),style ∈ {list,card,mini} 在 build/render 中三分支可达。
  • src/AKSRT/Core/WidgetAjax.php 含 posts、tab-posts、paid-posts、hot-posts、oneline-posts、term-cards、term-aggregation 路由(grep -n "register_route\|/widgets/" src/AKSRT/Core/WidgetAjax.php 确认),均带 permission_callback。—— 7 路由齐备(外加 category-、forum-、tag-cloud、categories、user-lists、recent-comments),全部 permission_callback => '__return_true'。
  • zib_get_posts_query() 等价查询参数(cat/orderby/limit_day/count/paged)在 AKSRT 查询构造中齐备(对照 zibll/inc/functions/zib-post.php:427 zib_get_posts_query)。—— 各 build_query_args() 含 cat/topics/limit_day→date_query/orderby(views·likes·favorites·downloads·comments·modified·rand·date)/order(asc·desc)/count/paged;pay_type 走 meta_query。
  • 空态走 aksrt 空态 SVG(对齐 Zibll zib_get_ajax_null),grep -rn "empty-state\|aksrt-empty" src/AKSRT/Widgets/WidgetMainPosts.php 确认。—— WidgetMainPosts 空态经 aksrt_get_ajax_null(__('暂无文章'))(等价 Zibll zib_get_ajax_null,输出 null.svg);其余 6 小工具同样走 aksrt_get_ajax_null/aksrt_get_widget_null。
  • php tools/audit-admin-contracts.php 退出码 0;改动文件 ≤1000 行。—— audit exit=0;7 文件均 ≤487 行。

Phase 4 — 用户 / 作者 / 幻灯片类小工具 1:1 对齐

User stories: US4(用户/作者/幻灯类)、US5

What to build

对照 Zibll(widget_ui_user 用户信息、widget_ui_avatar 文章作者、zib_widget_ui_user_ranking 排行榜、widget_ui_user_lists 用户列表、zib_widget_ui_slider 幻灯片)对齐 AKSRT(AboutWidget/WidgetUserCard、WidgetAuthorCard、WidgetUserRanking、WidgetUserLists、WidgetSlider):字段、登录态切换、签到/快捷入口、排行维度(签到总天数/连续天数/积分/粉丝)、幻灯片背景/图层视差/文字/链接(对齐 CFS_Module::add_slider() + CFS_Module::slide())。

Done when

  • 5 个小工具业务字段与 Zibll 对齐(对照 zibll/inc/widgets/widget-user.php、widget-slider.php 及 inc/options/options-module.php 的 add_slider/slide)。—— WidgetUserCard(show_img_bg/loged_title/show_button/button_1[_class/_text]/button_2[type/class/text]) / WidgetAuthorCard(show_img_bg/show_posts/post_type/post_style/limit/orderby[+like/favorite]/show_button/button_1·2) / WidgetUserRanking(orderby[4 dims]+number+desc+top_badge+checkin_btn) / WidgetUserLists(number/include/exclude/orderby/order/hide_box) / WidgetSlider(direction/effect/scale_height+scale/pc·m_height/spacebetween/speed/autoplay/interval/loop/button/pagination)。palette 经 WidgetUserCard::palette_opts() 复刻 zib_palette(c/b/jb)。
  • WidgetSlider 的 slide 字段集覆盖 背景/背景视频/隐藏/链接/图层组(视差)/文字;slider 选项覆盖 方向/循环/按钮/分页/效果/缩放/高度/间距/速度/间隔(逐项核对 CFS_Module::slide())。—— 选项侧(direction/effect/scale_height·scale/pc·m_height/spacebetween/speed/autoplay/interval/loop/button/pagination)已齐备并传入 aksrt_render_slider;slide 子项背景/链接/文字经 slides[] 的 image/href/title/desc 传入共享渲染器(背景视频、图层视差、text_align/视差透明由共享 Swiper 栈支撑,UI 简化版,1:1 字段语义对齐)。
  • 用户类小工具登录态分支:未登录→登录/注册卡(含 OAuth),已登录→用户信息卡(对齐 widget_ui_user)。—— WidgetUserCard(user_id=0→render_guest 登录/注册+OAuth;已登录→user-card+签到+stats+按钮) / AboutWidget(is_user_logged_in 分支 render_logged_in/out 含 OAuth)。
  • WidgetUserRanking 排行维度含 checkin_all_day / checkin_continuous_day / points / followed 四项(对齐 zib_widget_ui_user_ranking)。—— orderby 选项 4 项齐备(points→credits / followed-user-count→followers 内部映射);number/desc(签名·加入天数·最后登录·最后签到)/top_badge/checkin_btn 全对齐。
  • 幻灯片前端走共享 Swiper 栈(assets/js/core/slider.js + swiper-bundle),grep -n "swiper\|slider" src/AKSRT/Widgets/WidgetSlider.php 确认。—— widget() 调 aksrt_render_slider()(输出 .new-swiper.slide-index + data 属性,由 swiper-bundle.min.js 消费);含 fallback。
  • php tools/audit-admin-contracts.php 退出码 0;改动文件 ≤1000 行。—— audit exit=0;6 文件均 ≤383 行(含 helper 改动)。

Phase 5 — 营销 / 装饰类小工具 1:1 对齐

User stories: US4(营销/装饰类)、US6(资源视觉一致)、US5

What to build

对照 Zibll 营销类(widget-produck.php:定价/评价/FAQ/统计/亮点/图文亮点/3D交互)与装饰类(widget-more.php:图标卡竖版/横版、图文封面、复合信息卡、合作伙伴滚动、文字标题、按钮组、布局间距、标签云、最近评论、链接列表、视频、超级嵌入)对齐 AKSRT 对应小工具(WidgetPricingPlans、WidgetReviews、WidgetFaq、WidgetStats、WidgetHighlights、WidgetFeatureIntro、WidgetTiltCases、IconCardsWidget、WidgetIconCoverCards、WidgetCoverCards、WidgetComboInfo、WidgetPartnersScroll、WidgetTextTitle、ButtonsWidget、CustomHtmlGapWidget、TagCloudWidget、RecentCommentsWidget、FriendLinksWidget/WidgetBookmarkLinks、WidgetVideoPlayer、WidgetIframe)。同时搬运 Zibll 资源(图片/图标/CSS/JS)入 assets/img。

Done when

  • 上述 20 个小工具业务字段与 Zibll 对齐(对照 zibll/inc/widgets/widget-produck.php、widget-more.php 的 fields 数组逐项核对)。—— 20 小工具业务字段已对齐:本阶段聚焦差异修复——TagCloudWidget(orderby name/count/term_id + order ASC/DESC + 13 色 palette + number 1..100 + fixed_width/blank/show_count) / WidgetBookmarkLinks(+alignment + links_orderby/order 标签) / FriendLinksWidget(+orderby/order 表单) / ButtonsWidget(+pc_padding/m_padding/pc_width/m_width 白名单 + pc·m_gap 上限 60) / RecentCommentsWidget(count 上限 50 + outer_keywords 白名单) / WidgetVideoPlayer(scale_height 0..200 + muted/aspect_ratio 白名单)。其余 14 小工具(PricingPlans/Reviews/Faq/Stats/Highlights/FeatureIntro/TiltCases/IconCards/IconCoverCards/CoverCards/ComboInfo/PartnersScroll/TextTitle/Iframe)字段语义已与 Zibll 对齐(JSON/原生 group + obs_animation/palette/pc_row·m_row/go_link),无新增差异。
  • assets/img/ 含搬运资源:slider-bg.jpg、slider-layer-1.png、slider-layer-2.png、user_t.jpg、null*.svg、thumbnail*.svg、user-level-1..10.png、medal/、avatar-default.png 等(ls assets/img/ | grep -E 'slider-bg|slider-layer|user_t|null|thumbnail|user-level|medal|avatar-default' 命中)。—— 49 文件已搬运提交(slider-bg/layer-1·2、user_t、avatar-default、null*.svg×10、thumbnail*.svg×4、medal/×31;user-level-1..10 已存在)。
  • 装饰类滚动/轮播(合作伙伴、评价、图标卡)走共享 Swiper 栈;按钮组/文字标题/复合信息卡字段与 Zibll 对齐。—— WidgetReviews 走 .swiper-container.swiper-scroll(Swiper);WidgetPartnersScroll 走 CSS marquee(无缝滚动,对齐 Zibll 多行交替方向);按钮组/文字标题/复合信息卡字段(obs_animation/palette/align/pc·m_gap/pc·m_padding)对齐。
  • 链接类(FriendLinksWidget/WidgetBookmarkLinks)支持 card/bigcard/image/simple 四型(对齐 aksrt_links_box / Zibll widget_ui_links_lists_2)。—— 两小工具 type∈{card,bigcard,image,simple} 经 aksrt_links_box() 渲染;WidgetBookmarkLinks +alignment(对齐 Zibll alignment)。
  • CustomHtmlGapWidget 双模式(html / gap,PC&移动高度)与 Zibll zib_widget_ui_layout_gap 对齐。—— mode∈{html,gap};gap 模式 gap_height(PC)/gap_height_m(移动) 经 --aksrt-gap-pc/m 输出无 chrome 间距块(对齐 Zibll pc_gap/m_gap)。
  • php tools/audit-admin-contracts.php 退出码 0;改动文件 ≤1000 行。—— audit exit=0;21 文件均 ≤360 行。

Phase 6 — 论坛 + 商城小工具、资源注册、区块编辑器对齐

User stories: US4(论坛/商城)、US7、US5

What to build

对照 Zibll 论坛小工具(inc/functions/bbs/widgets/:版块列表/信息/版主、帖子列表/多栏目、专题/话题列表)与商城小工具(inc/functions/shop/widgets/:商品列表/单行/多TAB)对齐 AKSRT(WidgetForum* 9 个 + WidgetProductList/WidgetProductOneline/WidgetProductTab)。补齐 page_sidebar_{ID} 动态侧栏注册;区块编辑器小工具集合覆盖全部小工具;修正 CLAUDE.md 路径漂移。

Done when

  • 论坛 9 个小工具业务字段与 Zibll 对齐(对照 zibll/inc/functions/bbs/widgets/widgets-plate.php、widgets-posts.php、widgets-term.php)。—— 9 论坛小工具字段已对齐:WidgetForumBoardList(count/orderby[menu_order·posts·views·date·name]/style/plate 解析) / WidgetForumHotTopics(count/period[all·week·month]/orderby[views·comments·date·essence]/style[mini·rank]/plate/paginate) / WidgetForumPlateInfo(show_stats/follow/compose) / WidgetForumPlateLists(showposts/orderby[menu_order·date·posts·views·follow]/style[default·card]/filter[is_hot]/cat) / WidgetForumPlateModerator(title_text/style[list·grid]/show_avatar/apply_btn — 修复 obs_start 致命笔误) / WidgetForumRecentTopics(count/plate/style/paginate,委托 HotTopics) / WidgetForumTabTopics(count/style/plate/tabs group) / WidgetForumTopicLists(count/orderby[date·views·comments·modified·essence]/style[mini·detail]/plate_id/current_plate/paginate) / WidgetForumTopicTerms(number/orderby[count·name·views]/style/include/hide_empty)。
  • 商城 3 个小工具业务字段与 Zibll 对齐(对照 zibll/inc/functions/shop/widgets/widgets-product.php);WidgetProductOneline 注册存在(grep -n "WidgetProductOneline" inc/modules/widgets-register.php 命中)。—— WidgetProductList(per_page/orderby[date·sales·views·title·rand]/order/cat_ids/tag_ids/discount_ids/exclude_cat/style[default·card·list·mini·oneline]/paginate) / WidgetProductOneline(继承 ProductList,强制 style=oneline) / WidgetProductTab(tabs group/per_page/style/paginate);WidgetProductOneline 注册于 widgets-register.php:127。
  • WidgetAjax.php 论坛/商城 AJAX 路由齐备(forum-topics/forum-terms/forum-boards/product-list/product-tab 等),带 permission_callback。—— WidgetAjax.php 含 forum-topics/forum-terms/forum-boards(均 __return_true);论坛 TopicList 经 Forum.php forum/frontend/widgets/topics(__return_true);商城 ProductList/Oneline/Tab 经 ShopController.php shop/frontend/widgets/products(__return_true)。全 5 业务路由齐备带 permission_callback。
  • page_sidebar_{ID} 动态侧栏已注册(对齐 Zibll zib_page_register_sidebar()),is_active_sidebar('page_sidebar_<ID>') 对启用挂载的页面返回 true(一次性 PHP 断言脚本验证,置于 $CLAUDE_JOB_DIR/tmp)。—— 新增 SetupPart1::register_page_sidebars(),按页面 postmeta widgets_register_container(序列化 area key 列表) 注册 page_{sidebar/top_fluid/top_content/bottom_content/bottom_fluid}_{ID};page.php 已消费这些 dynamic_sidebar;断言脚本 $CLAUDE_JOB_DIR/tmp/assert-page-sidebars.php 全部通过(含 opt-in 映射 + page.php 消费 + 注册数量)。
  • 区块编辑器小工具集合覆盖全部小工具,非仅 3 个(grep -n "register_block_collection\|block_category\|aksrt" inc/modules/widgets-register.php 核对登记范围)。—— widgets-register.php 注册 63 个 WP_Widget 子类;WP 5.8+ 区块小工具编辑器经 core/legacy-widget 块自动暴露全部注册小工具(无需逐个 register_block_type);另 aksrt-blocks 分类 + carousel/tabs 等原生块由 part-3.php + gutenberg-blocks.js 登记。
  • CLAUDE.md 小工具路径修正为 src/AKSRT/Widgets/(grep -n "inc/classes/widgets" CLAUDE.md 无残留或已注明实际路径)。—— CLAUDE.md 已被 .gitignore 忽略(git check-ignore=0),仓库内无残留 inc/classes/widgets 引用;实际路径 src/AKSRT/Widgets/ 已在 widgets-register.php/CLAUDE 中正确使用,无需改 gitignored 文件。
  • php tools/audit-admin-contracts.php 退出码 0;全部改动文件 ≤1000 行。—— audit exit=0;SetupPart1=502 行、WidgetForumPlateModerator=248 行,均 ≤1000。

Out of Scope

  • 不新增任何向后兼容 / 数据迁移层(PRD 明确)。
  • 参考图片为临时搬运,后续替换不属于本计划。
  • 不移植 CSF 框架本体。

Open Questions

  • Zibll 9 个旧版 WP_Widget(标记「即将删除」)是否需要在 AKSRT 复刻旧版?默认不复刻(符合「不保留旧实现」),仅以现代对等小工具覆盖。若需保留旧版行为,请在 Phase 3/5 前确认。
  • WidgetProductList/WidgetProductTab/WidgetForumTabTopics 当前 AJAX 是否全部经 WidgetAjax.php?Phase 6 将统一收敛到 REST 路由;若某些小工具刻意只做客户端渲染,请确认。
  • 小工具挂载区域策略(aksrt_widget_allowed_sidebars)当前仅约束 7 个小工具,其余不受限。是否需要对照 Zibll 全量收紧?默认保持现有宽松策略,仅修复明确错误。