在织梦(DedeCMS)系统中,调取单篇文章是网站开发中常见的需求,例如在首页展示指定文章、在栏目页调用特定内容或制作自定义页面时,织梦提供了多种灵活的方式实现单篇文章的调取,主要包括使用SQL语句、arclist标签、dede标签以及自定义函数等方法,以下将详细介绍这些方法的实现步骤和注意事项。

使用SQL语句直接查询
SQL语句是最直接的方式,适用于需要灵活查询条件的场景,通过织梦的dsql
类或$dsql
全局变量,可以执行自定义SQL语句获取单篇文章数据,要获取ID为10的文章,可以使用以下代码:
<?php $row = $dsql->GetOne("SELECT * FROM `dede_archives` LEFT JOIN `dede_addonarticle` ON `dede_archives`.id=`dede_addonarticle`.aid WHERE `dede_archives`.id = 10"); if($row){ echo $row['title']; // 输出文章标题 echo $row['body']; // 输出文章内容 } ?>
注意事项:
- 表名前需添加表前缀(如
dede_
),若未修改默认前缀可直接使用。 - 建议使用
GetOne
方法直接获取单条数据,避免使用GetAll
造成资源浪费。 - 涉及多表联查时,需确保关联字段正确(如
archives.id
与addonarticle.aid
)。
使用arclist标签调用
arclist标签是织梦最常用的内容调用标签,通过指定id
或aid
参数可调取单篇文章。
{dede:arclist id='10' titlelen='50'} <h3><a href="[field:arcurl/]">[field:title/]</a></h3> <p>[field:body/]</p> {/dede:arclist}
参数说明:

id
:文章ID,多个ID用逗号分隔(如id='10,12'
)。aid
:与id
功能类似,但aid
优先级更高。 len`:标题长度限制,单位为字符。row
:显示条数,调取单篇文章时设为1
。
局限性:arclist标签默认不直接支持调用文章内容(body
字段),需结合php
标签使用,如下所示:
{dede:php} $row = $dsql->GetOne("SELECT body FROM `dede_addonarticle` WHERE aid = 10"); echo $row['body']; {/dede:php}
使用dede标签(如field、artlist)
在文章详情页或自定义页面中,可直接使用织梦内置标签获取当前文章信息,在文章内容页(article_article.htm
)中:
{dede:field.title/} <!-- 文章标题 --> {dede:field.body/} <!-- 文章内容 -->
若需在非文章页调取指定ID的文章,可通过{dede:sql}
标签实现:
{dede:sql sql="SELECT title, body FROM `dede_archives` LEFT JOIN `dede_addonarticle` ON id=aid WHERE id=10"} <h3>[field:title/]</h3> <p>[field:body/]</p> {/dede:sql}
通过自定义函数或封装方法
对于频繁调用的场景,可封装自定义函数到include/common.func.php
文件中。

function getArticle($id){ global $dsql; $row = $dsql->GetOne("SELECT * FROM `dede_archives` LEFT JOIN `dede_addonarticle` ON id=aid WHERE id=$id"); return $row; }
在模板中调用:
<?php $article = getArticle(10); if($article){ echo $article['title']; echo $article['body']; } ?>
不同场景下的选择建议
场景 | 推荐方法 | 优点 | 缺点 |
---|---|---|---|
需要复杂查询条件 | SQL语句 | 灵活度高,可自定义字段 | 需编写SQL,易出错 |
首页/栏目页简单调用 | arclist标签 | 标签化调用,无需代码 | 内容调用需额外处理 |
文章详情页或静态页 | dede标签(field/sql) | 直接调用,无需额外代码 | 仅限特定模板文件使用 |
多次复用或复杂逻辑 | 自定义函数 | 代码复用,逻辑清晰 | 需修改核心文件 |
相关问答FAQs
Q1:为什么使用arclist标签调取的文章内容为空?
A:arclist标签默认不支持直接调用文章内容(body
字段),需通过{dede:php}
标签结合SQL语句获取内容,或改用{dede:sql}
标签直接查询数据库,需确保文章类型为“普通文章”,否则需关联对应附加表(如dede_addonarticle
)。
Q2:调取单篇文章时如何排除特定栏目?
A:在SQL语句中添加NOT IN
条件,
$row = $dsql->GetOne("SELECT * FROM `dede_archives` WHERE id=10 AND typeid NOT IN(3,5)");
其中typeid NOT IN(3,5)
表示排除栏目ID为3和5的文章,若使用arclist标签,可通过channelid
或typeid
参数指定栏目,但排除功能需结合SQL实现。