3.2.19: 修复关闭 wpDiscuz 后评论列表整段不显示

现象:#5264 等文章标题「评论(4)」与输入框都在,但 <ol> 内 0 字节。
只有单页评论的文章必现,多页文章反而正常。

根因:3.2.18 给 wp_list_comments() 传了 page=1 / per_page=10,
进入核心的"独立查询"分支。当这两个值与核心自己推导的
current_cpage / comments_per_page 恰好相等时,内层 if 不成立,
$_comments 一次都没被赋值(源码注释说会回退到 $wp_query->comments,
但那句注释下面没有回退代码),结果 paged_walk(null) 返回空串。

修复:
- 新增 yang_comment_page():按顶层评论分页 + get_children() 展平子孙。
  按顶层分页可避免父子被切到两页产生孤儿回复。
- comments.php 把结果当第二参数显式传给 wp_list_comments,
  走 null !== $comments 分支,绕开有问题的推导。

连带修掉的三处:
- Walker_Comment::end_el() 总会补 </li>,callback 再写一个导致
  </li></li>,子容器被挤成父评论的兄弟节点、CSS 栅格失效。
  yang_comment_html() 新增 $close_li,列表路径交给 walker 闭合。
- 核心 start_lvl() 固定输出 class="children",而样式表按
  .yang-children 写,类名不符导致缩进/栅格全失效。
  新增 Yang_Walker_Comment 覆盖 start_lvl()。
- AJAX「加载更多」原先只取顶层、只渲染顶层,吞掉全部子回复
  (实测某篇 10 条顶层名下 12 条回复丢失)。改为走同一 walker,
  has_more 也改成与首屏同口径的顶层计数。
This commit is contained in:
2026-10-24 08:23:00 +08:00
parent 9c598fef48
commit 460abcdb97
3 changed files with 175 additions and 26 deletions
+36 -5
View File
@@ -17,6 +17,18 @@
*
* 4. **提交按钮的禁用态由 JS 控制**,模板里给出 `.is-loading` 的样式钩子。
*
* ── 3.2.19 修的两个结构问题 ──────────────────────────────────
* 5. **取数不再交给 `wp_list_comments()` 推导**。3.2.18 传了
* `page=1` / `per_page=10`,而核心那段"独立查询"分支在内层
* 条件不成立时**不会给 `$_comments` 赋值**(注释说会回退到
* `$wp_query->comments`,但代码里没有这个回退),结果
* `paged_walk(null, ...)` 输出空串 —— 评论一条都不显示。
* 现在由 `yang_comment_page()` 取好、当第二个参数传进去。
*
* 6. **子评论容器改成 `yang-children`**(见 `Yang_Walker_Comment`)。
* 核心 `start_lvl()` 固定输出 `class="children"`,而样式表里
* 几十条规则全按 `.yang-children` 写,类名对不上就全部失效。
*
* @author Yongquan Yang <yangyq.net>
* @license MIT License
*/
@@ -81,22 +93,41 @@ if ($yang_per_page <= 0) {
?>
<ol class="yang-comment-list" id="yang-comment-list">
<?php
/* 取数自己来,不让 wp_list_comments 去推导分页。
原因见 inc/theme-comments.php 里 yang_comment_page() 的注释:
当它推导出的当前页与传入的 page 相等时,内部 $_comments
不会被赋值,列表直接是空的。显式传数组就绕开了那段逻辑。 */
$yang_page_comments = yang_comment_page(
$yang_post_id,
1,
$yang_paged ? $yang_per_page : 0
);
wp_list_comments(array(
'type' => 'comment',
'callback' => 'comment_callbacks',
'walker' => new Yang_Walker_Comment(),
'style' => 'ol',
'max_depth' => $yang_threaded ? $yang_max_depth : 1,
'avatar_size' => 48,
'per_page' => $yang_paged ? $yang_per_page : 0,
'page' => 1,
));
'per_page' => 0,
'page' => 0,
), $yang_page_comments);
?>
</ol>
<?php
/* 加载更多:只在「有分页」且「总数超过一页」时出现。
/* 加载更多:只在「有分页」且「顶层评论数超过一页」时出现。
判据必须与 AJAX 的 has_more 同口径(都按顶层算),
否则会出现"按钮还在、点了却什么都没有"。
旧模板无条件输出,即使只有 1 条评论也显示一个点不动的按钮。 */
$yang_has_more = $yang_paged && $yang_comment_count > $yang_per_page;
$yang_top_count = (int) get_comments(array(
'post_id' => $yang_post_id,
'status' => 'approve',
'parent' => 0,
'count' => true,
));
$yang_has_more = $yang_paged && $yang_top_count > $yang_per_page;
?>
<div class="comments-more" id="yang-comments-more"<?php echo $yang_has_more ? '' : ' hidden'; ?>>
<button type="button" class="comments-more-btn" data-page="2">