discuz定时发帖的另类实现
首先说明:本文所针对的Discuz版本为6.1.0,其它版本可能有一定的差别。
某些时候我们需要实现类似于“定时发帖”的功能,特别是在无人值守的时候就显得尤其有用(例如,我需要在明天凌晨两点钟发布一个帖子,我当然不想在那个时候从睡梦中醒来发帖。)。然而Discuz没有提供这一功能。但是我们可以通过其它方法来达到这一目的。
实现的思路是这样的:编写好那些要定时发布的帖子,放入待审箱,然后通过计划任务来自动审核它们,即可达到类似于自动发帖的效果。
第一步
使用管理员身份进入Discuz后台,选择“全局”>“时间设置”,在“发帖审核时间段”一栏中输入时间段。随后提交保存。每天该时间段内用户发帖不直接显示,需经版主或管理员人工审核才能发表。当然,前提是,发帖者不能是管理员或者版主。

第二步
编写任务计划脚本。按照相关的命名规则,我们可以给它命名为 threads_automatic.inc.php,保存到Discuz根目录下的 include/crons/ 下面。
<?php /* 自动审核帖子 测试 */ if(!defined('IN_DISCUZ')) { exit('Access Denied'); } $new_post_time=time(); //获取当前的Unix时间戳 $db->query("UPDATE {$tablepre}posts SET invisible=0,dateline={$new_post_time} WHERE tid IN(SELECT tid FROM {$tablepre}threads WHERE fid=36 AND authorid=14114 AND displayorder=-2)"); $db->query("UPDATE {$tablepre}threads SET displayorder=0,dateline={$new_post_time},lastpost= {$new_post_time} WHERE fid=36 AND displayorder=-2 AND authorid=14114"); ?>
解释一下这段程序。
Discuz的帖子数据保存到 “前缀threads”和“前缀posts”这两个表中,此处的前缀是你安装Discuz时所设置的,默认值为 “cdb_”。
threads表中,待审的帖子所对应的displayorder字段的值为-2,如果该帖子通过了审核,该值变为0;
posts表中,待审的帖子所对应的invisible字段的值为-2,如果该帖子通过了审核,该值变为0;
threads表的dateline字段为该主题帖子的发表时间,lastpost字段为该主题的最后回复时间;
posts表中的dateline字段也是该帖子的发表时间;
因此,要实现自动审核,首先要通过一定的条件从数据库中筛选出你要审核的帖子,此处SQL语句中的
WHERE fid=36 AND displayorder=-2 AND authorid=14114
作用是选出位于ID为36的版块里面,作者uid为14114的待审帖子。这一条件可以根据实际情况来修改,但是 displayorder=-2 这个条件是不能少的。
选出要自动审核的帖子之后,更新相应的displayorder和invisible字段,使之通过审核,同时也更新相应的时间字段,将这些帖子的发表时间修改为本段脚本被执行时的时间。
第三步
设置计划任务。Discuz默认提供了计划任务功能。使用管理员进入后台,选择“其他”>“计划任务”,新建一个计划任务,名字随意取,提交后单击它所对应的“编辑”按钮,设置好该任务执行的时间,输入脚本文件名,提交保存。然后选择“工具”>“更新缓存”,将论坛的缓存清空一下。

第四步
使用普通用户登录论坛编写帖子,这时候这些帖子不会被直接发表而是需审核后才显示。然后你就只需等待计划任务的执行了。
总而言之这一方法是简单可行的,但是由于PHP语言本身的特性,如果一直没有人甚至搜索引擎爬虫来访问本论坛的话,这个计划任务就执行不了。
4 条评论
我等了好长时间了啊,啥时候给个回复,邮件发送过了,麻烦上线指教一下
我这个是基于6.1的。可能是7.2的数据库结构或者字段的意义和6.1不太一样吧。你对比一下,正常的帖子和待审的帖子,在哪些字段上不同,这样就知道了。
字段都没变,只是我执行PHP后invisible并不重-2变为0
找到原因了,一直没仔细看,你第一段代码displayorder=-2应该换成invisible
强大代码,强大的脑袋,比那些所谓自动采集发布的插件强百倍不止