Typecho文章定时发布,计划任务配置

很多人用 Typecho 写博客时会发现:后台只能立即发布或存为草稿,没有像 WordPress 那样的“定时发布”按钮。
这并不代表做不到,借助服务器自带的计划任务(Crontab),配合一个简单的 PHP 脚本,就能让文章到点自动上线。
本文按零基础可照做的顺序,讲清 588. Typecho文章定时发布,计划任务配置 的完整流程。

先判断你的服务器环境

动手前先确认两件事:服务器有没有命令行权限,以及 PHP 能不能被计划任务调用。
用 SSH 登录服务器,执行:

php -v

如果能看到 PHP 版本信息,说明命令行 PHP 可用。
如果提示 command not found,需要先找到 PHP 的实际路径,常见位置是 /www/server/php/74/bin/php/usr/bin/php
宝塔面板用户可以在“软件商店 → PHP → 设置 → 配置修改”附近找到 PHP 安装路径,也可以用:

which php
find / -name php -type f 2>/dev/null | head

确认 PHP 路径后,记下它,后面写计划任务会用到。
数据库连接信息在 Typecho 根目录的 config.inc.php 里,不需要额外找。

写一个发布用的 PHP 脚本

Typecho 自身没有开放“到点自动发布”的接口,但数据库里文章的发布状态和创建时间是可以被程序修改的。
思路上:把文章先存为草稿,记录一个未来时间,然后让计划任务定时检查,把时间已到且仍是草稿的文章改成已发布。

在网站根目录新建一个文件,例如 cron_publish.php,写入以下内容(请把数据库前缀改成你自己的,默认是 typecho_):

connect_error) {
    die('连接失败: ' . $db->connect_error);
}
$now = time();
$prefix = 'typecho_';
$sql = "UPDATE {$prefix}contents SET status = 'publish' WHERE type = 'post' AND status = 'draft' AND created <= ?";
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $now);
$stmt->execute();
echo '已处理 ' . $stmt->affected_rows . " 篇草稿\n";
$stmt->close();
$db->close();

关键点:数据库用户名、密码、库名必须和 config.inc.php 中一致,否则脚本无法连接。
写完先手动跑一次验证:

php /www/wwwroot/你的域名/cron_publish.php

如果输出“已处理 0 篇草稿”,说明脚本本身能跑通,只是暂时没有到点的草稿。

配置计划任务让它自动执行

脚本能手动跑通后,就可以交给计划任务。
推荐每 5 分钟检查一次,既能及时发布,又不会给数据库造成压力。

命令行方式,执行 crontab -e,加入一行:

*/5 * * * * /usr/bin/php /www/wwwroot/你的域名/cron_publish.php >/dev/null 2>&1

保存退出即可。
如果用的是宝塔面板,路径更直观:面板 → 计划任务 → 添加任务,任务类型选“Shell脚本”,执行周期选“每5分钟”,脚本内容填:

/www/server/php/74/bin/php /www/wwwroot/你的域名/cron_publish.php

注意 PHP 路径要换成你服务器上真实存在的那个,宝塔不同版本 PHP 目录名可能不一样。

配置完成后,可以新建一篇草稿,手动把数据库里 created 字段设成一个已经过去的时间,等 5 分钟看它是否自动变成已发布,以此验证计划任务确实生效。

容易踩的坑和排查方向

脚本被公开访问导致数据被改。 cron_publish.php 放在网站根目录时,别人直接访问 URL 也能触发。
建议在 Nginx 里加一条规则禁止外部访问:

location = /cron_publish.php {
    deny all;
}

或者把脚本移到网站根目录之外,计划任务里写绝对路径即可。

计划任务没执行。 先看系统日志:grep CRON /var/log/syslogtail -f /var/log/cron
如果日志里没有记录,多半是 Crontab 没保存成功;
如果有记录但没效果,通常是 PHP 路径写错或脚本里数据库信息不对。

草稿没有按时发布。 检查三点:文章的 created 时间是否真的小于当前时间、status 是否确实是 drafttype 是否为 post
Typecho 的独立页面 typepage,不要混在一起处理。

执行频率别设太密。 每分钟跑一次对小型博客没有必要,反而增加数据库负担。
5 分钟或 10 分钟是更稳妥的选择。

还能不能做得更省心

如果不想自己维护脚本,也可以考虑安装支持定时发布的 Typecho 插件,但插件质量参差不齐,安装前建议先备份数据库。
无论用脚本还是插件,核心逻辑都一样:先存草稿并记录未来时间,再由计划任务把到点草稿改成已发布

对于大多数个人博客,上面的 Crontab 方案已经够用,配置一次基本不用再管。
真正需要留意的是脚本安全、PHP 路径和数据库连接这三处,出问题时优先从这三处排查。

常见疑问

计划任务能不能用宝塔的“访问URL”类型代替 Shell 脚本?
可以,但前提是脚本允许被访问且你能接受这个访问入口。更安全的做法还是 Shell 脚本加 Nginx 禁止外部访问。

定时发布对已发布文章有影响吗?
没有。脚本只处理 status = 'draft' 的记录,已发布文章不会被改动。

改了数据库前缀怎么办?
把脚本里的 $prefix 改成实际前缀即可,其他逻辑不变。

能不能精确到某个具体时间点发布?
可以。把文章的 created 设为那个时间戳,计划任务每 5 分钟检查一次,误差通常在 5 分钟以内。

如果按本文步骤配置后仍不生效,先回看避坑部分的三处检查点,再对照服务器日志确认计划任务是否真的被触发。

分享到:
上一篇
Typecho后台自定义仪表盘,简化站长操作
下一篇
Z-BlogPHP文章采集去重,避免重复内容
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意