在织梦(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实现。

 
                             
         
         
         
         
         
         
         
         
         
        