目标网站(显示文章的网站)向 DedeCMS 源网站(提供文章的网站)发送一个请求,源网站返回一个标准格式的数据(如 XML 或 JSON),目标网站接收并解析这些数据,然后将其渲染成 HTML 展示给用户。

下面我将为您提供几种最主流、最可靠的方法,从推荐到备选,并附上详细的步骤和代码示例。
⭐ 方法一:使用 DedeCMS 自带的 arclistsg 标签(最推荐)
这是 DedeCMS 官方提供的、最简单、最安全、最标准的跨站调用方法,它通过一个特定的接口文件生成 XML 或 JSON 数据,然后你可以在目标网站上通过 JavaScript 或 PHP 来解析。
第一步:在 DedeCMS 源网站进行设置
-
修改
include/arc.listview.class.php文件(旧版 DedeCMS 5.7)- 打开
dede目录下的include/arc.listview.class.php文件。 - 找到
function GetList($typeid = 0, $innertext = '',这一行。 - 在这个函数内部,找到
if($this->PageNo > $this->TotalPage) return "";这一行。 - 在这行之前,添加如下代码:
// 允许跨站调用开关,0为不允许,1为允许 if($this->CrossSite == 1) { $this->ParseTempletsFirst(); $this->dtp->Display(); exit(); }这段代码的作用是,当检测到跨站调用参数时,直接执行模板并输出,不再执行后续的分页等逻辑。
(图片来源网络,侵删) - 打开
-
创建调用接口文件
- 在你的 DedeCMS 根目录(
www或public_html)下,新建一个 PHP 文件,比如命名为remote_article.php。 - 将以下代码复制到
remote_article.php文件中:
<?php /** * DedeCMS 远程文章调用接口 * 使用方法: http://你的域名/remote_article.php?typeid=栏目ID&row=数量&orderby=排序字段 */ // 引入核心文件 define('DEDEINC', dirname(__FILE__) . '/include'); require_once(DEDEINC . '/common.inc.php'); require_once(DEDEINC . '/arc.listview.class.php'); // 获取GET参数 $typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0; // 栏目ID $row = isset($_GET['row']) ? intval($_GET['row']) : 10; // 调用文章数量 $orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate'; // 排序方式,如 pubdate, click, id 等 // 安全检查,防止被恶意调用 // 你可以在这里设置一个安全的 token,例如在调用时需要提供 ?token=你的密钥 // if (!isset($_GET['token']) || $_GET['token'] !== 'your_secret_key') { // die('Access Denied'); // } // 实例化列表类 $lv = new ListView($typeid); $lv->CrossSite = 1; // 启用我们刚才修改的跨站调用逻辑 // 设置调用参数 $lv->GetList($typeid, '', $orderby, $row); ?> - 在你的 DedeCMS 根目录(
-
创建列表模板
- 在 DedeCMS 的模板目录(
templets/default/)下,新建一个模板文件,比如命名为remote_list.htm。 - 在这个模板文件中,你只需要编写要循环输出的文章列表的 HTML 结构。
{dede:list} <li> <a href="[field:arcurl/]" target="_blank">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span> </li> {/dede:list}- 注意:这个模板文件非常纯粹,不需要包含任何网站头、尾等公共部分。
- 在 DedeCMS 的模板目录(
第二步:在目标网站调用数据
你的 DedeCMS 源网站已经准备好了一个接口,http://你的dede域名.com/remote_article.php?typeid=1&row=5。
方案 A:使用 JavaScript 调用(最简单,推荐新手)

这种方法不涉及目标网站的服务器端语言,纯前端实现,对服务器没有压力。
-
在目标网站的 HTML 页面中,你需要一个容器来放置文章列表,
<div id="remote-news-list"> <p>正在加载文章...</p> </div> -
在页面底部引入 jQuery 库(如果还没有的话),然后添加以下 JavaScript 代码:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function(){ // DedeCMS 接口地址 var api_url = 'http://你的dede域名.com/remote_article.php?typeid=1&row=5'; // 使用 jQuery 的 get 方法获取 XML 数据 $.get(api_url, function(data) { var html = ''; // 解析 XML 数据 $(data).find('datalist').each(function(){ $(this).find('row').each(function(){ var title = $(this).find('title').text(); var url = $(this).find('arcurl').text(); var pubdate = $(this).find('pubdate').text(); // 构建 HTML 字符串 html += '<li>'; html += ' <a href="' + url + '" target="_blank">' + title + '</a>'; html += ' <span>' + pubdate + '</span>'; html += '</li>'; }); }); // 将生成的 HTML 插入到页面中 $('#remote-news-list').html(html); }); }); </script>
方案 B:使用 PHP 调用
如果你的目标网站也是 PHP 网站且没有使用 jQuery,可以用 PHP 的 file_get_contents 或 cURL 函数来获取数据。
<?php
// DedeCMS 接口地址
$api_url = 'http://你的dede域名.com/remote_article.php?typeid=1&row=5';
// 使用 simplexml_load_string 解析 XML
$xml = @simplexml_load_string(file_get_contents($api_url));
if ($xml) {
echo '<ul>';
foreach ($xml->channel->item as $item) {
// 注意:DedeCMS 输出的 XML 中,链接字段通常是 'arcurl' 或 'link'
$title = (string)$item->title;
$url = (string)$item->arcurl; // 或者 $item->link
$pubdate = (string)$item->pubdate;
echo '<li>';
echo ' <a href="' . htmlspecialchars($url) . '" target="_blank">' . htmlspecialchars($title) . '</a>';
echo ' <span>' . $pubdate . '</span>';
echo '</li>';
}
echo '</ul>';
} else {
echo '<p>无法获取文章数据。</p>';
}
?>
使用 JSON 接口(更现代、更灵活)
如果你觉得 XML 处理起来有点麻烦,可以修改接口,让它输出 JSON 格式,这在 JavaScript 中处理起来会非常方便。
第一步:修改 DedeCMS 接口文件
修改上面创建的 remote_article.php 文件,将输出格式从 XML 改为 JSON。
<?php
// ... 前面的代码不变 ...
require_once(DEDEINC . '/arc.listview.class.php');
// 获取GET参数
$typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0;
$row = isset($_GET['row']) ? intval($_GET['row']) : 10;
$orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate';
// 实例化列表类
$lv = new ListView($typeid);
$lv->CrossSite = 1; // 启用跨站调用
// 设置调用参数
$lv->GetList($typeid, '', $orderby, $row);
// --- 修改从这里开始 ---
// 获取解析后的模板内容(XML 格式)
$xml_string = $lv->dtp->GetResult();
// 将 XML 转换为 JSON
// 使用 simplexml_load_string 解析 XML
$xml = simplexml_load_string($xml_string);
// 将 SimpleXMLElement 对象转换为 JSON
$json_string = json_encode($xml, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
// 设置响应头为 JSON
header('Content-Type: application/json; charset=utf-8');
// 输出 JSON 数据
echo $json_string;
exit;
?>
第二步:在目标网站调用 JSON 数据
现在你的接口地址 http://你的dede域名.com/remote_article.php?typeid=1&row=5 返回的是 JSON。
使用 JavaScript 调用(极其简单)
<div id="remote-news-json-list">
<p>正在加载文章...</p>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function(){
var api_url = 'http://你的dede域名.com/remote_article.php?typeid=1&row=5&format=json'; // 假设你加了 format=json 参数来区分
$.getJSON(api_url, function(data) {
var html = '';
// data 就是直接解析好的 JSON 对象
// DedeCMS 输出的 JSON 结构可能是 { "datalog": { "row": [...] } }
if (data.datalog && data.datalog.row) {
$.each(data.datalog.row, function(index, item){
html += '<li>';
html += ' <a href="' + item.arcurl + '" target="_blank">' + item.title + '</a>';
html += ' <span>' + item.pubdate + '</span>';
html += '</li>';
});
}
$('#remote-news-json-list').html(html);
});
});
</script>
使用 RSS/Feed 订阅接口(最简单,但功能有限)
DedeCMS 默认就支持生成 RSS 订阅源,如果你只需要一个简单的文章列表,这是最快的方法。
-
在 DedeCMS 后台开启 RSS
- 登录 DedeCMS 后台。
- 进入
系统->系统基本参数->核心设置。 - 找到
是否启用RSS订阅功能,设置为“是”。 - 保存。
-
获取 RSS 地址
- RSS 地址通常是:
http://你的域名/data/rss/rss.xml或者http://你的域名/feed.php,你可以根据自己网站的实际情况确定。
- RSS 地址通常是:
-
在目标网站调用
- 你可以使用任何 RSS 解析器(PHP 或 JavaScript)来读取这个 XML 文件,并获取文章列表,这种方法最省事,但无法像
arclistsg那样灵活地自定义字段和排序。
- 你可以使用任何 RSS 解析器(PHP 或 JavaScript)来读取这个 XML 文件,并获取文章列表,这种方法最省事,但无法像
⚠️ 重要注意事项
- 性能问题:频繁地远程调用会增加源服务器的负载,如果目标网站访问量很大,可以考虑在目标网站上使用缓存机制,例如将获取到的数据缓存一段时间(如 10 分钟),而不是每次刷新页面都去请求源网站。
- 安全风险:你暴露的接口地址可能被恶意利用,导致服务器资源被耗尽(DDoS 攻击的一种形式)。
- 解决方案:在接口文件中加入Token 验证,调用时必须提供一个正确的密钥,否则接口拒绝服务,如上面代码中注释掉的部分所示。
- 跨域问题:如果目标网站和源网站的域名不同,浏览器的同源策略可能会阻止 JavaScript 请求,现代浏览器通常允许
GET请求,但为了保险起见,可以在 DedeCMS 源网站的.htaccess文件中添加 CORS 头:Header set Access-Control-Allow-Origin "*"表示允许所有域名访问,为了安全,最好指定你的目标网站域名,如
Header set Access-Control-Allow-Origin "https://你的目标域名.com"。
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
arclistsg (XML/JSON) |
官方支持、功能强大、灵活可控、性能相对较好 | 需要手动修改代码和配置,有一定技术门槛 | ⭐⭐⭐⭐⭐ (最推荐) |
| RSS/Feed | 无需任何配置,开箱即用 | 功能有限,无法自定义字段和排序,样式固定 | ⭐⭐⭐ (适合简单需求) |
| 直接调用数据库 | 数据最实时、功能最强大 | 极其危险! 需要暴露数据库信息,有巨大安全风险 | ⭐ (强烈不推荐) |
对于绝大多数情况,强烈推荐使用方法一(arclistsg,并根据你的技术栈选择 XML 或 JSON 的输出方式,它在功能性、安全性和性能之间取得了最好的平衡。
