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>
23 KiB
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),使其覆盖 ZibllCSF_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}动态侧栏注册(对齐 Zibllzib_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同名冲突,刻意不渲染共享表单段(已在代码注释说明),但已usetrait 并接入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) 等价 Zibllzibpay_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(对齐 Zibllzib_get_ajax_null),grep -rn "empty-state\|aksrt-empty" src/AKSRT/Widgets/WidgetMainPosts.php确认。—— WidgetMainPosts 空态经aksrt_get_ajax_null(__('暂无文章'))(等价 Zibllzib_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/ Zibllwidget_ui_links_lists_2)。—— 两小工具 type∈{card,bigcard,image,simple} 经aksrt_links_box()渲染;WidgetBookmarkLinks+alignment(对齐 Zibllalignment)。 CustomHtmlGapWidget双模式(html / gap,PC&移动高度)与 Zibllzib_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.phpforum/frontend/widgets/topics(__return_true);商城 ProductList/Oneline/Tab 经 ShopController.phpshop/frontend/widgets/products(__return_true)。全 5 业务路由齐备带 permission_callback。page_sidebar_{ID}动态侧栏已注册(对齐 Zibllzib_page_register_sidebar()),is_active_sidebar('page_sidebar_<ID>')对启用挂载的页面返回 true(一次性 PHP 断言脚本验证,置于$CLAUDE_JOB_DIR/tmp)。—— 新增SetupPart1::register_page_sidebars(),按页面 postmetawidgets_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 全量收紧?默认保持现有宽松策略,仅修复明确错误。