确保数据库连接信息正确
无论使用哪种方法,外部脚本都需要连接到DedeCMS的数据库,请确保你的外部脚本(如 index.php)能够正确访问到DedeCMS的配置文件。

(图片来源网络,侵删)
你可以在外部脚本的开头引入DedeCMS的数据库配置文件:
<?php // 引入DedeCMS的数据库配置文件 // 请根据你的实际路径修改 require_once '../dede/config.php'; // 现在你可以使用 $cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname 等变量了 ?>
使用DedeCMS内置函数(最推荐,最简单)
这是最直接、最安全的方法,因为它直接使用了DedeCMS自身封装好的函数,能完美处理标签、缓存等问题。
适用场景:在你的PHP网站页面中调用。
步骤:

(图片来源网络,侵删)
- 在你的PHP文件中,引入DedeCMS的全局函数库
common.func.php。 - 调用
GetArchives()函数来获取文章列表。
代码示例:
假设你的外部文件是 index.php,DedeCMS安装在 ../dede/ 目录下。
<?php
// 1. 引入DedeCMS的配置文件,以便连接数据库
require_once '../dede/config.php';
// 2. 引入DedeCMS的全局函数库
require_once '../dede/include/common.func.php';
// 3. 设置调用参数
$TypeID = 1; // 要调用的栏目ID,0表示所有栏目
$Row = 10; // 调用文章数量
$col = 1; // 每行显示几条
$titlelen = 30; // 标题长度
$infolen = 150; // 简介/摘要长度
$orderby = 'pubdate'; // 排序方式,如 'hot' (浏览量), 'click' (点击量), 'pubdate' (发布时间)
// 4. 调用函数并获取文章列表
$datalist = GetArchives($typeid, $row, $col, $titlelen, $infolen, $orderby);
// 5. 循环输出文章列表
if($datalist){
foreach($datalist as $arcs) {
// $arcs 是一个包含文章信息的数组
$arcurl = $arcs['arcurl']; // 文章链接
$title = $arcs['title']; // 文章标题
$shorttitle = $arcs['shorttitle']; // 文章短标题
$description = $arcs['description']; //
$pubdate = date('Y-m-d', $arcs['pubdate']); // 发布时间,格式化日期
echo '<li>';
echo '<a href="' . $arcurl . '" title="' . $title . '">' . $title . '</a>';
echo '<span>' . $pubdate . '</span>';
echo '</li>';
}
} else {
echo '<li>暂无文章</li>';
}
?>
优点:
- 简单易用:代码量少,直接调用现成函数。
- 功能强大:能自动处理分页、缓存、模型字段等复杂逻辑。
- 稳定可靠:与DedeCMS核心紧密结合,不易出错。
原生SQL查询(灵活,性能高)
当你需要非常灵活的查询条件,或者对性能有极致要求时,可以直接写SQL语句查询数据库。
适用场景:需要自定义复杂查询条件,或者不想引入DedeCMS核心文件时。
代码示例:
<?php
// 1. 引入DedeCMS的配置文件
require_once '../dede/config.php';
// 2. 创建数据库连接
$link = mysql_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd);
mysql_select_db($cfg_dbname, $link);
mysql_query("SET NAMES 'utf8'"); // 确保字符集正确
// 3. 编写SQL语句
// 从 `dede_archives` 表查询,这是存储文章基本信息的表
// `dede_arctype` 是栏目表,`typeID` 对应 `dede_archives` 的 `typeid`
$sql = "SELECT a.id, a.title, a.typeid, a.pubdate, a.description, t.typename
FROM dede_archives AS a
LEFT JOIN dede_arctype AS t ON a.typeid = t.id
WHERE a.arctypeid > 0 AND a.ismake = 1
ORDER BY a.pubdate DESC
LIMIT 10"; // LIMIT 10 表示获取10条最新文章
// 4. 执行查询
$result = mysql_query($sql);
// 5. 循环输出结果
if ($result && mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$arcurl = GetArcUrl($row['typeid'], $row['id']); // 需要此函数来生成正确链接
$title = $row['title'];
$description = $row['description'];
$pubdate = date('Y-m-d', $row['pubdate']);
echo '<li>';
echo '<a href="' . $arcurl . '" title="' . $title . '">' . $title . '</a>';
echo '<span>' . $pubdate . '</span>';
echo '</li>';
}
} else {
echo '<li>暂无文章</li>';
}
// 6. 释放结果集并关闭连接
mysql_free_result($result);
mysql_close($link);
?>
注意:
GetArcUrl()函数在dede/inc_fun_funAdmin.php中,如果要用,需要引入它。- 这种方法直接操作数据库,当DedeCMS版本升级或表结构变化时,代码可能需要修改。
- 需要自己处理字符集、安全过滤等问题。
使用JS调用(跨域、方便前端)
如果你的外部网站是静态HTML(如 .html),或者使用其他后端语言(如ASP, JSP, Python),可以通过JS调用DedeCMS生成的JS文件来实现。
适用场景:非PHP网站、前端页面、需要跨域调用的场景。
步骤:
-
在DedeCMS后台创建JS调用文件:
- 登录DedeCMS后台。
- 进入 [模板] -> [自定义宏标记]。
- 点击 [增加新标记]。
- 标记名称:随便起一个,如
my_news。 - 标记类型:选择
JS。 - 所属栏目:选择你要调用的栏目。
- 调用条数:设置要调用的文章数量。
- 排序类型:选择排序方式,如
发布时间降序。 - 其他选项:根据需要设置标题长度、是否显示作者等。
- 提交后,系统会生成一个JS调用代码,类似:
[field:typelink /] <!-- 这个是栏目链接,不需要 --> {dede:arclist typeid='1' row='10' titlelen='30' orderby='pubdate'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} - 复制这个
{dede:arclist}...{/dede:arclist}部分的内容。
-
在DedeCMS根目录创建一个JS文件:
- 在
dede文件夹的同级目录下(通常是网站根目录),创建一个文件,get_news.js。 - 将刚才复制的
{dede:arclist}...{/dede:arclist}代码粘贴进去。
- 在
-
在外部网站页面中调用这个JS文件:
- 在你的HTML页面的
<head>或<body>中,使用<script>标签引入这个JS文件。 - 显示在指定位置,你还需要一个HTML容器,
<ul id="news_list"></ul>。
- 在你的HTML页面的
示例代码:
外部网站 HTML (index.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">外部调用DedeCMS文章</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
</head>
<body>
<h1>最新文章</h1>
<ul id="news_list">
<!-- 文章列表将在这里动态加载 -->
</ul>
<!-- 引入DedeCMS生成的JS文件 -->
<!-- 注意:这里的路径要相对于你的网站根目录 -->
<script src="http://www.your-dede-site.com/get_news.js"></script>
<script>
// 使用jQuery来处理JS返回的HTML片段并插入到页面中
// 注意:DedeCMS生成的JS文件通常直接输出HTML,所以需要包装一下
// 假设 get_news.js 的内容是直接输出 <li>...</li> 的列表
// 我们可以在它执行后,把内容包装进我们的 <ul> 里
// 但更常见的做法是,让JS文件返回一个变量,然后我们处理这个变量。
// 这里提供一个更健壮的JS调用方式,创建一个JS文件
</script>
<!-- 更推荐的JS调用方式:创建一个返回JSON的JS文件 -->
<script src="http://www.your-dede-site.com/api/get_news_json.js"></script>
<script>
// 假设 api/get_news_json.js 的内容是:
// var dedeNewsList = [{...}, {...}];
// 在你的页面中这样处理:
$(document).ready(function(){
$.getScript('http://www.your-dede-site.com/api/get_news_json.js', function() {
if (typeof dedeNewsList !== 'undefined') {
var html = '';
for (var i = 0; i < dedeNewsList.length; i++) {
var item = dedeNewsList[i];
html += '<li><a href="' + item.url + '" title="' + item.title + '">' + item.title + '</a></li>';
}
$('#news_list').html(html);
}
});
});
</script>
</body>
</html>
优点:
- 跨域方便:不受服务器端语言限制。
- 前端友好:可以直接在HTML中使用,方便SEO和静态化。
- 解耦:调用端和DedeCMS完全分离。
缺点:
- 依赖JS:如果用户禁用了JavaScript,则无法显示内容。
- 性能略低:需要额外请求JS文件。
- 相对复杂:需要额外创建和维护JS文件。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 内置函数法 | 最简单、最稳定、功能最全 | 必须是PHP环境,且引入DedeCMS核心 | PHP网站内部调用,首选方法。 |
| 原生SQL法 | 性能高、灵活性极强 | 代码复杂,需手动处理细节,易受DedeCMS升级影响 | 需要复杂查询或对性能有极致要求的PHP项目。 |
| JS调用法 | 跨域、方便前端、适合静态页面 | 依赖JS,性能略低,需要额外文件 | 非PHP网站、前端页面、需要前后端分离的场景。 |
对于绝大多数情况,强烈推荐使用方法一(内置函数法),因为它最省心、最可靠。
