使用 GetSonIds 函数(推荐,最常用)
这是最标准、最官方的方法,它通过获取指定栏目的所有子栏目(包括副栏目)的ID,然后使用这些ID来查询内容。

(图片来源网络,侵删)
适用场景:
在列表页(list_article.htm页(article_article.htm)中,调用当前栏目的副栏目下的文章。
核心函数:
GetSonIds($typeid, $type = 'son', $channel = '')
$typeid: 父栏目的ID。$type:'son'表示获取所有子栏目ID(包括副栏目)。$channel: 可选,指定模型ID。
示例代码:
假设你在列表页模板 list_article.htm 中,想调用当前栏目及其所有副栏目下的文章。

(图片来源网络,侵删)
-
获取当前栏目ID: 在列表页,
$typeid变量已经存在,它就是当前栏目的ID。 -
调用副栏目文章: 将以下代码放入你的列表循环标签
{dede:list}之前。{dede:list pagesize='10'} <!-- 这里是你的文章列表循环内容 --> <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span> </li> {/dede:list} <!-- 如果想在列表页上方显示一个“副栏目推荐”模块,可以这样写 --> <h3>副栏目推荐</h3> <ul> {dede:arclist titlelen='30' row='5'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} </ul>上面的代码是错误的,因为
{dede:arclist}默认只在当前栏目下查找,我们需要修改它。 -
修改后的正确代码:
在
{dede:arclist}标签中使用typeid属性,并调用GetSonIds函数。<!-- 获取当前栏目ID及其所有副栏目的ID,并调用这些栏目下的文章 --> {dede:arclist typeid='GetSonIds(@me)' titlelen='30' row='5'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist}代码解释:
typeid='GetSonIds(@me)': 这是关键。@me在这里代表当前栏目的ID(即$typeid的值)。GetSonIds(@me)会计算出当前栏目ID及其所有副栏目的ID,1,5,6,8。typeid属性接收到这个ID字符串后,就会在这些指定的栏目中查找文章。
直接调用副栏目名称和链接
如果你只是想在文章内容页或列表页中,显示当前文章或栏目所属的“副栏目”的名称和链接,而不是调用副栏目的文章,那么方法更直接。
适用场景: 在文章详情页,显示这篇文章所属的“副栏目”的名称。
核心字段:
[field:typename/]: 主栏目名称。[field:typelink/]: 主栏目链接。[field:position/]: 包含主栏目和副栏目的面包屑导航路径。
示例代码(在文章内容页 article_article.htm 中):
主栏目: <a href="[field:typelink/]">[field:typename/]</a>
<!-- 直接使用面包屑导航,它已经包含了副栏目信息 -->
当前位置: [field:position/]
<!-- 如果你想单独、清晰地列出副栏目,可以这样处理 -->
副栏目:
{dede:field.typearray runphp='yes'}
// @me 是一个数组,包含主栏目和所有副栏目
$types = @me;
if(is_array($types)){
foreach($types as $type){
// 跳过第一个元素(主栏目)
if($type['id'] == $GLOBALS['typeid']) continue;
echo "<a href='".$type['typeurl']."'>".$type['typename']."</a> ";
}
}
{/dede:field.typearray}
代码解释:
{dede:field.typearray runphp='yes'}: 这个标签会生成一个包含栏目信息的数组。$types = @me;将数组赋值给变量$types。foreach($types as $type)遍历这个数组。if($type['id'] == $GLOBALS['typeid']) continue;这一行非常重要,它用于跳过主栏目,只处理副栏目。echo "<a href='".$type['typeurl']."'>".$type['typename']."</a> ";循环输出副栏目的链接和名称。
使用SQL直接查询(灵活,但需谨慎)
如果你有更复杂的需求,或者上面的方法无法满足,可以直接执行SQL查询。
适用场景: 需要非常复杂的条件筛选,或者需要在非模板文件(如PHP文件)中获取副栏目信息。
示例代码(在模板文件中使用):
{dede:sql sql='SELECT typename, typedir FROM dede_arctype WHERE id IN (SELECT reid FROM dede_arctype WHERE id = ~typeid~)'}
<a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">[field:typename/]</a>
{/dede:sql}
代码解释:
sql='...': SQL查询语句。~typeid~: 这是DedeCMS模板中一个特殊的写法,它会自动替换为当前栏目的ID。- 内层查询
(SELECT reid FROM dede_arctype WHERE id = ~typeid~):reid字段存储的是副栏目的“关联ID”,这个查询会找到当前栏目所有副栏目的ID。 - 外层查询
SELECT ... WHERE id IN (...):根据上一步查到的副栏目ID,去dede_arctype表中查询这些栏目的名称和目录。
注意:
- 直接使用SQL有一定风险,如果表名或字段名被修改,代码会失效。
- 在模板中使用SQL可能会影响页面加载速度,请谨慎使用。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
GetSonIds |
官方推荐,最标准,安全高效,代码简洁。 | 只能用于调用文章,不能直接获取栏目名称。 | 列表页调用副栏目下的文章,这是最常见的用法。 |
typearray |
能直接获取副栏目的名称和链接,逻辑清晰。 | 代码稍复杂,需要PHP基础。 | 在文章页或列表页显示副栏目的名称,而不是调用文章。 |
| SQL查询 | 非常灵活,可以实现任何复杂逻辑。 | 有一定风险,可能不安全,代码可读性差。 | 复杂的自定义需求,或在PHP后端代码中处理。 |
对于绝大多数用户来说,方法一和方法二已经足够解决99%的需求,请优先使用这两种方法。
希望这些详细的解释能帮助你成功调用DedeCMS的副栏目名称!
