在构建基于Dedecms的网站时,许多用户发现默认导航无法调用SEO标题(seotitle)。这确实是一个常见的问题,但通过一些简单的修改,我们可以轻松解决。以下是详细的解决方案。
### 问题描述 Dedecms默认的导航标签 `{dede:channel}` 并不支持直接调用栏目SEO标题(seotitle)。例如,在以下代码中:

{dede:channel type='top'}
    [field:typename/]
{/dede:channel}
    
我们希望 `[field:typename/]` 能够替换为 `{dede:field.seotitle /}`,从而实现调用栏目SEO标题的功能。
### 解决方案 #### 第一步:修改 `channel.lib.php` 1. 打开 Dedecms 的 `/include/taglib` 文件夹下的 `channel.lib.php` 文件。 2. 定位到大约第 78 行到 94 行的代码段,这部分代码用于定义 SQL 查询语句。 以下是原始代码示例:

if($type=='top') {
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath 
            FROM `dede_arctype` WHERE reid=0 And ishidden<>1 order by sortrank asc limit 0, $line ";
} else if($type=='son') {
    if($typeid==0) return '';
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath 
            FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 order by sortrank asc limit 0, $line ";
} else if($type=='self') {
    if($reid==0) return '';
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath 
            FROM `dede_arctype` WHERE reid='$reid' And ishidden<>1 order by sortrank asc limit 0, $line ";
}
    
我们需要在 SQL 查询语句中添加 `seotitle` 字段。修改后的代码如下:

if($type=='top') {
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath, seotitle 
            FROM `dede_arctype` WHERE reid=0 And ishidden<>1 order by sortrank asc limit 0, $line ";
} else if($type=='son') {
    if($typeid==0) return '';
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath, seotitle 
            FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 order by sortrank asc limit 0, $line ";
} else if($type=='self') {
    if($reid==0) return '';
    $sql = "SELECT id, typename, typedir, isdefault, ispart, defaultname, namerule2, moresite, siteurl, sitepath, seotitle 
            FROM `dede_arctype` WHERE reid='$reid' And ishidden<>1 order by sortrank asc limit 0, $line ";
}
    
通过上述修改,SQL 查询将包含 `seotitle` 字段。
#### 第二步:处理高亮状态下的 SEO 标题调用 接下来,我们需要确保在导航栏高亮状态下也能正确调用 SEO 标题。为此,需要进一步修改 `channel.lib.php` 文件。 1. 定位到大约第 140 行。 2. 在现有代码的基础上新增一行:

$linkOkstr = str_replace("~seotitle~", $row['seotitle'], $linkOkstr);
    
这一行代码的作用是将模板中的 `~seotitle~` 替换为实际的 SEO 标题内容。
#### 第三步:更新模板代码 最后,在模板文件中使用以下代码:

{dede:channel type='top' currentstyle="
  • ~typename~
    [field:seotitle/]
  • "}
  • [field:typename/]
    [field:seotitle/]
  • {/dede:channel}
    这样,当鼠标悬停或点击导航项时,SEO 标题将被正确显示。
    ### 总结 通过以上步骤,我们成功实现了 Dedecms 导航栏中对 SEO 标题的支持。这种方法不仅提高了用户体验,还增强了网站的搜索引擎优化能力。如果你遇到类似问题,可以按照上述方法进行操作。