dede文章如何调用到其他网站?

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

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

dede文章调用到其他网站
(图片来源网络,侵删)

下面我将为您提供几种最主流、最可靠的方法,从推荐到备选,并附上详细的步骤和代码示例。


⭐ 方法一:使用 DedeCMS 自带的 arclistsg 标签(最推荐)

这是 DedeCMS 官方提供的、最简单、最安全、最标准的跨站调用方法,它通过一个特定的接口文件生成 XML 或 JSON 数据,然后你可以在目标网站上通过 JavaScript 或 PHP 来解析。

第一步:在 DedeCMS 源网站进行设置

  1. 修改 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();
    }

    这段代码的作用是,当检测到跨站调用参数时,直接执行模板并输出,不再执行后续的分页等逻辑。

    dede文章调用到其他网站
    (图片来源网络,侵删)
  2. 创建调用接口文件

    • 在你的 DedeCMS 根目录(wwwpublic_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);
    ?>
  3. 创建列表模板

    • 在 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 源网站已经准备好了一个接口,http://你的dede域名.com/remote_article.php?typeid=1&row=5

方案 A:使用 JavaScript 调用(最简单,推荐新手)

dede文章调用到其他网站
(图片来源网络,侵删)

这种方法不涉及目标网站的服务器端语言,纯前端实现,对服务器没有压力。

  1. 在目标网站的 HTML 页面中,你需要一个容器来放置文章列表,

    <div id="remote-news-list">
        <p>正在加载文章...</p>
    </div>
  2. 在页面底部引入 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_contentscURL 函数来获取数据。

<?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 订阅源,如果你只需要一个简单的文章列表,这是最快的方法。

  1. 在 DedeCMS 后台开启 RSS

    • 登录 DedeCMS 后台。
    • 进入 系统 -> 系统基本参数 -> 核心设置
    • 找到 是否启用RSS订阅功能,设置为“是”。
    • 保存。
  2. 获取 RSS 地址

    • RSS 地址通常是:http://你的域名/data/rss/rss.xml 或者 http://你的域名/feed.php,你可以根据自己网站的实际情况确定。
  3. 在目标网站调用

    • 你可以使用任何 RSS 解析器(PHP 或 JavaScript)来读取这个 XML 文件,并获取文章列表,这种方法最省事,但无法像 arclistsg 那样灵活地自定义字段和排序。

⚠️ 重要注意事项

  1. 性能问题:频繁地远程调用会增加源服务器的负载,如果目标网站访问量很大,可以考虑在目标网站上使用缓存机制,例如将获取到的数据缓存一段时间(如 10 分钟),而不是每次刷新页面都去请求源网站。
  2. 安全风险:你暴露的接口地址可能被恶意利用,导致服务器资源被耗尽(DDoS 攻击的一种形式)。
    • 解决方案:在接口文件中加入Token 验证,调用时必须提供一个正确的密钥,否则接口拒绝服务,如上面代码中注释掉的部分所示。
  3. 跨域问题:如果目标网站和源网站的域名不同,浏览器的同源策略可能会阻止 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 的输出方式,它在功能性、安全性和性能之间取得了最好的平衡。

-- 展开阅读全文 --
头像
别人网站模板如何织梦?
« 上一篇 02-14
织梦CMS模板如何快速上手使用?
下一篇 » 02-14

相关文章

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