织梦如何批量修改文章发布时间

应用场景

在站点迁移、内容整合、定时发布等场景中,经常需要批量调整文章发布时间。常见需求包括:把采集回来的历史文章时间统一调整为今天,让列表页看起来更新;或把一批文章的时间间隔打散,避免集中在同一时刻显得不自然。

原因分析

1. 采集文章时间错乱

采集工具抓取的 pubdate 可能是 1970 年或未来时间,需要统一修正。

2. 列表更新需求

把旧文章时间改为近期,可以让首页和栏目页看起来活跃,吸引搜索引擎抓取。

3. 发布节奏调整

把一批文章时间间隔打散为每小时一篇,模拟人工发布节奏。

修改方法

方法一:后台逐条修改

进入「核心 → 内容管理 → 文档列表」,点击文章标题进入编辑页,修改「发布时间」字段后保存。适合少量文章,大批量效率太低。

方法二:SQL 批量修改

登录 phpMyAdmin 或宝塔数据库,执行 SQL:

-- 把 typeid=2 栏目下所有文章时间改为当前时间
UPDATE dede_archives
SET pubdate=UNIX_TIMESTAMP(),
    senddate=UNIX_TIMESTAMP()
WHERE typeid=2;

-- 把所有文章时间统一为 2026-08-01 10:00:00
UPDATE dede_archives
SET pubdate=UNIX_TIMESTAMP('2026-08-01 10:00:00'),
    senddate=UNIX_TIMESTAMP('2026-08-01 10:00:00');

-- 按文章 id 间隔 1 小时
UPDATE dede_archives a
JOIN (
  SELECT id, (@r:=@r+3600) AS new_time
  FROM dede_archives, (SELECT @r:=UNIX_TIMESTAMP('2026-08-01 00:00:00')) r
  ORDER BY id ASC
) b ON a.id=b.id
SET a.pubdate=b.new_time, a.senddate=b.new_time;

方法三:写 PHP 脚本

<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
$base=strtotime('2026-08-01 09:00:00');
$interval=1800; // 半小时一篇
$dsql->SetQuery("SELECT id FROM dede_archives WHERE typeid=2 ORDER BY id ASC");
$dsql->Execute();
$i=0;
while($row=$dsql->GetObject()){
    $t=$base + $i * $interval;
    $dsql->ExecuteNoneQuery("UPDATE dede_archives SET pubdate={$t}, senddate={$t} WHERE id={$row->id}");
    $i++;
}
echo "updated {$i} articles";
?>

方法四:使用采集插件

「织梦采集侠」「火车头采集器」等第三方工具支持批量修改发布时间,可视化操作更直观。

配置示例

把发布时间随机分布到最近 7 天内,让列表看起来更自然:

UPDATE dede_archives
SET pubdate=UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND()*7*24*60*60) SECOND))
WHERE typeid IN (1,2,3);

注意事项

  • 修改 pubdate 后必须同时修改 senddate,否则列表排序会异常。
  • 静态站点修改时间后需要重新生成 HTML,否则前端显示旧时间。
  • 批量 SQL 执行前先备份数据库,避免误操作。
  • 不要把发布时间改为未来太久,可能影响搜索引擎收录判断。
  • 时间字段是 Unix 时间戳(秒),不是日期字符串,注意格式转换。
建议测试时先用 SELECT 验证 SQL 逻辑,确认无误后再 UPDATE

建议与展望

批量修改发布时间是运营常用技巧,但要避免过度使用。搜索引擎对「时间突变」的文章有一定敏感度,如果发现站点所有文章时间突然全部刷新到今天,可能触发降权。建议每次只调整部分文章,时间间隔保持自然分布。长期来看,应该建立规范的内容发布机制,从源头控制时间准确性,而不是事后批量修补。今天就先把待调整的文章列表导出,按栏目分批处理,让发布时间更合理。