以下是几种常见且有效的方法,涵盖了从模板到PHP代码的各种情况。

在当前文章页面获取当前文章ID (最常用)
这是最常见的需求,比如在文章详情页 (article_article.htm) 想要获取当前正在浏览的文章的ID。
使用全局变量 $arcid
在织梦的模板文件中,可以直接使用一个预定义的全局变量 $arcid 来获取当前文章的ID,这个变量在文章内容页、文章列表页等页面都会被自动设置。
示例:
在文章详情页 (/templets/default/article_article.htm) 的任意位置,你可以这样使用:
<p>当前文章的ID是:{dede:global name='arcid'/}</p>
或者直接在PHP代码块中使用:

{dede:geturl runphp='yes'}
@me = "当前文章的ID是:" . $arcid;
{/dede:geturl}
优点:
- 最简单、最直接,无需任何额外的标签或查询。
- 性能最好,因为是直接读取的内存变量。
适用场景:
- 在文章详情页 (
article_article.htm)。 - 在文章列表页等与文章相关的页面,获取当前上下文的文章ID。
使用 {dede:field}
{dede:field} 标签用于获取当前文章的某个具体字段。id 就是其中一个字段。
示例:
在文章详情页 (article_article.htm) 中:
(图片来源网络,侵删)
<p>当前文章的ID是:{dede:field.id/}</p>
或者,如果你想同时获取文章ID和标题:
<p>
文章ID: {dede:field.id/}
文章标题: {dede:field.title/}
</p>
优点:
- 语义清晰,明确表示要获取“字段”。
- 除了ID,还可以方便地获取
title, description, pubdate 等所有文章字段。
适用场景:
- 在文章详情页,当你不仅需要ID,还需要其他文章信息时,非常方便。
在列表页或其他页面获取指定文章ID
如果你想在列表页 (list_article.htm) 或首页 (index.htm) 中,通过某种条件(比如标题、关键词)来查询并获取某篇文章的ID,这时就需要用到SQL查询。
使用 {dede:sql} 标签进行自定义查询
{dede:sql} 标签允许你在模板中直接执行SQL语句。
示例1:根据文章标题获取ID
假设你想获取标题为“织梦CMS教程”的文章的ID。
{dede:sql sql="SELECT id FROM dede_archives WHERE title='织梦CMS教程'"}
<p>找到的文章ID是:[field:id/]</p>
{/dede:sql}
注意:
dede_archives 是织梦存储文章基本信息的核心表。
- 中包含单引号 ,可能会导致SQL语法错误,需要进行转义处理,织梦通常有内置的函数来处理,但直接写死字符串时要注意。
- 这种方法效率较低,不推荐在循环中频繁使用。
示例2:根据文章别名获取ID (更推荐)
使用文章别名比标题更稳定,因为别名是唯一的。
{dede:sql sql="SELECT id FROM dede_archives WHERE alias='dede-tutorial'"}
<p>找到的文章ID是:[field:id/]</p>
{/dede:sql}
在PHP代码或文件中获取文章ID
如果你在织梦的PHP文件(如 include/extend.func.php 自定义函数,或者PHP页面模板)中需要获取文章ID,方法与模板中略有不同。
在当前文章页面 (article.php)
article.php 是处理文章详情页的PHP文件,你可以通过全局变量 $arcid 来获取。
// 在 article.php 或其包含的文件中
$article_id = $arcid;
// 现在你可以在PHP代码中使用 $article_id 这个变量
echo "当前文章的ID是: " . $article_id;
在列表页或其他页面
在其他页面,$arcid 可能不存在或不是你想要的值,这时你需要手动获取。
示例:在列表页 (list.php) 获取当前栏目下的文章ID
// 在 list.php 或其包含的文件中
// 假设你已经知道了当前栏目的ID ($typeid 变量已存在)
$channelid = 1; // 假设是文章模型ID,通常为1
$catid = $typeid; // 当前栏目ID
// 使用DedeCMS的数据库类进行查询
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT id FROM dede_archives WHERE channelid = $channelid AND typeid = $catid ORDER BY id DESC LIMIT 1");
$dsql->Execute('get_id');
if($row = $dsql->GetArray('get_id')) {
$lastest_article_id = $row['id'];
echo "最新一篇文章的ID是: " . $lastest_article_id;
}
$dsql->Close();
总结与对比
方法
适用场景
优点
缺点
{dede:global name='arcid'/}
当前文章详情页
最简单、性能最高
仅限当前页面,无法主动查询
{dede:field.id/}
当前文章详情页
语义清晰,可同时获取其他字段
仅限当前页面
{dede:sql}
在任意模板中根据条件查询
灵活,可以按任意条件查找
性能较差,不推荐循环使用,有SQL注入风险
PHP代码 $arcid
在PHP文件(如article.php)中
直接、高效
依赖于页面上下文,不通用
PHP代码 DedeSql
在PHP文件中需要复杂查询
功能强大,灵活
代码量稍多,需要了解数据库结构
核心建议:
- 如果你在文章详情页 (
article_article.htm) 想要当前文章的ID,请毫不犹豫地使用 {dede:global name='arcid'/} 或 {dede:field.id/},这是最标准、最高效的方式。
- 如果你需要在首页、列表页等地方根据标题、别名等条件去查找某篇文章的ID,才考虑使用
{dede:sql} 标签,但要尽量减少使用频率。
- 如果你在编写PHP扩展或修改PHP文件,请使用全局变量
$arcid 或 DedeSql 类进行查询。
{dede:field} 标签用于获取当前文章的某个具体字段。id 就是其中一个字段。
示例:
在文章详情页 (article_article.htm) 中:

