使用 GetSonIds() 自定义函数 (最常用、最推荐)
这是获取当前栏目及其所有子栏目下文章 ID 的标准方法,它特别适用于当你需要一个栏目列表(产品分类”)并且希望点击这个分类时,能展示它自己以及它下面所有子分类的文章。
步骤 1: 确保函数存在
这个函数通常存在于 /include/common.func.php 文件中,请打开你的网站根目录下的这个文件,查找是否存在 GetSonIds() 函数,如果不存在,请将以下代码添加到文件末尾:
/**
* 获取子栏目ID
* @param int $typeid 父栏目ID
* @param string $symbol 返回ID之间的连接符号,默认为逗号
* @return string 返回子栏目ID字符串
*/
if (!function_exists('GetSonIds'))
{
function GetSonIds($typeid, $symbol = ',')
{
global $dsql;
$ids = '';
$query = "SELECT id FROM `#@__arctype` WHERE reid='$typeid' OR topid='$typeid'";
$dsql->SetQuery($query);
$dsql->Execute();
while ($row = $dsql->GetArray())
{
$ids .= $row['id'] . $symbol;
// 递归调用,获取所有层级的子栏目
$son_ids = GetSonIds($row['id'], $symbol);
if ($son_ids) {
$ids .= $son_ids;
}
}
return trim($ids, $symbol);
}
}
提示:在较新版本的 DedeCMS 中,这个函数通常是自带的,如果你的模板标签
{dede:field.typeid/}能正常工作,那么这个函数大概率也已经存在了。
步骤 2: 在模板文件中使用
在你需要调用文章列表的模板文件中(list_article.htm),使用 {dede:arclist} 标签,并通过 typeid 属性调用这个函数。
示例代码:
{dede:arclist len='30'
row='10'
orderby='pubdate'
orderway='desc'
typeid='GetSonIds(@me)'
}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
代码解释:
typeid='GetSonIds(@me)': 这是核心部分。@me: 这是 DedeCMS 模板中的一个特殊变量,在这里它代表当前栏目的 ID,即{dede:field.typeid/}的值。GetSonIds(): 我们刚刚添加的自定义函数。- 整个
typeid属性的值会被解析为GetSonIds(当前栏目ID),函数会返回一个由当前栏目ID和所有子栏目ID组成的、用逗号分隔的字符串,5,6,7,8。
{dede:arclist}: 这是 DedeCMS 的文章列表调用标签,len='30'`: 标题长度,最多显示30个字符。row='10': 调用10篇文章。orderby='pubdate': 按发布时间排序。orderway='desc': 降序排列(最新的在前)。
直接使用当前栏目 ID (仅限当前栏目)
如果你只想获取当前栏目本身下的文章,而不包含其子栏目,那么方法就非常简单了。
步骤 1: 在模板文件中使用
直接在 {dede:arclist} 标签中指定 typeid 为当前栏目。
示例代码:
{dede:arclist len='30'
row='10'
orderby='pubdate'
orderway='desc'
typeid='{dede:field.typeid/}'
}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
代码解释:
typeid='{dede:field.typeid/}': 这里我们直接使用了{dede:field.typeid/}标签来获取当前栏目的ID。{dede:arclist}会只从这个ID对应的栏目中调用文章。
使用“自由列表” (后台配置,无需修改代码)
如果你不想修改任何模板文件,或者这个需求是临时的,可以使用 DedeCMS 后台的“自由列表”功能。
步骤 1: 进入自由列表管理
- 登录 DedeCMS 后台。
- 在左侧菜单栏找到 【核心】 -> 【自由列表】。
- 点击 “增加一个自由列表”。
步骤 2: 配置自由列表
-
列表名称: 填写一个你容易识别的名称,公司新闻列表”。
-
按SQL语句查询: 选择这个选项。
-
SQL语句: 输入以下查询语句。
- 仅当前栏目:
SELECT * FROM `#@__archives` WHERE typeid = '{dede:field.typeid/}' ORDER BY pubdate DESC - 当前栏目及所有子栏目:
SELECT * FROM `#@__archives` WHERE typeid IN (SELECT id FROM `#@__arctype` WHERE reid = '{dede:field.typeid/}' OR id = '{dede:field.typeid/}') ORDER BY pubdate DESC或者,如果你已经添加了
GetSonIds函数,也可以这样写(更简洁):SELECT * FROM `#@__archives` WHERE typeid IN ({dede:php}echo GetSonIds(@me);{/dede:php}) ORDER BY pubdate DESC注意: 在自由列表的SQL中,
{dede:field.typeid/}需要用单引号括起来,因为它在PHP中是一个字符串。
- 仅当前栏目:
-
保存: 点击“保存”按钮。
步骤 3: 调用生成的列表
保存后,系统会生成一个频道,你可以在后台的“频道管理”中找到这个新创建的自由列表频道,它会生成一个固定的链接(如 /plus/list.php?tid=自定义ID),你可以在任何页面通过 <a href="/plus/list.php?tid=自定义ID">公司新闻</a> 的形式来调用这个列表。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
方法一: GetSonIds() |
最灵活、最强大,支持递归获取所有子栏目,是 DedeCMS 的标准做法。 | 需要确保 /include/common.func.php 中有此函数。 |
绝大多数情况,特别是需要展示分类树及其下所有内容的场景。 |
方法二: 直接 typeid |
最简单、最直接,无需任何额外函数。 | 只能获取当前栏目本身的内容,不包含子栏目。 | 只需要展示当前栏目、不涉及子分类的简单列表。 |
| 方法三: 自由列表 | 无需修改模板,后台配置即可,适合临时需求。 | 不够灵活,每次修改都需要进后台,且不能直接在模板中动态使用 @me。 |
临时生成一个特殊列表,或不想触碰模板文件时。 |
对于绝大多数开发者来说,强烈推荐使用方法一 (GetSonIds()),因为它是最规范、最可扩展的解决方案。
