dede网站文章同步如何实现?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文

使用 DedeCMS 自带的“内容发布”功能(单站点内同步)

这是最基础、最直接的方法,它适用于将文章从一个栏目同步到同一个网站下的另一个栏目

dede网站文章同步
(图片来源网络,侵删)

原理: 在发布文章时,选择多个目标栏目,DedeCMS 会将这篇文章的数据库记录同时插入到这些栏目的数据表中,从而实现“一稿多发”。

操作步骤:

  1. 登录后台:进入 DedeCMS 后台管理。

  2. 发布文章:点击左侧菜单的“[核心]” -> “[内容发布]” -> “[添加文档]”。

    dede网站文章同步
    (图片来源网络,侵删)
  3. 选择栏目:在发布页面的“栏目选择”部分,按住 Ctrl,可以同时选择多个目标栏目。

  4. :填写文章标题、内容等信息。

  5. 发布:点击“发布”按钮。

  6. 查看效果:发布成功后,你可以在所有被选中的栏目列表中看到这篇文章,点击文章进入,会发现它们是同一篇文章(文章ID相同),只是出现在不同栏目下。

    dede网站文章同步
    (图片来源网络,侵删)

优点:

  • 操作简单,无需任何插件或代码修改。
  • 数据冗余低,一篇文章只存储一份,其他栏目只是引用。

缺点:

  • 仅限同一网站内,无法同步到其他域名或网站。
  • 如果在一个栏目下修改了文章,其他栏目下的内容不会自动更新(除非再次同步)。

使用“DedeCMS同步助手”插件(跨站点同步)

这是实现跨站点、跨域名同步最常用、最方便的方法,通过一个插件,可以轻松将主站的文章自动同步到多个子站或合作站点。

原理: 这个插件通常通过以下步骤工作:

  1. 主站(源站)上安装插件,并开启同步功能。
  2. 当在主站发布或更新文章时,插件会自动捕获文章数据。
  3. 插件通过 HTTP 请求(通常是 POSTGET 方式)将文章数据发送到子站(目标站)的一个专门接口。
  4. 子站上也需要安装对应的接收端程序(可能是一个独立文件或一个插件),该程序接收数据并自动在子站创建或更新文章。

操作步骤(以常见的“DedeCMS同步助手”为例):

  1. 下载插件:从 DedeCMS 官方论坛、可靠的插件下载网站(如 Dedecms8.com 等)搜索并下载“DedeCMS同步助手”或类似名称的插件。注意:请从可信来源下载,以防病毒或后门。

  2. 安装插件

    • 将插件文件解压,按照说明上传到 DedeCMS 程序的相应目录。
    • 登录后台,在“插件”或“模块管理”中找到该插件,进行安装和启用。
  3. 配置主站(源站)

    • 在插件设置中,填写需要同步到的子站(目标站)的地址
    • 通常需要提供子站的接收脚本 URL(http://sub-site.com/api/sync.php)。
    • 可能需要设置一个通信密钥,用于验证请求的安全性,防止恶意调用。
    • 选择需要同步的栏目或全部栏目。
    • 设置同步的触发时机(如“发布时同步”、“更新时同步”、“删除时同步”)。
  4. 配置子站(目标站)

    • 在子站中也安装好插件或上传接收端文件。
    • 配置接收端,设置与主站相同的通信密钥
    • 设置子站接收文章后,要存放到哪个栏目。
  5. 测试同步

    • 在主站发布一篇新文章,检查插件日志,看是否成功发送请求。
    • 访问子站,确认文章是否已经自动创建。

优点:

  • 跨站点同步,功能强大。
  • 实现了发布、更新、删除的自动同步。
  • 有现成的解决方案,开发成本低。

缺点:

  • 需要寻找和安装可靠的第三方插件,存在一定的安全风险。
  • 插件可能不兼容高版本的 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 对稳定性和安全性要求高的跨站同步 灵活、稳定、安全、高性能 需要开发能力,成本较高

给你的建议:

  1. 如果只是想在站内不同栏目显示文章,直接使用方式一,最简单有效。
  2. 如果需要同步到另一个 DedeCMS 站点,且对技术不太熟悉,可以尝试方式二,但一定要从可信来源下载插件,并做好安全测试。
  3. 如果同步的站点非常重要,或者有特殊的同步需求(比如只同步特定类型文章、需要同步图片等),强烈推荐方式三,虽然前期投入一些开发时间,但长期来看最省心、最可靠。

在操作任何涉及数据库和核心文件的修改前,务必备份你的网站!

-- 展开阅读全文 --
头像
dede问答模块提交不了怎么办?
« 上一篇 04-23
Top C语言为何能稳居编程语言榜首?
下一篇 » 04-23

相关文章

取消
微信二维码
支付宝二维码

目录[+]