论坛开了有段时间了,小号测试付费用户组的时候,发现到期后竟然还能继续使用,百度了一下才发现原来是陈年老 bug,貌似从 discuz2.X 版本就有这个问题了。百度到的方法试了个遍也没效果,本来打算放弃了,结果晚上忽然有了重大发现。
小号切换用户组的时候,意外发现数据库里的用户组有效期竟然是错的。用户组有效期字段为 pre_common_member 表里的 groupexpiry 字段,在基本会员用户组的时候,默认是 0,也就是永久的。第一次购买付费用户组时,groupexpiry 字段会更新为用户组到期时间,也就是购买用户组的截止日期。但是,这个时候前台是没有自动切换为付费用户组的,还需要手动切换。关键问题就在这里,当你手动切换用户组的时候,groupexpiry 字段会再次更新,变为 0。为什么呢?因为你点的是切换用户组,那么后台就把用户组 id 修改一下,顺便把用户组到期时间也修改了一下,以保持一致。这逻辑本身是对的,但是问题在于并没有判断用户是否是第一次切换,也就是说,这次切换其实只是激活付费用户组而已,并不需要把用户组时间也更新掉。
其实说了这么多,导致这种情况的原因在于,购买用户组的时候并没有自动切换为新的用户组,但是却把用户组有效期先给更新了,这就造成后面的切换用户组刚好错过一拍,每次切换都是错的,付费用户组总是对应永久有效期。
问题清楚了,那么解决方案就有两种,一种是购买用户组的时候自动把用户切换为付费用户组,让用户组有效期跟用户组同步更新,并且还省去了用户的手动切换操作。另一种是购买用户组的时候,先不更新用户组有效期,反正手动切换用户组的时候会更新的,为什么还要先更新一波呢?
第一种看起来很合理,并且用户体验也好,但是用户组到期的时候,discuz 是不会自动切换回以前的用户组的,也需要手动,如果要改就得一起改了才好,很有可能要涉及到更多的 php 代码,但是我又不会 php,涉及的越多就越可能出错,还是算了。
第二种,无非就是找到购买时的逻辑代码,去掉一个用户组有效期的参数,不让它更新掉就可以了,明显简单的多。
找到 source\include\spacecp\spacecp_usergroup.php 文件,
将第 97 行左右的
C::t('common_member')->update($_G['uid'], array('groupexpiry' => $groupexpirynew, 'extgroupids' => $extgroupidsnew));
修改为:
C::t('common_member')->update($_G['uid'], array('extgroupids' => $extgroupidsnew));
可以看到,只是去掉了 groupexpiry 对应的参数。
再次声明,本方法适用于 discuz3.3,其他版本请自行测试。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于