refactor(admin): 清理付费 meta 死字段并补齐商品介绍渲染

延续上一轮 pay_count「只写不读」的排查,把其余写而不读的字段一次
性处理完。按字段性质分两类处理,不是一律删。

【删除】纯数据垃圾,无界面入口、无消费方:
- card_keys / purchase_limit / stock:只有 DomainModel 的默认值与
  sanitize,全仓零引用。契约测试原本还断言它们不得出现在 metabox 上。
- 随 card_keys 一并删除 sanitle_card_keys() 助手。
- video_scale_height「固定长宽比例」:参考主题里这是轮播组件 widget
  的参数,不属于付费视频字段,当初误搬到付费 metabox 上且从未被消费。
  连默认值、sanitize、metabox 保存项一起移除,并同步修正契约测试。

【补齐】有界面入口、管理员填了但不显示的四个字段:
pay_title / pay_doc / pay_details / pay_extra_hide 此前只有 metabox
输入框和 sanitize,前端一个都不读。按参考主题 pages/download.php
的结构接到单篇资源下载页:
- pay_title 有值则替代文章标题作商品标题(回退 get_the_title);
- pay_doc 商品简介、pay_details 更多详情渲染在标题区下方;
- pay_extra_hide 额外隐藏内容只在有下载权限时渲染在下载盒之后。
三处 HTML 输出均走 wp_kses_post,与 sanitize 侧的安全 HTML 口径一致。

同时把 pay_extra_hide 接进文章页付费盒
(aksrt_get_paid_box_html):该函数本身只在有付费权限时执行,天然
就是「付费后才可见」的位置,复用已有的 .pay-extra-hide 样式。

验证:php -l 四个 PHP 文件无语法错误;
node --test tests/widget-system/*.test.cjs 449 项全部通过。
This commit is contained in:
2026-10-06 20:17:58 +08:00
parent 8e1fd0a30f
commit b447c41f13
5 changed files with 25 additions and 32 deletions
-28
View File
@@ -181,7 +181,6 @@ class DomainModel {
'video_pic' => '',
'video_title' => '',
'video_episode' => [],
'video_scale_height' => 0,
'downloads' => [],
'attributes' => [],
'gallery' => [],
@@ -194,9 +193,6 @@ class DomainModel {
'require_captcha' => false,
// §3.8 电商增强字段
'virtual_sales' => 0,
'stock' => -1,
'card_keys' => [],
'purchase_limit' => 0,
'free_preview' => '',
'show_sales' => true,
// legacy: free daily quota overbuy price (cash or points by pay_modo).
@@ -356,26 +352,6 @@ class DomainModel {
return array_values(array_unique($gallery));
}
/**
* Sanitize card/key codes for auto-delivery.
* Each entry is a non-empty sanitized string (one code per line).
*/
public static function sanitize_card_keys($value): array {
if (!is_array($value)) {
return [];
}
$keys = [];
foreach ($value as $key) {
$key = sanitize_text_field((string) $key);
if ($key !== '') {
$keys[] = $key;
}
}
return $keys;
}
/**
* @param array<string, mixed> $raw
* @return array<string, mixed>
@@ -409,7 +385,6 @@ class DomainModel {
$meta['video_pic'] = esc_url_raw((string) ($raw['video_pic'] ?? ''));
$meta['video_title'] = sanitize_text_field((string) ($raw['video_title'] ?? ''));
$meta['video_episode'] = self::sanitize_video_episodes($raw['video_episode'] ?? []);
$meta['video_scale_height'] = max(0, min(200, (int) ($raw['video_scale_height'] ?? 0)));
$meta['downloads'] = self::sanitize_downloads($raw['downloads'] ?? []);
$meta['attributes'] = self::sanitize_attributes($raw['attributes'] ?? []);
$meta['gallery'] = self::sanitize_gallery($raw['gallery'] ?? []);
@@ -423,9 +398,6 @@ class DomainModel {
// §3.8 电商增强字段
$meta['virtual_sales'] = max(0, (int) ($raw['virtual_sales'] ?? 0));
$meta['stock'] = (int) ($raw['stock'] ?? -1);
$meta['card_keys'] = self::sanitize_card_keys($raw['card_keys'] ?? []);
$meta['purchase_limit'] = max(0, (int) ($raw['purchase_limit'] ?? 0));
$meta['free_preview'] = wp_kses_post((string) ($raw['free_preview'] ?? ''));
$meta['show_sales'] = !isset($raw['show_sales']) || !empty($raw['show_sales']);
$meta['download_limit_over_price'] = $meta['pay_modo'] === 'points'
-2
View File
@@ -141,7 +141,6 @@ class ResourceMetaBox {
<?php $this->upload('video_pic', __('视频封面(可选)', 'aksrt'), (string) ($meta['video_pic'] ?? ''), 'image'); ?>
<?php $this->text('video_title', __('本集标题', 'aksrt'), (string) ($meta['video_title'] ?? ''), __('如需添加剧集则需填写此处', 'aksrt'), __('第1集', 'aksrt')); ?>
<?php $this->group('video_episode', __('更多剧集', 'aksrt'), (array) ($meta['video_episode'] ?? []), 'video_row', __('添加剧集', 'aksrt'), __('为付费视频添加更多剧集。', 'aksrt')); ?>
<?php $this->number('video_scale_height', __('固定长宽比例', 'aksrt'), (string) ($meta['video_scale_height'] ?? 0), '5', '%', __('为 0 则不固定长宽比例。', 'aksrt')); ?>
</div>
<div data-pay-type="download">
@@ -336,7 +335,6 @@ class ResourceMetaBox {
'video_pic' => (string) ($raw['video_pic'] ?? ''),
'video_title' => (string) ($raw['video_title'] ?? ''),
'video_episode' => $raw['video_episode'] ?? [],
'video_scale_height' => $raw['video_scale_height'] ?? 0,
'downloads' => $raw['downloads'] ?? [],
'attributes' => $raw['attributes'] ?? [],
'demo_url' => (string) ($raw['demo_url'] ?? ''),