调用所有栏目标题的需求场景
在织梦CMS开发中,经常需要在首页、网站地图(sitemap)或底部导航中调用网站的所有栏目标题,形成完整的栏目导航结构。织梦CMS提供了多种方式来实现这一功能。
方法一:使用 channel 标签调用所有顶级栏目
获取所有顶级栏目(一级栏目)标题:
<!-- 调用所有顶级栏目标题(不含子栏目) -->
{dede:channel type='top' row='50'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
方法二:调用所有栏目(含子栏目,形成完整导航树)
使用嵌套channel标签实现多级栏目目录:
<!-- 循环顶级栏目,同时调用其子栏目 -->
{dede:channel type='top' row='20' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 如果有子栏目则显示 -->
{dede:channel type='son' row='50'}
<ul>
<li><a href="[field:typelink/]">├ [field:typename/]</a></li>
</ul>
{/dede:channel}
</li>
{/dede:channel}
方法三:使用 SQL 标签直接查询所有栏目
通过SQL查询获取所有栏目信息,不受标签嵌套限制:
<!-- SQL方式获取所有栏目标题 -->
{dede:sql sql="SELECT id,typename,typedir,reid FROM dede_arctype WHERE ishidden=0 ORDER BY sortrank ASC"}
<li><a href="[field:typedir/]">[field:typename/]</a></li>
{/dede:sql}
方法四:使用 SQL 标签实现完整栏目树
<!-- 使用SQL标签构建完整的栏目层级结构 -->
{dede:php}
// 获取所有栏目数据
$dsql->SetQuery("SELECT id,typename,typedir,reid
FROM dede_arctype
WHERE ishidden=0
ORDER BY reid ASC, sortrank ASC");
$dsql->Execute();
$types=array();
while($row=$dsql->GetArray()){
$types[$row['reid']][]=$row;
}
// 递归输出
function showTypes($types, $reid=0, $level=0){
if(!isset($types[$reid])) return;
$prefix=str_repeat('— ', $level);
foreach($types[$reid] as $t){
echo '<li>'.$prefix.'<a href="'.$t['typedir'].'">'.$t['typename'].'</a></li>';
showTypes($types, $t['id'], $level+1);
}
}
showTypes($types);
{/dede:php}
方法五:使用 channelartlist 按层级展示栏目
<!-- 显示所有顶级栏目及其子栏目的结构 -->
{dede:channelartlist typeid='0' row='20'}
<div class="channel-group">
<h3><a href="{dede:field name='typelink'/}">
{dede:field name='typename'/}
</a></h3>
<ul>
<!-- 获取该栏目下的子栏目标题 -->
{dede:channel type='son'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
{/dede:channelartlist}
方法六:生成网站地图(Sitemap)
利用上述方法生成HTML网站地图页面:
<!DOCTYPE html>
<html>
<head><title>网站地图 - {dede:global.cfg_webname/}</title></head>
<body>
<h1>网站地图</h1>
<!-- 获取所有顶级栏目及其子栏目 -->
{dede:channel type='top' row='100'}
<h2><a href="[field:typelink/]">[field:typename/]</a></h2>
<ul>
{dede:channel type='son' row='100'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
{/dede:channel}
</body>
</html>
常用过滤条件
调用所有栏目时可根据需要添加过滤:
<!-- 仅调用未隐藏的栏目 -->
{dede:sql sql="SELECT * FROM dede_arctype WHERE ishidden=0"}
<!-- 只调用顶级栏目 -->
{dede:channel type='top'}
<!-- 排除特定ID的栏目 -->
{dede:channel type='top' typeid='3,5' currentstyle=''}
<!-- typeid为排除的栏目ID -->
<!-- 使用reid=0获取顶级栏目 -->
{dede:sql sql="SELECT * FROM dede_arctype WHERE reid=0 AND ishidden=0"}
SEO建议:将所有栏目整理为网站地图(sitemap)页面,有助于搜索引擎快速抓取和索引网站的全部内容结构,提升收录效率。