核心原理
无论使用哪种方法,核心原理都是一样的:

(图片来源网络,侵删)
- 提前创建内容:在后台准备好需要在未来发布的文章,但设置其发布时间为未来的某个日期。
- 触发脚本:通过一个外部脚本,定期(例如每分钟)检查数据库中是否有已到发布时间的文章。
- 执行发布:如果找到,脚本就将其状态从“待发布”改为“已发布”,并生成静态页面。
最关键、最稳定的方法是利用 Linux服务器的计划任务。
使用Linux计划任务(最推荐、最稳定)
这是业界标准的做法,利用服务器自带的 cron 服务,定时执行一个PHP脚本来完成发布任务。
步骤1:创建自动发布脚本
- 在你的网站根目录下,创建一个新的PHP文件,
auto_publish.php。 - 将以下代码复制并粘贴到
auto_publish.php文件中:
<?php
/**
* DedeCMS 自动发布文章脚本
* 使用方法:通过Linux计划任务,每分钟执行一次此脚本
*/
// 1. 设置数据库连接信息 (请根据你的实际情况修改)
$dbhost = 'localhost'; // 数据库主机
$dbuser = 'your_db_user'; // 数据库用户名
$dbpass = 'your_db_password'; // 数据库密码
$dbname = 'your_db_name'; // 数据库名
$dede_tablepre = 'dede_'; // DedeCMS表前缀,默认是dede_
// 2. 连接数据库
$link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
if (!$link) {
die('Could not connect: ' . mysqli_error($link));
}
mysqli_set_charset($link, "utf8");
// 3. 查询当前时间之前、状态为“待发布”(article.arcrank=-1)的文章
$sql = "SELECT * FROM `{$dede_tablepre}archives` WHERE `senddate` < UNIX_TIMESTAMP() AND `arcrank` = -1";
$result = mysqli_query($link, $sql);
if ($result && mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$aid = $row['id']; // 文章ID
// 4. 更新文章状态为“已审核”(arcrank=0)
$update_sql = "UPDATE `{$dede_tablepre}archives` SET `arcrank` = 0 WHERE `id` = {$aid}";
mysqli_query($link, $update_sql);
// 5. 调用DedeCMS的发布函数,生成HTML文件
// 引入DedeCMS的核心文件
require_once(dirname(__FILE__) . '/include/dedesql.class.php');
// 创建一个DedeSQL实例
$dsql = new Dedesql(false);
// 执行发布操作
$arc = new Archives($aid);
$arc->MakeHtml();
echo "文章ID: {$aid} 已成功发布于 " . date('Y-m-d H:i:s') . "\n";
}
} else {
// 没有找到待发布的文章
echo date('Y-m-d H:i:s') . " - 暂无需要发布的文章,\n";
}
// 6. 关闭数据库连接
mysqli_close($link);
?>
代码说明:
- 请务必修改顶部的数据库连接信息(
$dbuser,$dbpass,$dbname)和表前缀($dede_tablepre)。 senddate字段存储的是文章的发布时间戳(UNIX时间戳)。arcrank字段控制文章状态:-1表示待审核(未发布),0表示已审核(已发布)。- 脚本通过引入DedeCMS的核心类
Archives来调用其自带的MakeHtml()方法,确保生成的HTML路径、缩略图等都正确无误。
步骤2:上传脚本并设置权限
- 使用FTP或文件管理器,将
auto_publish.php文件上传到你的网站根目录(与index.php同级)。 - 通过SSH连接到你的Linux服务器,执行以下命令给脚本添加可执行权限:
chmod +x /path/to/your/website/auto_publish.php
(请将
/path/to/your/website替换为你的网站实际路径)
(图片来源网络,侵删)
步骤3:配置Linux计划任务(Cron Job)
-
通过SSH登录到你的服务器。
-
输入
crontab -e命令来编辑计划任务列表,如果是第一次,可能会让你选择一个编辑器(如nano),选择一个你熟悉的即可。 -
在打开的文件末尾,添加以下一行代码:
* * * * * /usr/bin/php -q /path/to/your/website/auto_publish.php > /dev/null 2>&1
这行代码的含义:
- 表示每分钟执行一次,你可以根据需要调整,
0 * * * *表示每小时整点执行一次。 /usr/bin/php:指定PHP的执行路径,如果不确定,可以通过which php命令来查找。-q:安静模式,不输出HTTP头信息。/path/to/your/website/auto_publish.php:这是你上传的脚本文件的绝对路径。> /dev/null 2>&1:将脚本的输出重定向到/dev/null,避免产生大量的邮件日志,保持服务器整洁。
- 表示每分钟执行一次,你可以根据需要调整,
-
保存并退出编辑器(在
nano中是Ctrl+X,然后按Y,再按Enter)。
完成! 从现在开始,你的服务器会每分钟自动运行一次这个脚本,检查并发布所有已到时间的文章。
使用Windows计划任务(适用于Windows服务器)
如果你的网站运行在Windows服务器上,可以使用任务计划程序来实现类似的功能。
- 创建脚本:与方法一相同,创建
auto_publish.php文件并上传到网站根目录。 - 打开任务计划程序:在服务器上搜索并打开“任务计划程序”。
- 创建基本任务:
- 在右侧操作栏点击“创建基本任务...”。
- 名称:输入一个名称,如“DedeCMS自动发布”。
- 触发器:选择“每天”,然后设置开始时间和重复间隔(每隔1分钟重复一次)。
- 操作:选择“启动程序”。
- 程序或脚本:点击“浏览”,找到PHP的执行文件(通常是
php.exe的完整路径,如C:\php\php.exe)。 - 添加参数(可选):输入
-f,然后点击“浏览”,选择你上传的auto_publish.php文件的完整路径。 - 起始于(可选):输入你的网站根目录的完整路径。
- 完成:点击“完成”,任务计划就创建好了。
使用DedeCMS自带的功能(较旧版本)
一些非常老的DedeCMS版本可能内置了“定时发布”功能,通常在“系统” -> “计划任务”里,但这个功能在新版本中已被移除或不再可靠,强烈不推荐使用,因为它依赖于网站本身的访问量来触发,如果网站一段时间没有访问,任务就不会执行。
使用方法总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| Linux计划任务 | 稳定、可靠、不依赖网站访问,是标准做法。 | 需要SSH操作权限,对新手稍有门槛。 | ★★★★★ (最推荐) |
| Windows计划任务 | 稳定、可靠,不依赖网站访问。 | 仅适用于Windows服务器。 | ★★★★☆ (Windows服务器首选) |
| DedeCMS自带功能 | 无需额外代码。 | 不可靠,依赖网站访问,已在新版中废弃。 | ☆☆☆☆☆ (不推荐) |
最佳实践:
- 提前准备:每天花点时间,把未来几天要发布的文章都写好,设置好未来的
发布时间,然后保存为“待审核”状态。 - 设置脚本:按照方法一或方法二,设置好自动发布脚本和计划任务。
- 检查日志:为了确保脚本正常运行,你可以修改
auto_publish.php,将> /dev/null 2>&1改为>> /path/to/your/website/auto_publish.log 2>&1,这样,每次执行的日志都会追加到auto_publish.log文件中,方便你检查是否有错误发生。
这样,你的DedeCMS网站就能实现完全自动化的每日内容更新了。