<p>当前文章的ID是:{dede:field.id/}</p>
或者,如果你想同时获取文章ID和标题:
<p>
文章ID: {dede:field.id/}
文章标题: {dede:field.title/}
</p>
优点:
- 语义清晰,明确表示要获取“字段”。
- 除了ID,还可以方便地获取
title,description,pubdate等所有文章字段。
适用场景:
- 在文章详情页,当你不仅需要ID,还需要其他文章信息时,非常方便。
在列表页或其他页面获取指定文章ID
如果你想在列表页 (list_article.htm) 或首页 (index.htm) 中,通过某种条件(比如标题、关键词)来查询并获取某篇文章的ID,这时就需要用到SQL查询。
使用 {dede:sql} 标签进行自定义查询
{dede:sql} 标签允许你在模板中直接执行SQL语句。
示例1:根据文章标题获取ID
假设你想获取标题为“织梦CMS教程”的文章的ID。
{dede:sql sql="SELECT id FROM dede_archives WHERE title='织梦CMS教程'"}
<p>找到的文章ID是:[field:id/]</p>
{/dede:sql}
注意:
dede_archives是织梦存储文章基本信息的核心表。- 中包含单引号 ,可能会导致SQL语法错误,需要进行转义处理,织梦通常有内置的函数来处理,但直接写死字符串时要注意。
- 这种方法效率较低,不推荐在循环中频繁使用。
示例2:根据文章别名获取ID (更推荐)
使用文章别名比标题更稳定,因为别名是唯一的。
{dede:sql sql="SELECT id FROM dede_archives WHERE alias='dede-tutorial'"}
<p>找到的文章ID是:[field:id/]</p>
{/dede:sql}
在PHP代码或文件中获取文章ID
如果你在织梦的PHP文件(如 include/extend.func.php 自定义函数,或者PHP页面模板)中需要获取文章ID,方法与模板中略有不同。
在当前文章页面 (article.php)
article.php 是处理文章详情页的PHP文件,你可以通过全局变量 $arcid 来获取。
// 在 article.php 或其包含的文件中 $article_id = $arcid; // 现在你可以在PHP代码中使用 $article_id 这个变量 echo "当前文章的ID是: " . $article_id;
在列表页或其他页面
在其他页面,$arcid 可能不存在或不是你想要的值,这时你需要手动获取。
示例:在列表页 (list.php) 获取当前栏目下的文章ID
// 在 list.php 或其包含的文件中
// 假设你已经知道了当前栏目的ID ($typeid 变量已存在)
$channelid = 1; // 假设是文章模型ID,通常为1
$catid = $typeid; // 当前栏目ID
// 使用DedeCMS的数据库类进行查询
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT id FROM dede_archives WHERE channelid = $channelid AND typeid = $catid ORDER BY id DESC LIMIT 1");
$dsql->Execute('get_id');
if($row = $dsql->GetArray('get_id')) {
$lastest_article_id = $row['id'];
echo "最新一篇文章的ID是: " . $lastest_article_id;
}
$dsql->Close();
总结与对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
{dede:global name='arcid'/} |
当前文章详情页 | 最简单、性能最高 | 仅限当前页面,无法主动查询 |
{dede:field.id/} |
当前文章详情页 | 语义清晰,可同时获取其他字段 | 仅限当前页面 |
{dede:sql} |
在任意模板中根据条件查询 | 灵活,可以按任意条件查找 | 性能较差,不推荐循环使用,有SQL注入风险 |
PHP代码 $arcid |
在PHP文件(如article.php)中 |
直接、高效 | 依赖于页面上下文,不通用 |
PHP代码 DedeSql |
在PHP文件中需要复杂查询 | 功能强大,灵活 | 代码量稍多,需要了解数据库结构 |
核心建议:
- 如果你在文章详情页 (
article_article.htm) 想要当前文章的ID,请毫不犹豫地使用{dede:global name='arcid'/}或{dede:field.id/},这是最标准、最高效的方式。 - 如果你需要在首页、列表页等地方根据标题、别名等条件去查找某篇文章的ID,才考虑使用
{dede:sql}标签,但要尽量减少使用频率。 - 如果你在编写PHP扩展或修改PHP文件,请使用全局变量
$arcid或DedeSql类进行查询。
