kate522
c8fdd81d6a
fix(admin): 修复快捷编辑组描述被 esc_html 转义成可见标签
...
「付费参数」组的说明文字 `<div class="c-yellow">…</div>` 整段被显示
成了纯文本标签。原因:fields_html() 对 $desc 做了 esc_html(),而该
参数传入的是一段自带 <div> 的 HTML,转义后标签就变成了可见字符。
改为按参考主题的做法原样输出 $desc,责任前移到调用方:
- pay 组:esc_html__() 转义文字,外层 div 由模板给出;
- filter 组:同样自带 <div class="px12 aksrt-bulk-edit-desc"> 包裹,
以保住原有样式(此前样式靠 fields_html 里的外层 div 提供)。
字段标题仍保持 esc_html(),因为 filter 那组的标题来自设置项。
新增契约断言锁住这个契约:不得再 esc_html($desc),两个调用点必须
各自转义/包裹;同时保留「字段标题仍转义」的断言。
验证:node --test tests/widget-system/*.test.cjs 445 项全部通过
(原有 444 项 + 新增 1 项);php -l 无语法错误。
2026-10-06 19:35:56 +08:00
kate522
27868b6131
fix(admin): 修复销售数据排序图标错位与快捷编辑控件被剥成文本
...
P1 排序图标跑到「销售数据」文字前面:
原因是注册了 manage_edit-post_sortable_columns。注册后 WordPress 会给
该列套上自己的排序指示器与 <a>,而列头 label 里已经自带一个 <a>,
浏览器解析嵌套 <a> 时把内层内容抛出,箭头因而显示到文字之前。
参考主题不注册该钩子,靠 label 链接 + pre_get_posts 落地排序,现改为
同一做法,同时删掉因此变成死代码的钩子与方法。
P2 快捷/批量编辑新增的配置项不可用,只显示为纯文本:
render_edit_boxes() 用 wp_kses_post() 包裹面板输出。该函数按「文章
内容」白名单过滤,select/option/input/fieldset/legend/label 均不在
白名单内,标签被剥掉只剩文字,于是所有控件退化成纯文本。改为原样
输出,字段值在生成时已逐个 esc_attr/esc_html 转义。
同步更新两份契约测试:sales 列表头排序改为断言「不注册 sortable」,
并为快捷编辑新增一条防回归断言,锁住不得再用 wp_kses_post 包裹面板。
验证:node --test tests/widget-system/*.test.cjs 444 项全部通过
(原有 443 项 + 新增 1 项);php -l 无语法错误。
2026-10-06 19:19:08 +08:00
kate522
ef718042d2
feat(admin): 新增后台文章列表销售数据列与快捷编辑配置项
...
「所有文章」列表此前只有互动数据列,缺少销售数据表头;快捷/批量编辑
展开后也只有原生三项。本次对照参考主题补齐这两处,不含专题链路。
- 新增 PostListEnhance:统管 sale/stats 两列、付费类型筛选、
orderby=sales_volume 排序,以及四组快捷编辑字段的渲染与保存
- 新增 PostListEditFields:单独承载字段定义,主类职责保持单一
- 新增 admin-post-list.js:按 pay_type/pay_modo 勾选切换字段显隐
- 从 inc/core-hooks.php 迁出原有列实现(删 74 行),不再保留旧闭包
- 清理 admin-main.css 中确认无引用的 .aksrt-tab-pane 与 .aksrt-modal* 死块
- 新增 post-list-quick-edit-contract 测试,更新 stats/icon-picker 契约
快捷编辑锚点列用互动数据列而非参考主题的专题分类法列(本项目无专题)。
真实销量改为页面级批量查询,避免逐行查库。金额运算统一走 Ledger 的
「分」单位,不用裸浮点。保存走 edit_post 钩子,一次覆盖快捷与批量两条路径。
2026-10-06 15:54:47 +08:00
kate522
194280af72
feat(admin): 移除支付中心的“下载记录”子菜单页面
...
下载不做记录,支付中心下的“下载记录”页面及相关链路整体删除。
删除的内容:
- src/Admin/Native/PayDownloadLogs.php(页面渲染、批量删除、
令牌查询)整文件移除。
- PayMenus 中的 download_logs 子菜单注册(概览页快捷入口由同一
份 pages() 数组生成,随之消失)。
- functions.php 中的 PayDownloadLogs::init() 接线。
- 各入口跳转链接:付费文章列表的操作按钮、用户列表“积分分成”
列的操作链接、用户列表行操作。
- “保存用户下载记录(条) / 保存文章下载记录(条)”两个设置项及其
消费链:SchemaPayment.php、assets/admin 侧 knowledge.js 的字段
与默认值、PaymentRuntime.php 的 user_log / post_log。
- 前台下载中心登录提示里的“管理下载记录”文案(该处本就没有
可跳转的管理页面)。
未改动内容:
- aksrt_dl_token 数据表仍由 DBMigrator 创建、uninstall.php 仍会
删除:存量站点可能留有历史令牌行,属数据而非功能,迁移风险
高于收益。
- 独立下载页面开关(down_alone_page)与远程文件转本地等下载
行为配置保留。
- 资源下载量(_aksrt_res_download_count)仍是只读口径:下载走
普通外链,主题内没有写入方,本次不新增下载统计。
download-direct-contract.test.cjs 中原有“下载记录页面展示历史
令牌”用例反向改写为三项断言:页面与接线已删除、记录数设置项
已注销、下载仍不做记录。
验证:node --test "tests/*/*.test.cjs" 517 项全部通过;
php -l 全部改动文件无语法错误;重新构建 admin SPA,确认产物
中不含被移除的字段与菜单。
2026-10-06 14:35:14 +08:00
kate522
50fac36169
fix(admin): 修复后台文章列表互动数据列无数据
...
后台「文章 → 所有文章」列表的「互动数据」列四项计数(浏览/点赞/
收藏/下载)恒为 0。原因是列回调读取的 meta key 与主题实际写入的
键不一致:读取用的是 'views' / 'like' / 'favorite' /
'download_count',而全仓库的写入方只写 aksrt_post_views /
_aksrt_like_count / _aksrt_favorite_count / _aksrt_res_download_count,
'views' / 'like' / 'favorite' 从未被任何代码写过。
改为复用既有的 aksrt_get_post_views() / aksrt_get_post_likes() /
aksrt_get_post_favorites() 读取(helpers 在 bootstrap 中先于
core-hooks.php 加载,仍保留 function_exists 兜底与原始键回退),
下载量走 DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY,并对历史
download_count 键做一次回退读取。
同时修正两个相邻问题:
- 缩写口径与前台不一致:列内用的是前台从未使用的「万」后缀,
改为统一的 aksrt_format_number()(≥10000 → 1.2W+,
≥1000 → 1.5K),与前台列表、文章详情页保持同一套。
- pre_get_posts 的按计数排序同样拿用户可见的排序键当 meta_key
使用,现映射到真实存储键。
资源下载走普通外链,主题内没有下载计数的写入方,下载项仍只在
>0 时出现,此为现状而非本次回归。
新增 tests/widget-system/admin-stats-column-contract.test.cjs
(7 项)锁定列注册、读取键与写入键一致、缩写口径、排序键映射,
以及下载键的写入方状态,避免再次改名时静默失效。
验证:node --test "tests/*/*.test.cjs" 515 项全部通过
(原有 508 项 + 新增 7 项);php -l inc/core-hooks.php 无语法错误。
2026-10-06 14:28:44 +08:00
kate522
2595bb02db
fix(frontend): 统一计数缩写口径并将流水号改为订单号
...
前台各处评论、浏览、点赞、收藏、已售数量统一走
aksrt_format_number() 缩写(≥10000 → 1.2W+,≥1000 → 1.5K),
缩写后缀统一为大写 K,与既有 W+ 保持一致。PHP 渲染缩写文本的
同时保留 data-base-count 原始整数,JS 增量计算不受影响;
article.js / comment-ajax.js 内的 formatStatCount / formatCount
与 PHP 规则保持同一套,避免点赞收藏后文本回跳成全量数字。
文章详情页购买信息卡、用户中心创作者收益明细、后台分成与提现
管理页、支付设置页以及四封订单/提现邮件模板中,面向用户展示的
「流水号」字样统一改为「订单号」;代码注释、内部错误码与
WP_Error 文案保留原表述。
验证:node --test "tests/*/*.test.cjs" 508 项全部通过;
php -l 检查全部改动文件无语法错误;重新构建 admin SPA 与
前台 runtime bundle。
2026-10-06 14:13:51 +08:00
kate522
fe57022550
fix(frontend): remove duplicate select arrow and show the WordPress brand icon
2026-10-06 13:23:05 +08:00
kate522
962ab5c290
fix(frontend): match the reference post format options in the page set modal
...
参考主题把文章格式固定为标准/图像/画廊/视频四项,动态读取
get_theme_support('post-formats') 会让本站多出 aside/quote/link
等注册格式,选项集偏离参考主题,故改为固定列表。
2026-10-06 12:55:04 +08:00
kate522
6dbe1fe4c6
fix(frontend): align page-set hint bar and FA5 icons with the reference
...
- 齿轮提示横条改为参考主题的 .abs-right 垂直居中几何(top:50% +
right:.7em + translateY(-50%)),本站 legacy .abs-right 是 top:0/right:0
导致横条贴到按钮顶角
- 新增 front-page-admin-set.js:横条 2 秒后淡出 1 秒消失(对齐参考
主题 js/page-edit.js),开关关闭时不出队脚本
- 齿轮与弹窗内图标统一为 FA5 惯例 fa fas fa-*,并采用 FA5 的 glyph
重命名(sliders→sliders-h、pie-chart→chart-pie)
2026-10-06 12:50:20 +08:00
kate522
12f60897d9
fix(frontend): 修复前台页面编辑弹窗并 1:1 复刻参考主题
...
远端加载的弹窗在 admin-ajax 上下文里拿不到查询对象,enabled()
恒为假,直接返回 success:false;而 AksrtRequest.responseError
只读 message/data.message,读不到 msg,遂报「请求失败(HTTP 200)」。
改为参考主题原生架构:wp_footer 直出 #modal_admin_set,提交走
vendored main.js 的 aksrt_ajax 契约,不再有 AJAX 取 HTML。
对齐参考主题 zib-frontend-set.php:
- 弹窗补齐 aria-hidden=false、win-ajax-replace、role=document
- 隐藏字段改用 taxonomy + post_type
- 字段顺序与 is_page 分支(标题样式、widgets_register、容器位置)
- 多选 checkbox 改 name="id[]",描述允许富文本
- 模块布局指向定制器小工具面板
- term 保存使用 POST 的 taxonomy 字段
清理不再使用的 assets/js/page-admin-set.js。
新增 frontend-page-edit-harness.php 覆盖门禁、渲染与各保存分支。
2026-10-06 12:22:43 +08:00
kate522
b75bf197a3
feat(extensions): 新增系统工具页面与前台投稿分片上传
2026-10-06 11:09:05 +08:00
kate522
613b8a57a3
style(user-center): 优化手机号脱敏数字框与前缀后缀一体呈现
2026-10-06 09:41:11 +08:00
kate522
af72364078
feat(security): 新增网站安全扩展模块并支持修改手机脱敏验证
2026-10-06 09:26:55 +08:00
kate522
224f86ec08
fix(profile): mask bound phone display
2026-10-06 02:16:22 +08:00
kate522
fc9bf27560
fix(profile): anchor verification code buttons
2026-10-06 02:07:13 +08:00
kate522
d8d0b5f290
test(profile): cover account modal styling
2026-10-06 01:51:02 +08:00
kate522
ce429e1caf
fix(profile): align account modal UI
2026-10-06 01:46:48 +08:00
kate522
248912f610
fix(profile): align account dialogs and contracts
2026-10-06 01:09:04 +08:00
kate522
f646fa8573
fix(user): repair phone binding and profile fields
2026-10-05 20:55:20 +08:00
kate522
0cf4639d95
fix(profile): match account submit buttons
2026-10-05 19:54:00 +08:00
kate522
0a52bf36f9
fix(profile): refine settings modal actions
2026-10-05 19:21:42 +08:00
kate522
346146b4fa
feat(profile): rebuild account settings page
2026-10-05 18:58:49 +08:00
kate522
f00c3faeaa
fix(sms): accept empty HTTP 200 responses
2026-10-05 17:25:33 +08:00
kate522
59e9bbf8a6
fix(payment): restore order statistics cards
2026-10-05 17:25:33 +08:00
kate522
1af51ab172
fix(sms): handle empty Smsbao responses
2026-10-05 16:54:12 +08:00
kate522
7b55cfb190
feat(payment): rebuild order details and asset records
2026-10-05 16:42:25 +08:00
kate522
476e2f961d
fix(rewards): load and strengthen amount styles
2026-10-05 11:36:39 +08:00
kate522
979639342a
feat(rewards): add toast and captcha flow
2026-10-05 03:51:18 +08:00
kate522
356f7fe5bd
fix(frontend): align reward modal with shared runtime
2026-10-05 03:24:42 +08:00
kate522
6037ca184b
fix(sms): collapse provider settings by default
2026-10-05 02:29:42 +08:00
kate522
8ef2f7e49f
fix(sms): remove obsolete init call
2026-10-05 02:17:25 +08:00
kate522
5091da6a60
feat(sms): align provider and verification flow
2026-10-05 02:13:52 +08:00
kate522
d0a3972ca7
fix(identity): surface real sideload failure reason
2026-10-04 23:26:52 +08:00
kate522
2ae2b2fd07
fix(identity): validate evidence by file content
2026-10-04 23:13:48 +08:00
kate522
90c1f7a62b
fix(identity): normalize bare li markers in apply intro
2026-10-04 22:54:58 +08:00
kate522
8fcb136d55
fix(identity): draw intro list markers inside list items
2026-10-04 22:51:21 +08:00
kate522
d6e3b377b4
fix(identity): apply safe list styles in modal runtime
2026-10-04 22:25:15 +08:00
kate522
2b3e325d63
fix(identity): keep modal list markers inside scroll area
2026-10-04 22:15:42 +08:00
kate522
4caf81c9e2
fix(identity): keep intro list markers visible
2026-10-04 22:10:18 +08:00
kate522
88661e1574
fix(identity): preserve HTML in application intro
2026-10-04 22:02:20 +08:00
kate522
67ec3c8aeb
fix(identity): align application modal with reference
2026-10-04 21:49:39 +08:00
kate522
59901b9e10
feat(identity): align auth flow with reference theme
2026-10-04 21:10:12 +08:00
kate522
5a17b399a0
fix(user-home): add reference tab loading skeletons
2026-10-04 19:40:24 +08:00
kate522
4c6b02a6b9
fix(user-home): restore desktop comment columns
2026-10-04 19:19:29 +08:00
kate522
56bbb63afd
fix(user-home): align profile comments with reference theme
2026-10-04 19:11:27 +08:00
kate522 and Claude Fable 5
00817766a6
fix(author): keep the follow sub-tab state out of the other panels
...
uhSub(粉丝/关注)只属于粉丝面板,loadPanelBody 却把它写在每一个面板上,
翻页时又从被点面板自身读回,于是分组状态跨面板串味:先点粉丝 tab 切到
「关注」,再点文章 tab 翻页,#panel-posts 会被永久打上 data-uh-sub=
"following",之后粉丝面板的翻页读到的是文章面板残留的分组。
翻页改为只读**当前面板内**的 .is-active 子页签,读不到就回落默认分组;
uhPage / uhSub 也只在粉丝面板写入,文章 / 收藏 / 评论面板一次都不碰。
目标面板本身仍由被点面板的 id 反解,跨面板跳转这条路径不存在,本次不动。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 14:28:43 +08:00
kate522 and Claude Fable 5
16d67c8a87
fix(user-home): hide the old panel content while the tab skeleton loads
...
翻页 / 切 tab 是整页替换语义(author.js 最终就是 panel.innerHTML = html),
但加载态只做了骨架的显示,旧卡片与旧页码仍留在屏上,于是先看到
「第 1 页卡片 + 脚下一摞骨架」,等接口返回才换页。
加载期收起 .aksrt-user-home__post-list 的直接子级 .posts-item 与旧翻页控件,
让骨架独占内容区;对齐参考主题 post_ajax() 的 beforeSend(replace 时
$item.remove() + find(pag).remove())。显隐仍走纯类切换,不写 inline display。
两点刻意的收窄:
- 只收直接子级 .posts-item 而非后代:骨架内层同样带 .posts-item,
后代选择器会把骨架自己也藏掉,占位就永远出不来。
- 旧页码用 :has(.post_ajax_loader) 限定:关注 / 评论面板没有骨架,
无条件隐藏会让它们加载时只剩一片空白。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 13:58:09 +08:00
kate522 and Claude Fable 5
45dc909e4c
fix(user-home): span the tab pagination skeleton across the post grid
...
The posts/favorites tabs turn the article list into a 2-column grid at
>=992px. The AJAX pagination skeleton .post_ajax_loader is a direct
child of that grid, so with no grid-column it was laid out as a single
half-width card and the whole placeholder stack collapsed into one
column while paging or switching tabs.
Span the loader across every column and, while loading, give it the
same 2-column template the real cards use so placeholders line up with
them. The skeleton shape now follows the resolved render mode instead
of a hardcoded 'list', so card mode no longer renders list blocks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 13:17:02 +08:00
kate522 and Claude Fable 5
20fde1d652
fix(skeleton): put the widget gutter relief on the skeleton's inner item
...
小工具(首页挂载的 / 侧栏的)骨架加载占位比真实卡片窄一截:card 布局下
每侧窄 8px,视觉上就是「骨架小了一些」。
小工具的卡片走 skip_wrapper=true,直接挂在 .widget-ajaxpager 上
(src/WidgetSystem/PostRenderer.php),不经过 .posts-row,因此只受小工具
这条独立的负边距链作用:
.widget-ajaxpager margin: -8px
.posts-item.card(真实卡片) margin: 8px ← 卡片自身自带
.post_ajax_loader(外层) margin: 8px ← f61142ee 加的补偿
.posts-item.card(骨架内层) margin: 8px ← 同一条卡片规则
骨架于是拿到 8px(外层 loader)+ 8px(内层卡片)= 16px,而真实卡片只有
8px,内容区每侧少 8px。list 模式没暴露是因为 .posts-item 的 8px 来自
`.widget-main-post.style-list .posts-item`,该规则只覆盖 style-list、
不作用于骨架,外层的 8px 恰好补上 list 卡片应有的一份,刚好对齐。
修法:把水平补偿从外层 .post_ajax_loader 移到骨架内层的 .posts-item /
.posts-mini —— 与真实卡片同一个元素、同一条选择器,于是两者逐像素同宽,
也顺带回答了「补偿链的拥有者是谁」这个一直在打补丁的问题。
- assets/css/main.css、assets/css/frontend/post-card.css:.posts-row 与
.widget-ajaxpager 两条链、桌面 8px 与移动 5px 两组,共 8 处规则改为
内层选择器。
- assets/css/routes/user-home.css:面板归零规则同步改到内层,否则它归零
的是已经失效的外层,旧补偿会重新显形。
- tests/widget-system/asset-ledger-contract.test.cjs:把守卫断言改成内层
选择器,并修正规则匹配以支持选择器组(.posts-item, .posts-mini)。
注释说明为何不能补偿外层。
参考主题 zibll 完全没有 .post_ajax_loader 的 margin 规则;AKSRT 需要它,
是因为骨架多包了一层。定位在内层是与参考主题等价的正确解。
Verification:
- node tests/widget-system/asset-ledger-contract.test.cjs 16/16
- node tests/widget-system/post-visual-contract.test.cjs 22/22
- node tests/widget-system/zibll-modern-widgets-contract.test.cjs 10/10
- node tests/widget-system/lazyload-contract.test.cjs 7/7
- node tests/widget-system/frontend-lifecycle-contract.test.cjs 13/13
- node tests/widget-system/page-display-contract.test.cjs 18/18
- node tests/widget-system/message-center-contract.test.cjs 8/8
- php tools/audit-admin-contracts.php errors=0
- build:public 已重建;旧外层规则在源与产物中均已归零
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 04:07:19 +08:00
kate522 and Claude Fable 5
38bbd917a9
fix(skeleton): align the homepage tab and sort loaders with the reference 1:1
...
首页「更多栏目」tab 与「排序方式」切换的骨架占位与参考主题 zibll 有实质差异,
根因不是几何宽度,而是三处结构/契约错位:
1. 骨架块自身结构与参考主题不同。card 分支用了 `<posts>` 元素 + `.post-graphic`
包裹层(列表变体,带 margin-right:20px),而参考主题 card 骨架是
`<div class="posts-item card">` 且 `.item-thumbnail` 是直接子元素。
→ card 骨架右侧多出一条真实卡片没有的 20px 沟槽。
2. 骨架块被错误地打上 `ajax-item`。参考主题的占位块没有该类。它会让
`find('.ajax-item')` / ajax-list 的 `inject()` 把骨架当成真实条目。
3. 排序切换的骨架被预渲染节点顶替。aksrt_render_pagination() 在 .ajax-pag 内
渲染了一个写死 2 条、写死 list 形状的 .post_ajax_loader;runtime post_ajax()
会先在容器内 find('.post_ajax_loader'),找到就复用并丢弃调用方按视口动态
拼出的骨架 → 切排序永远是 2 条 list 骨架,card 布局下也是、与视口宽度无关。
参考主题 zib_paging() 根本没有 loader 兄弟节点。
改动:
- inc/helpers/posts-renderer/markup.php:aksrt_render_placeholder() 的
card/list 分支改为与 zib_get_post_placeholder() 逐字等价的结构;去掉
ajax-item 类、card 分支的 .post-graphic 包裹层,元素改用 <div>。
- inc/helpers/template-tags/pagination-permissions.php:删除预渲染 loader,
与参考主题 zib_paging() 一致 —— 只渲染翻页控件。
- assets/js/core/pagination.js:找不到骨架节点时构造与 runtime/main.js 同款
的文章骨架(卡片 8/6/4 条、列表 4/3 条,按视口与参考主题同阈值),
不再退化为「转圈 + 文案」这个第二套加载语言;仅评论等非文章面保留该兜底。
- assets/js/core/pagination.js:为排序菜单(.ajax-option)与 tab 触发器
(.post_ajax_trigger)增加避让 —— 它们归 legacy runtime 管线,
否则一次点击发两个请求(与 ajax-list.js 的既有避让对称)。
- assets/js/runtime/main.js:post_ajax 的显隐由 fadeIn()/hide() 改为
.is-loading 类切换。前者写 inline display,优先级高于类规则,一旦残留
骨架永远打不开,正是骨架契约明令禁止的失败模式。
归档/分类筛选面原本另有一套独立加载语言(spinner 遮罩 + opacity 淡出),
本次一并统一到同一条 .post_ajax_loader + .is-loading 契约:
- inc/helpers/aksrt-archive.php:删除 show_loading 标记位与遮罩 DOM,
改为在分页之后渲染文章骨架。
- assets/js/core/archive.js:showLoading/hideLoading 只切 .is-loading;
fetchPosts() 清空内容时保留骨架与分页节点(与参考主题 success 只 hide
不删的生命周期一致),原先会连带删掉骨架。
- assets/css/frontend/layout.css:删除 .archive__ajax-wrap.is-loading
的 opacity 淡出与 spinner 遮罩规则。
- category.php / tag.php:删除已失效的 show_loading 实参。
验证:php -l 全部通过;php tools/audit-admin-contracts.php errors=0;
契约测试 post-visual(22) / asset-ledger(16) / message-center(8) /
lazyload(7) / frontend-lifecycle(13) / zibll-modern-widgets(10) /
page-display(18) / a11y 全绿;已重跑 build:public 刷新产物。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 03:04:02 +08:00