dede全站相关文章如何高效实现?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 DEDE建站 正文

“全站相关文章”指的是根据当前文章的某些特征(如关键词、标签、所属栏目等),从整个网站的所有文章中找出与之关联的文章列表,这不仅能提高网站的用户粘性,还能增加内链,对SEO非常有益。

dede全站相关文章
(图片来源网络,侵删)

实现这个功能主要有以下几种思路,从简单到复杂,你可以根据自己的需求选择:


利用DedeCMS自带的“相关文章”标签(最简单,但非全站)

这是最基础的方法,但它有一个局限性:它默认只搜索当前文章所在栏目下的文章,而不是全站。

适用场景:只需要在当前栏目下显示相关文章。

标签代码

dede全站相关文章
(图片来源网络,侵删)
{dede:likearticle row='10' titlelen='42'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:likearticle}

参数说明

  • row='10':显示10条相关文章,len='42'`:标题最多显示42个字符(一个汉字算2个字符)。

如何让它变成“全站”相关? 默认情况下,likearticle 标签会从 #@__arccat (栏目关联表)中查找当前文章所属的栏目ID,然后只在这些栏目里搜索,要让它搜索全站,我们需要稍微修改一下。

  1. 找到并打开 /include/taglib/likearticle.lib.php 文件。
  2. 找到下面这段代码(大约在第15行):
    $typeid = " And (arc.typeid IN ($typeid) OR arc.typeid2 IN ($typeid)) ";
  3. 将其注释掉或删除,改为一个始终为真的条件,
    // $typeid = " And (arc.typeid IN ($typeid) OR arc.typeid2 IN ($typeid)) ";
    $typeid = " AND 1=1 "; // 这样就不再限制栏目了,会搜索全站
  4. 保存文件。{dede:likearticle} 标签就会在全站范围内查找相关文章了。

优点

  • 实现简单,无需额外插件。
  • 系统自带,兼容性好。

缺点

dede全站相关文章
(图片来源网络,侵删)
  • 相关性算法单一,主要基于关键词匹配。
  • 需要修改核心文件,升级DedeCMS时可能会被覆盖。

基于“关键词”实现全站相关文章(推荐,灵活可控)

这是最常用且效果较好的方法,通过获取当前文章的关键词,然后在整个网站的数据库中搜索包含这些关键词的文章。

适用场景:希望根据文章的核心关键词来展示全站相关内容。

标签代码: 你可以将以下代码保存为一个独立的文件,my_like_article.htm,然后在需要的地方通过 {include file='my_like_article.htm'} 来调用。

{dede:field name='keywords' runphp='yes'}
    if(@me != ""){
        $kw = explode(',', @me);
        $kws = '';
        foreach($kw as $k){
            $kws .= " AND arc.keywords LIKE '%$k%'";
        }
        @me = " $kws ";
    }else{
        @me = " AND 1=0 "; // 如果没有关键词,就不显示任何文章
    }
{/dede:field}
{dede:sql sql="SELECT arc.id, arc.title, arc.typeid, arc.litpic, tp.typename
                FROM dede_archives arc
                LEFT JOIN dede_arctype tp ON arc.typeid = tp.id
                WHERE 1=1 AND arc.arcrank > -1 [field:global name=autokeyword /]
                ORDER BY arc.id DESC
                LIMIT 0, 10"}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me, 30)'/]</a>
        <span class="type">([field:typename/])</span>
    </li>
{/dede:sql}

代码解析

  1. {dede:field name='keywords'...}:获取当前文章的关键词,并用逗号分割成一个数组。
  2. foreach($kw as $k):遍历每个关键词,并构建一个SQL查询条件,AND arc.keywords LIKE '%关键词1%' AND arc.keywords LIKE '%关键词2%'
  3. [field:global name=autokeyword /]:将上一步构建好的SQL条件注入到下面的 sql 标签中。
  4. dede:sql:执行自定义的SQL查询。
    • SELECT ... FROM dede_archives arc ...:从文章表和栏目表中查询数据。
    • WHERE 1=1 AND arc.arcrank > -1 [field:global name=autokeyword /]:查询条件,arc.arcrank > -1 确保只审核通过的文章。
    • ORDER BY arc.id DESC LIMIT 0, 10:按发布时间倒序排列,并限制为10条。

优点

  • 真正的全站搜索,不局限于当前栏目。
  • 相关性基于文章关键词,比较准确。
  • 灵活性高,可以自定义SQL查询,比如增加权重、排除当前文章等。

缺点

  • 需要手动编写SQL,对新手有一定门槛。
  • 如果网站文章非常多,可能会对数据库造成一定压力。

基于“TAG标签”实现全站相关文章(效果最好,需开启TAG功能)

如果你的网站启用了TAG(标签)功能,那么基于TAG来查找相关文章是效果最好的方法,因为TAG比关键词更自由、更精准。

适用场景:网站已启用TAG功能,希望展示与当前文章标签高度相关的内容。

标签代码: 同样,你可以将以下代码保存为一个模板文件(如 my_tag_like_article.htm)并引入。

{dede:field name='tag' runphp='yes'}
    if(@me != ""){
        $tags = explode(',', @me);
        $tagids = '';
        // 先通过标签名找到标签ID
        foreach($tags as $tag){
            $row = $dsql->GetOne("SELECT id FROM dede_tag WHERE tagname = '$tag'");
            if(is_array($row)){
                $tagids .= (empty($tagids) ? $row['id'] : ','.$row['id']);
            }
        }
        // 如果找到了标签ID,则进行下一步查询
        if($tagids != ''){
            // 查询包含这些标签的文章
            $query = "SELECT count(*) as c FROM dede_taglist WHERE tagid IN ($tagids) GROUP BY aid";
            $dsql->Execute('me', $query);
            $aids = '';
            while($row = $dsql->GetArray('me')){
                $aids .= (empty($aids) ? $row['aid'] : ','.$row['aid']);
            }
            @me = " AND arc.id IN ($aids) ";
        }else{
            @me = " AND 1=0 "; // 如果没有找到相关标签,则不显示
        }
    }else{
        @me = " AND 1=0 "; // 如果文章没有标签,则不显示
    }
{/dede:field}
{dede:sql sql="SELECT arc.id, arc.title, arc.typeid, arc.litpic, tp.typename
                FROM dede_archives arc
                LEFT JOIN dede_arctype tp ON arc.typeid = tp.id
                WHERE 1=1 AND arc.arcrank > -1 [field:global name=autokeyword /]
                ORDER BY arc.id DESC
                LIMIT 0, 10"}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me, 30)'/]</a>
        <span class="type">([field:typename/])</span>
    </li>
{/dede:sql}

代码解析

  1. {dede:field name='tag'...}:获取当前文章的标签列表(用逗号分隔)。
  2. 第一个 foreach 循环:遍历每个标签名,去 dede_tag 表中查询对应的标签ID,并组合成一个ID列表,如 1,5,8
  3. 第二个查询:去 dede_taglist 表(记录文章和标签关联关系的表)中,查找所有标签ID在这个列表里的文章ID(aid),并再次组合成文章ID列表。
  4. [field:global name=autokeyword /]:将最终的文章ID列表条件注入到 sql 标签中,实现精确查询。

优点

  • 相关性最强,因为TAG是人工或半自动添加的,更能代表文章的核心内容。
  • 效果非常好,用户体验佳。

缺点

  • 依赖网站的TAG功能,如果没开启则无法使用。
  • 代码逻辑比方法二更复杂。

总结与建议

方法 优点 缺点 推荐度
方法一 极其简单,系统自带 默认非全站,需修改核心文件,算法单一 ★★☆☆☆
方法二 (关键词) 真正全站,灵活可控,无需修改核心 需写SQL,大数据量有压力 ★★★★☆
方法三 (TAG标签) 相关性最佳,效果最好 依赖TAG功能,代码逻辑最复杂 ★★★★★

最终建议

  1. 对于大多数网站:推荐使用 方法二(基于关键词),它在实现难度和效果之间取得了很好的平衡,并且能实现真正的全站相关。
  2. 质量高、运营规范的网站:强烈建议使用 方法三(基于TAG标签),如果你的网站已经启用了TAG功能,这是获得最佳相关文章效果的不二之选。
  3. 快速尝鲜:可以使用 方法一,但要记得修改 likearticle.lib.php 文件,将其变为全站搜索。

在实现过程中,请确保你的网站已经开启了“关键词自动提取”功能,并且文章都填写了关键词或TAG,这样相关文章的效果才会更好。

-- 展开阅读全文 --
头像
dede修改文章空白
« 上一篇 今天
织梦视频播放器插件,如何实现流畅播放与自定义?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]