From cf6dc24193f7062b311ae3eb458976e2497c2e0f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 6 Oct 2026 19:41:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E4=BA=92=E5=8A=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=97=E7=A7=BB=E9=99=A4=E4=B8=8B=E8=BD=BD=E9=87=8F?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「互动数据」列此前有浏览/点赞/收藏/下载四项,现按要求去掉下载量, 只保留前三项。 配套清理: - render_stats_column() 去掉下载读取、历史 download_count 键回退, 以及 fa-download 渲染分支; - apply_query_args() 的排序白名单去掉 download_count; - stats_meta_key() 映射去掉该维度。 核对参考主题:其互动列(all_count)本来就只有阅读、点赞、收藏三项, 下载量是从 AKSRT 旧实现里搬过来的,不属于参考主题能力,去掉后 与 1:1 复刻目标一致。 _aksrt_res_download_count / RESOURCE_DOWNLOAD_COUNT_KEY 本身保留, 它们仍被资源相关功能使用;此处只是不再在列表列里展示。 契约测试改为断言下载项已消失,并删掉因此不再使用的 domain 变量。 验证:node --test tests/widget-system/*.test.cjs 445 项全部通过; php -l 无语法错误。 --- src/Admin/Native/PostListEnhance.php | 20 +++---------- .../admin-stats-column-contract.test.cjs | 28 ++++++++++--------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/Admin/Native/PostListEnhance.php b/src/Admin/Native/PostListEnhance.php index f0274c8f..dc1fc9e9 100644 --- a/src/Admin/Native/PostListEnhance.php +++ b/src/Admin/Native/PostListEnhance.php @@ -125,13 +125,6 @@ class PostListEnhance { $views = function_exists('aksrt_get_post_views') ? (int) aksrt_get_post_views($post_id) : (int) get_post_meta($post_id, \AKSRT\Core\DomainModel::POST_VIEW_COUNT_KEY, true); $likes = function_exists('aksrt_get_post_likes') ? (int) aksrt_get_post_likes($post_id) : (int) get_post_meta($post_id, '_aksrt_like_count', true); $favorites = function_exists('aksrt_get_post_favorites') ? (int) aksrt_get_post_favorites($post_id) : (int) get_post_meta($post_id, '_aksrt_favorite_count', true); - $downloads = (int) get_post_meta($post_id, \AKSRT\Core\DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY, true); - if ($downloads <= 0) { - $legacy_downloads = (int) get_post_meta($post_id, 'download_count', true); - if ($legacy_downloads > 0) { - $downloads = $legacy_downloads; - } - } $format = static function (int $n): string { if (function_exists('aksrt_format_number')) { @@ -151,10 +144,6 @@ class PostListEnhance { $parts[] = ' ' . esc_html($format($likes)) . ''; $parts[] = ' ' . esc_html($format($favorites)) . ''; - if ($downloads > 0) { - $parts[] = ' ' . esc_html($format($downloads)) . ''; - } - echo implode(' · ', $parts); } @@ -240,7 +229,7 @@ class PostListEnhance { if ($orderby === 'sales_volume') { $query->set('meta_key', \AKSRT\Core\DomainModel::RESOURCE_SALES_VOLUME_KEY); $query->set('orderby', 'meta_value_num'); - } elseif ($orderby === 'views' || $orderby === 'like' || $orderby === 'favorite' || $orderby === 'download_count') { + } elseif ($orderby === 'views' || $orderby === 'like' || $orderby === 'favorite') { $query->set('meta_key', $this->stats_meta_key($orderby)); $query->set('orderby', 'meta_value_num'); } @@ -270,10 +259,9 @@ class PostListEnhance { */ private function stats_meta_key(string $orderby): string { $map = [ - 'views' => \AKSRT\Core\DomainModel::POST_VIEW_COUNT_KEY, - 'like' => '_aksrt_like_count', - 'favorite' => '_aksrt_favorite_count', - 'download_count' => \AKSRT\Core\DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY, + 'views' => \AKSRT\Core\DomainModel::POST_VIEW_COUNT_KEY, + 'like' => '_aksrt_like_count', + 'favorite' => '_aksrt_favorite_count', ]; return $map[$orderby] ?? \AKSRT\Core\DomainModel::POST_VIEW_COUNT_KEY; } diff --git a/tests/widget-system/admin-stats-column-contract.test.cjs b/tests/widget-system/admin-stats-column-contract.test.cjs index 6c4b4c90..294ea05f 100644 --- a/tests/widget-system/admin-stats-column-contract.test.cjs +++ b/tests/widget-system/admin-stats-column-contract.test.cjs @@ -7,7 +7,6 @@ const root = path.resolve(__dirname, '../..') const read = file => fs.readFileSync(path.join(root, file), 'utf8') const list = read('src/Admin/Native/PostListEnhance.php') -const domain = read('src/Core/DomainModel.php') const tags = read('inc/helpers/aksrt-frontend-tags.php') const pay = read('inc/helpers/aksrt-pay.php') @@ -49,8 +48,8 @@ test('sales column renders pay type, price and both sales counts', () => { test('interaction counts are read from the keys the theme actually writes', () => { // 计数一律落在这几个 meta key 上:aksrt_post_views / _aksrt_like_count / - // _aksrt_favorite_count / _aksrt_res_download_count。列回调只能用同一套键, - // 否则全列恒为 0。旧实现读 'views' / 'like' / 'favorite',仓库里没有任何写入方。 + // _aksrt_favorite_count。列回调只能用同一套键,否则全列恒为 0。 + // 互动数据不做下载量统计,因此不再读取任何 download 键。 assert.match(tags, /'_aksrt_like_count'/) assert.match(tags, /'_aksrt_favorite_count'/) assert.match(tags, /'aksrt_post_views'/) @@ -59,15 +58,17 @@ test('interaction counts are read from the keys the theme actually writes', () = assert.match(list, /aksrt_get_post_likes\(\$post_id\)/) assert.match(list, /aksrt_get_post_favorites\(\$post_id\)/) - // 资源下载量只有 _aksrt_res_download_count 一个写入键。 - assert.match(list, /DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY/) - assert.match(domain, /RESOURCE_DOWNLOAD_COUNT_KEY\s*=\s*'_aksrt_res_download_count'/) - - // 不得再直接读这些不存在的键('download_count' 只作为历史遗留键回退读取)。 + // 不得再直接读这些不存在的键。 const column = list.slice(list.indexOf('private function render_stats_column'), list.indexOf('private function render_sales_column')) assert.doesNotMatch(column, /get_post_meta\(\$post_id, 'views'/) assert.doesNotMatch(column, /get_post_meta\(\$post_id, 'like'/) assert.doesNotMatch(column, /get_post_meta\(\$post_id, 'favorite'/) + + // 下载量统计已移除:不得再读下载键,也不得再渲染下载项。 + assert.doesNotMatch(column, /RESOURCE_DOWNLOAD_COUNT_KEY/) + assert.doesNotMatch(column, /'download_count'/) + assert.doesNotMatch(column, /fa-download/) + assert.doesNotMatch(column, /下载/) }) test('admin stats column shares the aksrt_format_number abbreviation', () => { @@ -81,9 +82,10 @@ test('sortable meta maps the public orderby keys to the stored keys', () => { assert.match(list, /'views'\s*=>\s*\\AKSRT\\Core\\DomainModel::POST_VIEW_COUNT_KEY/) assert.match(list, /'like'\s*=>\s*'_aksrt_like_count'/) assert.match(list, /'favorite'\s*=>\s*'_aksrt_favorite_count'/) - assert.match(list, /'download_count'\s*=>\s*\\AKSRT\\Core\\DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY/) // meta_key 必须是真实存储键,而不是用户可见的排序键。 assert.match(list, /\$query->set\('meta_key', \$this->stats_meta_key\(\$orderby\)\)/) + // 互动数据不统计下载量,排序映射里也不得再出现该维度。 + assert.doesNotMatch(list, /'download_count'/) }) test('every counter meta key the admin column renders has a writer', () => { @@ -104,9 +106,9 @@ test('every counter meta key the admin column renders has a writer', () => { assert.match(tags, /_aksrt_res_view_count/) assert.match(read('inc/helpers/aksrt-resource.php'), /RESOURCE_VIEW_COUNT_KEY|_aksrt_res_view_count/) - // 资源下载走普通外链,主题内没有任何写入方,所以下载项只在 >0 时出现。 - assert.match(list, /\$downloads <= 0/) - assert.match(list, /\$legacy_downloads/) + // 互动数据不统计下载量:列里不得再出现下载键的读取或回退逻辑。 + assert.doesNotMatch(list, /RESOURCE_DOWNLOAD_COUNT_KEY/) + assert.doesNotMatch(list, /\$downloads/) }) test('sales volume is written by the order pipeline', () => { @@ -118,7 +120,7 @@ test('sales volume is written by the order pipeline', () => { test('admin column icons stay behind the Font Awesome enqueue on edit.php', () => { assert.match(list, /admin_enqueue_scripts[\s\S]*?edit\.php[\s\S]*?aksrt_enqueue_fontawesome\(\)/) - for (const klass of ['fa-eye', 'fa-thumbs-up', 'fa-star', 'fa-download']) { + for (const klass of ['fa-eye', 'fa-thumbs-up', 'fa-star']) { assert.match(list, new RegExp(klass)) } })