使用服务器计划任务(最推荐、最稳定)
这是最专业、最可靠的方法,它不依赖于网站的访问,由服务器在指定时间主动执行一个脚本文件,无论你的网站有没有人访问,任务都会被触发。

核心原理: 创建一个 PHP 脚本,这个脚本的功能是查询数据库中标记为“待发布”的文章,并修改它们的状态为“已发布”,设置服务器在每天固定时间(比如凌晨1点)自动访问并执行这个脚本。
详细步骤:
第一步:创建执行脚本 auto_publish.php
在你的网站根目录(与 index.php 同级)下,创建一个新的 PHP 文件,例如命名为 auto_publish.php,并将以下代码粘贴进去。
<?php
/**
* DedeCMS 定时自动发布脚本
* 将此文件放置在网站根目录,然后通过服务器计划任务定时访问
* http://www.yourdomain.com/auto_publish.php
*/
// 1. 引入 DedeCMS 的核心配置文件
// 如果你的网站在子目录,请相应调整路径,require_once('dede/config.php');
require_once('include/common.inc.php');
// 2. 设置时区(如果需要)
// date_default_timezone_set('PRC'); // PRC 代表中国时区,如果你的服务器时区已经是UTC+8,可以省略
// 3. 查询状态为 -1(待发布)且发布时间小于等于当前时间的文章
$arcrow = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__archives` WHERE senddate <= UNIX_TIMESTAMP() AND arcrank = -1");
if ($arcrow['dd'] > 0) {
// 4. 执行更新操作,将这些文章的状态改为 1(正常)
$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET arcrank = '1' WHERE senddate <= UNIX_TIMESTAMP() AND arcrank = -1");
// 可选:记录日志,方便排查问题
$logMessage = date('Y-m-d H:i:s') . " - 成功自动发布了 " . $arcrow['dd'] . " 篇文章,\n";
file_put_contents(__DIR__ . '/auto_publish.log', $logMessage, FILE_APPEND);
echo "执行成功:已发布 " . $arcrow['dd'] . " 篇待发布文章。";
} else {
// 可选:记录日志
$logMessage = date('Y-m-d H:i:s') . " - 没有找到需要发布的文章,\n";
file_put_contents(__DIR__ . '/auto_publish.log', $logMessage, FILE_APPEND);
echo "执行成功:当前没有待发布的文章。";
}
// 5. 关闭数据库连接
$dsql->Close();
?>
代码解释:

require_once('include/common.inc.php');:这是关键,它引入了 DedeCMS 的数据库连接和全局变量,让我们的脚本可以安全地操作数据库。UNIX_TIMESTAMP():MySQL 函数,获取当前 Unix 时间戳。senddate <= UNIX_TIMESTAMP():senddate字段存储的是文章设定的发布时间(Unix 时间戳),这句 SQL 的意思是“查找所有发布时间小于等于当前时间的文章”。arcrank = -1:arcrank是文章状态字段,-1代表“待发布”。UPDATE ... SET arcrank = '1':将查询到的文章状态从-1(待发布)修改为1(正常发布)。- 日志功能:强烈建议保留,这样你可以在
auto_publish.log文件中查看脚本是否正常运行以及发布了多少文章。
第二步:上传脚本并测试
- 将
auto_publish.php文件通过 FTP 或其他方式上传到你的网站根目录。 - 在浏览器中访问这个文件,
http://www.yourdomain.com/auto_publish.php。 - 如果一切正常,你应该会看到类似“执行成功:当前没有待发布的文章。”或“执行成功:已发布 X 篇待发布文章。”的提示,你的网站根目录下会生成一个
auto_publish.log文件。
第三步:设置服务器计划任务
这一步的操作因服务器环境而异,这里以最常见的 Linux + cPanel 和 Linux + 宝塔面板为例。
情况 A:使用 cPanel 控制面板
- 登录你的 cPanel。
- 在“高级”区域找到并点击 “Cron jobs” (计划任务)。
- 在 “Add New Cron Job” (添加新计划任务) 部分。
- “Common Settings” (常用设置):选择
0 1 * * *,这代表“每天凌晨1点执行一次”,你也可以自定义,格式为分 时 日 月 星期。 - “Command” (命令):在这里输入你的脚本 URL。
/usr/bin/wget -O - -q http://www.yourdomain.com/auto_publish.php
/usr/bin/wget:使用wget命令来访问 URL,这是最常用的方式。-O -:将输出重定向到标准输出(即不保存为文件)。-q:静默模式,不显示任何输出。
- 点击 “Add New Cron Job” 保存。
情况 B:使用宝塔面板
- 登录你的宝塔面板。
- 点击左侧菜单的 “计划任务”。
- 点击右上角的 “添加任务”。
- 任务类型:选择 “访问URL”。
- 执行周期:选择 “每天”,并设置具体时间,
01:00。 - URL地址:输入你的脚本 URL。
http://www.yourdomain.com/auto_publish.php - Header参数:留空。
- 启用任务:确保勾选。
- 点击 “确定” 保存。
情况 C:使用 SSH (Linux 命令行)
如果你有服务器的 SSH 权限,可以直接编辑 crontab。
- 连接到你的服务器 via SSH。
- 输入命令
crontab -e来编辑计划任务列表。 - 在文件末尾添加以下一行(同样代表每天凌晨1点执行):
0 1 * * * /usr/bin/wget -q -O /dev/null http://www.yourdomain.com/auto_publish.php
/dev/null:将所有输出丢弃,避免邮件发送。
- 保存并退出文件(在 Vim 中是
wq)。
完成!
你的服务器已经设置好了,每天到了设定的时间,它就会自动访问 auto_publish.php,脚本会自动将数据库中所有“到期”的文章状态修改为“已发布”。
利用 DedeCMS 的“发布文章”钩子(较复杂,不推荐)
DedeCMS 在发布文章时有钩子机制,理论上可以写一个插件,在文章被“保存”时判断其发布时间,如果未来再存入一个任务队列,但这非常复杂,需要修改核心文件,且 DedeCMS 没有内置的任务队列系统,实现起来难度大、不稳定,不推荐普通用户尝试。
利用第三方插件或模块(存在风险)
网上可能存在一些第三方开发的“定时发布”模块或插件。使用这些方法需要非常谨慎!
- 风险:
- 安全性:第三方代码可能包含后门或恶意代码,威胁你的网站安全。
- 兼容性:可能与你的 DedeCMS 版本不兼容,导致网站出错。
- 稳定性:代码质量参差不齐,可能运行一段时间后就失效。
- 维护:插件作者可能不再更新,出现问题时无人支持。
如果你决定要使用,请务必选择信誉良好的来源,并仔细检查代码。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 服务器计划任务 | 稳定、可靠、不依赖网站访问、性能最佳 | 需要服务器操作权限,对新手稍有门槛 | ★★★★★ (强烈推荐) |
| DedeCMS 钩子 | 理论上集成度高 | 实现复杂,需修改核心,稳定性差 | ★☆☆☆☆ (不推荐) |
| 第三方插件 | 可能安装简单 | 安全风险高,兼容性差,不稳定 | ★☆☆☆☆ (风险高,不推荐) |
最佳实践建议:
- 首选方法一:它是最专业、最可靠的解决方案。
- 测试脚本:在设置计划任务前,务必手动访问
auto_publish.php确保脚本能正常工作。 - 检查日志:定期查看
auto_publish.log文件,确认任务是否按预期执行。 - 保持脚本安全:
auto_publish.php文件可能被任何人访问,虽然它只是执行数据库更新,但为了安全,可以考虑在脚本中加入一个简单的校验,比如检查一个特定的 GET 参数。
修改 auto_publish.php 的访问 URL:
// 在脚本开头添加
if (empty($_GET['secret_key']) || $_GET['secret_key'] != 'your_secret_key_123') {
die('Access Denied');
}
这样,只有访问 http://www.yourdomain.com/auto_publish.php?secret_key=your_secret_key_123 时才会执行,然后在计划任务的命令中使用这个带参数的 URL。
