场景分析
你说的“调用指定文章内容”,通常有以下几种可能:

- 调用单篇文章的标题和简介:最常见,比如在首页某个板块显示一个公告或推荐文章。
- 调用单篇文章的正文内容:比如在首页某个位置显示完整的文章内容,而不仅仅是摘要。
- 调用多篇文章(根据ID列表):比如调用ID为 1, 5, 10 的三篇文章。
下面我将针对这些场景提供最常用和最有效的解决方案。
使用 DedeCMS 自定义标记 (最推荐)
这是 DedeCMS 最标准、最强大的方法,推荐优先使用,它通过修改 index.php 文件来实现。
场景1:调用单篇文章的标题和简介(例如文章ID为 1)
假设你想在首页的某个位置(比如公告栏)显示文章ID为 1 的文章的标题和简介。
第一步:找到并编辑 index.php 文件

用 FTP 或文件管理器登录你的网站服务器,找到根目录下的 index.php 文件。
第二步:在 index.php 中添加查询代码
在 index.php 文件中,找到 require_once(dirname(__FILE__)."/include/common.inc.php"); 这一行。在这一行的下面,添加以下 PHP 代码:
// 调用指定ID的文章
$arctle = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE id = 1");
// 获取文章ID,用于后续获取文章详细内容
$article_id = $arctle['id'];
// 根据文章ID获取文章的详细信息(包括标题、简介等)
$article_info = $dsql->GetOne("SELECT a.title, a.description, a.pubdate, t.typedir
FROM `#@__archives` a
LEFT JOIN `#@__arctype` t ON a.typeid = t.id
WHERE a.id = {$article_id}");
代码解释:
$dsql->GetOne(...): 这是 DedeCMS 执行单条查询并返回结果的方法。SELECT * FROM#@__archivesWHERE id = 1: 这句 SQL 查询dede_archives表(存储文章基本信息的表),并获取id为 1 的所有数据。#@__是 DedeCMS 的表前缀,如果你的表前缀是dede_,它就会自动替换成dede_archives。$arctle = ...: 将查询结果存入$arctle变量。- 第二个查询是为了获取文章的分类目录信息,以便生成链接。
第三步:在首页模板文件中调用变量
打开你的首页模板文件,通常是 /templets/default/index.htm。
的位置,使用 DedeCMS 的变量语法来调用上面定义的变量:
<div class="announcement">
<h3>网站公告</h3>
<ul>
<li>
<a href="[field:typedir function='GetTypeurl(@me)'/]/[field:id/].html" title="[field:title/]">
[field:title/]
</a>
<span class="date">([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
</li>
</ul>
</div>
模板标签解释:
[field:typedir function='GetTypeurl(@me)'/]: 获取文章的分类目录并生成正确的 URL。[field:id/]: 文章 ID。[field:title/]: 文章标题。[field:description/]: 文章简介(。[field:pubdate function='MyDate('Y-m-d', @me)'/]: 格式化发布日期。
重要提示:
使用 {dede:sql} 标签可以直接在模板里完成查询,无需修改 index.php,但这种方法在首页高并发下性能稍差,但对于少量调用是可以接受的。
{dede:sql sql="SELECT * FROM `#@__archives` WHERE id=1"}
<a href="[field:arcurl/]">[field:title/]</a>
<p>[field:description/]</p>
{/dede:sql}
场景2:调用单篇文章的(例如文章ID为 1)
存储在 #@__addonarticle 表(对于文章模型)或 #@__articleadd 表中,我们需要联合查询。
第一步:修改 index.php
同样在 index.php 中,添加如下代码:
// 调用指定ID文章的正文内容
$article_body = $dsql->GetOne("SELECT a.body, a.title
FROM `#@__archives` ar
LEFT JOIN `#@__addonarticle` a ON ar.id = a.aid
WHERE ar.id = 1");
第二步:在首页模板中调用
在 index.htm 模板中,直接使用 {$article_body['body']} 来输出正文内容,DedeCMS 的正文内容通常是 HTML 格式,所以会直接渲染。
<div class="featured-content">
<h2>{$article_body['title']}</h2>
<div class="content">
{$article_body['body']}
</div>
</div>
场景3:调用多篇文章(例如ID为 1, 5, 10)
第一步:修改 index.php
在 index.php 中,使用 IN 关键字进行查询:
// 调用多个指定ID的文章
$article_ids = array(1, 5, 10); // 定义一个ID数组
$ids_str = implode(',', $article_ids); // 将数组转换为逗号分隔的字符串
$articles = $dsql->Execute("SELECT a.*, t.typedir
FROM `#@__archives` a
LEFT JOIN `#@__arctype` t ON a.typeid = t.id
WHERE a.id IN ({$ids_str})");
第二步:在首页模板中循环调用
在 index.htm 中,使用 {dede:loop} 标签来循环遍历查询结果。
<div class="article-list">
{dede:loop table='dede_archives a join dede_arctype t on a.typeid=t.id' sort='id' if='id in (1,5,10)'}
<div class="item">
<h3><a href="[field:typedir function='GetTypeurl(@me)'/]/[field:id/].html">[field:title/]</a></h3>
<p class="summary">[field:description/]</p>
<span class="info">发布于:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</div>
{/dede:loop}
</div>
{dede:loop} 标签说明:
table='...': 指定查询的表,这里我们使用JOIN连接了文章表和分类表。sort='id': 排序方式,这里按 ID 排序。if='id in (1,5,10)': 这是关键,指定了查询条件,直接在模板里写入了 ID 列表,非常方便。[field:...]: 在循环内部,使用field标签来输出每个文章的字段。
使用SQL自定义标签(纯模板操作)
如果你不想修改 index.php 文件,可以使用 {dede:sql} 标签直接在模板里执行 SQL,这种方法更灵活,但要注意性能,首页不宜过多使用。
调用单篇文章标题和简介 (ID=1):
{dede:sql sql="SELECT title,description FROM `#@__archives` WHERE id=1"}
<h2>[field:title/]</h2>
<p>[field:description/]</p>
{/dede:sql}
调用单篇文章正文内容 (ID=1):
{dede:sql sql="SELECT a.title, a.body FROM `#@__archives` ar LEFT JOIN `#@__addonarticle` a ON ar.id = a.aid WHERE ar.id=1"}
<h2>[field:title/]</h2>
<div>[field:body/]</div>
{/dede:sql}
调用多篇文章 (ID in 1,5,10):
{dede:sql sql="SELECT a.title, a.description, t.typedir FROM `#@__archives` a LEFT JOIN `#@__arctype` t ON a.typeid=t.id WHERE a.id IN (1,5,10)"}
<div class="item">
<a href="[field:typedir/]/[field:id/].html">[field:title/]</a>
<p>[field:description/]</p>
</div>
{/dede:sql}
注意:使用 JOIN 查询时,[field:typedir/] 这种写法可能无法正确获取,需要确保你的 SQL 查询字段名和模板标签名对应,对于复杂查询,推荐方法一。
总结与建议
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 首页少量、固定调用 | 修改 index.php |
性能最好,代码清晰,符合 DedeCMS 架构 | 需要修改核心文件,对新手有门槛 |
| 首页复杂、动态调用 | {dede:sql} |
纯模板操作,非常灵活,无需修改文件 | 首页频繁调用会影响性能,SQL 语法需要一定基础 |
| 列表页/内容页调用 | {dede:sql} 或 {dede:loop} |
灵活方便 | - |
给你的最终建议:
- 如果调用的是固定不变的内容(比如一个公告),并且你希望网站速度最快,请使用 方法一。
- 如果你只是临时需要,或者调用条件比较复杂多变,并且调用量不大,使用 方法二 (
{dede:sql}) 更快捷方便。 - 调用多篇文章,使用
{dede:loop}标签是模板内最优雅、最高效的方式。
希望这份详细的教程能帮助你解决问题!如果在操作中遇到任何问题,可以随时追问。
