bbPress移动回复导致数据库故障的严重bug

配置环境

  • WordPress + BuddyPress + bbPress

bbPress 为了适配 BuddyPress 群组,我们自定义了一些函数,群组成员可以查看所在的隐藏和私密群论坛,非群成员则不可见。

发现严重 bug

  • 该群组的所有话题都是关闭的状态,其中有一个是置顶并关闭。

在一次移动 BuddyPress 群组论坛版块内的话题里的回复的时侯,点击 选择 使用此版块下现有的话题:【】这里下拉选框是空的,没法获取到此版块下的话题。

无法获取话题列表的表现如下图

bbpress-move-reply-bug
bbpress-move-reply-bug

此时:操作移动回复没有去理会选项下拉框是否为空

直接 点击 提交

严重的问题就此发生!

页面一直在加装转圈许久,然后页面一片空白,什么都没有显示,不是404

编辑移动话题的成员是群组论坛版块的版主(非论坛总版主)

此时该成员 点击 进入 个人主页论坛创建的回复

  • 页面也是一片空白,什么都没有显示,不是404

此时网站管理员账户登录后台,点击 回复

  • 进入后台的论坛回复管理页面,无法加载任何回复内容列表!

详细检查了其他成员,包括操作移动回复的该成员的其他话题与回复内容没有丢失!仅仅发现操作移动回复的成员所移动的那个回复的内容丢失了!

在网站后台查看所有回复页面加载速度慢,且一片空白,无法加载到任何回复内容清单

此时我尝试使用论坛工具修复论坛,但全部可修复的选项都选择了运行了尝试了,都未能修复
仅修复了一点点

  • 在网站后台查看所有回复页面加载速度慢,但是能加载到刚才移动回复的群组版块的回复清单其他的所有回复清单都无法加载出来了。

天呐,太坑了!

发现了另一个 bug

我一直在后台尝试处理这个问题的时候,还发现了另一个问题

在后台点击 话题 或 回复 筛选版块的功能 也有 bug

在没有选择版块的时候,当前所有的论坛版块都可以提供显示选择筛选

选择其中一个版块后,点击筛选,可以正常筛选出该板块下的所有话题,但如果现在再点击选择其他版块,就只有一个公开群组的版块可供选择,其他的都是私密和隐藏的版块,无法提供给我们选择筛选,只有再重新点击全部 然后再重新选择版块筛选,才行。

这难道是我的自定义函数的问题?或是其他插件的问题?

尝试解决问题

此时陷入了迷茫。

只有一步一步的排查

首先将所有插件都禁用( 仅启用 bbPress 与 BuddyPress )

  • 此时 bug 依旧

然后将自定义的函数全部清除

  • 此时 bug 依旧

最后重启服务器

  • 此时 bug 依旧

终于没招了!都不是我的问题,是 bbPress 与 BuddyPress 的问题!

好吧,既然这样,只能修复刚才损坏的数据库,其他的既有的bug就有条件了再修复,或等待插件更新咯

修复数据库只能使用大招了!

因为数据库每天仅有一个备份,还是有一小部分的数据丢失的,我们先做好这小部分的内容备份
然后我想到了我每天都有快照呀!使用快照比恢复数据库爽多了,恢复了一切!

快照就是爽呀,又一次帮了我一个大忙

现在在后台点击 话题 或 回复 筛选版块的功能 也有bug,这是既有的 bug

刚才由于移动回复导致的问题

  • 进入 当事人的 个人主页 – 论坛 – 创建的回复
    • 页面一片空白,什么都没有显示,也不是404
  • 进入 后台
    • 所有回复页面加载速度慢,且一片空白,无法加载到任何回复内容清单

这些问题都解决了!

尝试修复 bug

第二天

我找到了 bbPress 移动回复的模板,查看源代码,发现了问题的所在

<?php // 这是有bug的下拉选框数组
	bbp_dropdown( array(
		'post_type'   => bbp_get_topic_post_type(),
		'post_parent' => bbp_get_reply_forum_id( bbp_get_reply_id() ),
		'selected'    => -1,
		'exclude'     => bbp_get_reply_topic_id( bbp_get_reply_id() ),
		'select_id'   => 'bbp_destination_topic'
	) );
?>

<?php // 这是尝试修复有bug的下拉选框数组
	bbp_dropdown( array(
		'post_type'   => bbp_get_topic_post_type(),
		'post_parent' => bbp_get_reply_forum_id( bbp_get_reply_id() ),
		// 加一行检测话题状态的数组,可以获取话题列表了
		'post_status' => bbp_get_public_topic_statuses(),
		'selected'    => -1,
		'exclude'     => bbp_get_reply_topic_id( bbp_get_reply_id() ),
		'select_id'   => 'bbp_destination_topic'
	) );
?>

OK,我们加了一行检测话题状态的数组,可以获取话题列表了

bbpress-move-reply-ok
bbpress-move-reply-ok

然后,暂时没有测试移动回复,因为测试这个需要提前做好备份工作,由于暂时没有时间测试,有空测试再完善这篇文章记录。

发表回复