使用 DedeCMS 自带的“内容发布”功能(单站点内同步)
这是最基础、最直接的方法,它适用于将文章从一个栏目同步到同一个网站下的另一个栏目。

原理: 在发布文章时,选择多个目标栏目,DedeCMS 会将这篇文章的数据库记录同时插入到这些栏目的数据表中,从而实现“一稿多发”。
操作步骤:
-
登录后台:进入 DedeCMS 后台管理。
-
发布文章:点击左侧菜单的“[核心]” -> “[内容发布]” -> “[添加文档]”。
(图片来源网络,侵删) -
选择栏目:在发布页面的“栏目选择”部分,按住
Ctrl键,可以同时选择多个目标栏目。 -
:填写文章标题、内容等信息。
-
发布:点击“发布”按钮。
-
查看效果:发布成功后,你可以在所有被选中的栏目列表中看到这篇文章,点击文章进入,会发现它们是同一篇文章(文章ID相同),只是出现在不同栏目下。
(图片来源网络,侵删)
优点:
- 操作简单,无需任何插件或代码修改。
- 数据冗余低,一篇文章只存储一份,其他栏目只是引用。
缺点:
- 仅限同一网站内,无法同步到其他域名或网站。
- 如果在一个栏目下修改了文章,其他栏目下的内容不会自动更新(除非再次同步)。
使用“DedeCMS同步助手”插件(跨站点同步)
这是实现跨站点、跨域名同步最常用、最方便的方法,通过一个插件,可以轻松将主站的文章自动同步到多个子站或合作站点。
原理: 这个插件通常通过以下步骤工作:
- 在主站(源站)上安装插件,并开启同步功能。
- 当在主站发布或更新文章时,插件会自动捕获文章数据。
- 插件通过 HTTP 请求(通常是
POST或GET方式)将文章数据发送到子站(目标站)的一个专门接口。 - 子站上也需要安装对应的接收端程序(可能是一个独立文件或一个插件),该程序接收数据并自动在子站创建或更新文章。
操作步骤(以常见的“DedeCMS同步助手”为例):
-
下载插件:从 DedeCMS 官方论坛、可靠的插件下载网站(如 Dedecms8.com 等)搜索并下载“DedeCMS同步助手”或类似名称的插件。注意:请从可信来源下载,以防病毒或后门。
-
安装插件:
- 将插件文件解压,按照说明上传到 DedeCMS 程序的相应目录。
- 登录后台,在“插件”或“模块管理”中找到该插件,进行安装和启用。
-
配置主站(源站):
- 在插件设置中,填写需要同步到的子站(目标站)的地址。
- 通常需要提供子站的接收脚本 URL(
http://sub-site.com/api/sync.php)。 - 可能需要设置一个通信密钥,用于验证请求的安全性,防止恶意调用。
- 选择需要同步的栏目或全部栏目。
- 设置同步的触发时机(如“发布时同步”、“更新时同步”、“删除时同步”)。
-
配置子站(目标站):
- 在子站中也安装好插件或上传接收端文件。
- 配置接收端,设置与主站相同的通信密钥。
- 设置子站接收文章后,要存放到哪个栏目。
-
测试同步:
- 在主站发布一篇新文章,检查插件日志,看是否成功发送请求。
- 访问子站,确认文章是否已经自动创建。
优点:
- 跨站点同步,功能强大。
- 实现了发布、更新、删除的自动同步。
- 有现成的解决方案,开发成本低。
缺点:
- 需要寻找和安装可靠的第三方插件,存在一定的安全风险。
- 插件可能不兼容高版本的 DedeCMS(如 DedeCMS 5.7/5.8 与最新版本)。
- 同步过程依赖于网络,如果目标站宕机,同步会失败。
手动开发 API 接口(最灵活、最稳定)
如果你对 PHP 和 DedeCMS 的数据库结构比较熟悉,这是最可控、最稳定的方案,可以完全按照自己的需求定制。
原理: 我们自定义一个 API 接口,主站通过调用这个接口来传递数据,子站通过处理这个接口的数据来完成文章的创建和更新。
开发步骤(简化版):
在子站(目标站)创建接收接口文件
在子站的根目录下创建一个新文件,api/receive_article.php。
<?php
// 引入 DedeCMS 的核心文件
require_once(dirname(__FILE__) . '/include/common.inc.php');
// 1. 安全验证(非常重要!)
$api_key = isset($_REQUEST['api_key']) ? trim($_REQUEST['api_key']) : '';
if ($api_key != 'your_secret_key') { // 'your_secret_key' 替换成你自己的密钥
echo json_encode(['status' => 'error', 'message' => 'Invalid API Key']);
exit;
}
// 2. 获取数据
$title = isset($_REQUEST['title']) ? trim($_REQUEST['title']) : '';
$content = isset($_REQUEST['content']) ? trim($_REQUEST['content']) : '';
$catid = isset($_REQUEST['catid']) ? intval($_REQUEST['catid']) : 0;
// ... 其他字段如作者、来源等
if (empty($title) || empty($content) || empty($catid)) {
echo json_encode(['status' => 'error', 'message' => 'Missing required fields']);
exit;
}
// 3. 准备插入数据库的数据
$arctitle = $title;
$arcbody = $content;
$typeid = $catid;
// ... 设置其他字段,如 pubdate, senddate, mid 等
// 4. 调用 DedeCMS 的发布函数
$dsql = new DedeSql(false);
$inQuery = "INSERT INTO `#@__archives`(typeid, arctitle, pubdate, senddate, mid)
VALUES ('$typeid','$arctitle', '".time()."', '".time()."', '1');";
$dsql->ExecuteNoneQuery($inQuery);
$aid = $dsql->GetLastID(); // 获取新插入文章的ID
// 插入文章正文
$inQuery2 = "INSERT INTO `#@__addonarticle`(aid, body)
VALUES ('$aid','$arcbody');";
$dsql->ExecuteNoneQuery($inQuery2);
// 5. 返回结果
if ($aid > 0) {
echo json_encode(['status' => 'success', 'message' => 'Article synced successfully', 'aid' => $aid]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Database error']);
}
?>
在主站(源站)创建发送脚本
在主站发布文章成功后(通常在 article_add.php 文件中修改),添加一段代码来调用子站的接口。
// 在 article_add.php 文件中,发布文章成功后的部分
// ... 原有的发布代码 ...
// 假设文章已经发布成功,获取文章ID
$arcID = $dsql->GetLastID(); // 如果是新发布的,获取ID
// --- 开始添加同步代码 ---
$target_api_url = 'http://sub-site.com/api/receive_article.php';
$api_secret_key = 'your_secret_key'; // 和子站的密钥一致
// 准备要发送的数据
$post_data = array(
'api_key' => $api_secret_key, => $title, // 从发布页面获取的标题
'content' => $body, // 从发布页面获取的内容
'catid' => $typeid, // 从发布页面获取的栏目ID
);
// 使用 cURL 发送 POST 请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_api_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间
$response = curl_exec($ch);
curl_close($ch);
// (可选) 记录同步日志
$log_content = "Syncing Article ID: $arcID. Response: " . $response . "\n";
file_put_contents(DEDEROOT . '/data/sync_log.txt', $log_content, FILE_APPEND);
// --- 同步代码结束 ---
优点:
- 完全可控,可以根据需求定制任何字段和逻辑。
- 性能最好,没有第三方插件的冗余代码。
- 最安全,可以自己设计最严密的安全验证机制。
- 稳定性最高,不依赖第三方插件的更新。
缺点:
- 需要一定的 PHP 和 DedeCMS 开发能力。
- 需要自己维护代码。
总结与建议
| 同步方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 内置发布 | 同一网站内,多栏目发布 | 简单、原生、无插件 | 仅限单站,无法跨域 |
| 同步助手插件 | 跨站点、跨域名同步 | 方便快捷,功能齐全 | 依赖第三方,有安全风险,可能不兼容 |
| 自建API | 对稳定性和安全性要求高的跨站同步 | 灵活、稳定、安全、高性能 | 需要开发能力,成本较高 |
给你的建议:
- 如果只是想在站内不同栏目显示文章,直接使用方式一,最简单有效。
- 如果需要同步到另一个 DedeCMS 站点,且对技术不太熟悉,可以尝试方式二,但一定要从可信来源下载插件,并做好安全测试。
- 如果同步的站点非常重要,或者有特殊的同步需求(比如只同步特定类型文章、需要同步图片等),强烈推荐方式三,虽然前期投入一些开发时间,但长期来看最省心、最可靠。
在操作任何涉及数据库和核心文件的修改前,务必备份你的网站!
