织梦cms 调用所有栏目标题

调用所有栏目标题的需求场景

在织梦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)页面,有助于搜索引擎快速抓取和索引网站的全部内容结构,提升收录效率。