$today=date("Y-m-d H:i:s");$daysago=date("Y-m-d H:i:s",strtotime($today)-($days*24*60*60));$result=$wpdb->get_results("SELECT comment_count, ID, post_title, post_date FROM $wpdb->posts WHERE post_date BETWEEN '$daysago' AND '$today'
AND post_type='post' AND post_status='publish'
ORDER BY comment_count DESC LIMIT 0, $nums");
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
现象
侧栏「文章聚合」挂件的热点标签页总是只显示 1 条。最新、随机两个标签页正常(各 6 条)。
线上实测(2026-10-26 抓
https://yangyq.net/首页):最新页 6 条、随机页 6 条,只有热点页 1 条。
根因(已定位,不是排序问题)
inc/theme-widgets.php的most_comm_posts($days, $nums):挂件传入的默认
$days是 30($instance['days']默认'30')。所以热门文章的候选池 = 最近 30 天内发布的文章,再在其中按评论数排序。
而这个站的真实发文节奏(服务器上查库,2026-10-26):
30 天内只有 1 篇文章 ⇒ 候选池只有 1 条 ⇒
LIMIT 6也只能返回 1 条。排序、LIMIT、SQL 全都没错,错在「用发文时间当热门的时间窗」。
这个设计对日更站点成立,对低频更新的站点(本站在 2026 年只发了 15 篇)完全失效。
附带问题
most_comm_posts()里有一句:这是直接改 PHP 全局时区,会影响同一次请求里之后所有时间函数。上面那段
$today/$daysago本可以直接用current_time()拿 WP 时区,不需要动全局。期望
本站明明有 727 篇带评论的文章、
views元数据累计 822 万次浏览,这些才是热的依据。验收标准
date_default_timezone_set不再被调用。为什么单独建单
侧栏 widget_posts 热点标签页的候选池 bug。与 #18(归档页/评论区样式)、#17([Archives] 标签大小写)、#16(评论区语言)、#15(归档短代码)都不是同一件事:那些是归档与评论模块,这是侧栏挂件里 most_comm_posts() 的时间窗逻辑,可独立验收。
已完成并发布 3.2.49
commit
d3070be(inc/theme-widgets.php+style.css,192+/32-)线上
update.json→ 3.2.49,用户可在 WP 后台点「升级」。服务器主题目录仍是 3.2.47,未被覆盖(按约定只走更新通道)。
根因:不是排序问题,是候选池
旧 SQL 先圈「最近 N 天发布」当候选池,再按评论数排序取 6。查真实库(2026-10-26):
$days=30,池子里就 1 条LIMIT 6在有 1 条候选时也只能返回 1 条。日更站这个写法成立,低频站必然失灵。新算法(按你选的口径:全站历史最热,浏览/点赞/评论综合算分)
为什么取 log10:本站 views 中位 4981、最大 56075(差 11 倍),而 love 最大仅 40、评论最大 93。不压缩的话 views 一个指标吃掉全部权重,点赞评论等于没参与。
为什么权重是 3/5/4,不是查到的通用 1/3/5:拿真实库跑了几组对比,用通用值前 8 名有 6 篇是 2009 年老随笔——因为那批文章评论 80~93 条,仅评论一项
1.97×5=9.86就压过 views 最大值的贡献4.75×1=4.75,退化成「评论数排行榜」。提到 3 之后三个指标才势均力敌。最终前 6 名(真实库):
有意不加时间衰减:查到的 Hacker News
(P-1)/(T+2)^1.8和 Redditlog10(净赞)+时间/45000都是「新内容榜」,带强衰减,会把老文章压到看不见——那正好又回到你说的这个问题。要时效榜属于另一个功能,没塞进来。关于你提的「只看 post,不考虑 page」
担心的两个异常值核查过:ID 217「留言本」浏览 214 万、ID 522「博客时间」8.3 万,
post_type都是page,SQL 里本来就有post_type='post',天然挡掉,不需要额外处理。顺手修掉的三处旧问题
date_default_timezone_set("PRC")—— 会改掉整个 PHP 请求的全局时区,影响之后所有时间函数。已删。title="..."—— 标题有双引号就截断属性。已改esc_attr(),正文另用esc_html()。get_posts('numberposts=6 & offset=0')字符串里多了一个空格,WP 解析出的参数名是' offset'(前面带空格),offset=0实际从没生效。已改数组传参。后台
「统计天数」输入框下线(它控制的就是那个把候选池缩成一条的时间窗),换一行说明;
update()不再保存days,老实例残留值下次保存时自动丢掉。验证
log10压缩性质、时区未被改动等。post_type/ 去log10/ 权重改回 1-3-5 / 标题退裸拼 / 全局时区加回 / 排序改升序 / 后台加回统计天数,每组都确认"改回 bug 后测试确实变红、且红的正是该红那条"。过程中修掉的 4 个测试自身缺陷(产品没问题,是判据坏了)
title属性和链接正文,把esc_attr摘掉后正文照样产出",判据仍然通过。改成把属性值抠出来逐字比对。$s = file_get_contents($p)删掉了,explode(null)直接炸。FAIL行里找。'${1} * ...'做替换串(PHPpreg_replace语法),写进 bash 双引号后被 bash 当位置参数展开 ⇒set -u下 unbound variable 中断。另 R8 用「先跑 php 再看$?」,中间夹了cp⇒$?永远是cp的状态,等于永远判成功。工单先不关,等你升级 3.2.49 后确认侧栏「热点」真的显示 6 条再关。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.49(热点换成全站累计热度算法,不再受时间窗候选池限制)
用户已验收,关闭本单。