织梦内容页如何关联 TAG 标签实现内链

摘要:织梦内容页如何关联 TAG 标签实现内链?首先在系统 -> 系统基本参数 -> 核心设置,开启关键字替换功能,然后在其它选项那设置关键字替换次数,最后修改 arc.archives.class.php 文件。

系统设置

首先在系统 -> 系统基本参数 -> 核心设置,开启关键字替换功能:

关键字替换

然后在其它选项那设置关键字替换次数:

关键字替换次数

修改文件

打开 include/arc.archives.class.php,大约在 231 行,找到:

if($arr['type']=='htmltext' && $GLOBALS['cfg_keyword_replace']=='Y' && !empty($this->Fields['keywords']))
{
    $this->Fields[$nk] = $this->ReplaceKeyword($this->Fields['keywords'],$this->Fields[$nk]);
}

将上面代码里的 keywords(有 2 处)替换成 tags,替换完成后如下:

if($arr['type']=='htmltext' && $GLOBALS['cfg_keyword_replace']=='Y' && !empty($this->Fields['tags']))
{
    $this->Fields[$nk] = $this->ReplaceKeyword($this->Fields['tags'],$this->Fields[$nk]);
}

再次查找:

$query = "SELECT * FROM #@__keywords WHERE rpurl<>'' ORDER BY rank DESC";
$this->dsql->SetQuery($query);
$this->dsql->Execute();
while($row = $this->dsql->GetArray())
{
    $key = trim($row['keyword']);
    $key_url=trim($row['rpurl']);
    $karr[] = $key;
    $kaarr[] = "<a href='$key_url' target='_blank'><u>$key</u></a>";
}

替换为:

$query = "SELECT tag,tagdir FROM #@__tagindex WHERE id in (SELECT tid FROM #@__taglist WHERE aid='{$this->Fields['aid']}')";
$this->dsql->SetQuery($query);
$this->dsql->Execute();
while($row = $this->dsql->GetArray())
{
    global $cfg_replace_num;
    $key = trim($row['tag']);
    $key_url='/tag/'.trim($row['tagdir']).'/';
    $karr[] = $key;
    $kaarr[] = "<a href='$key_url' target='_blank'><u>$key</u></a>";
}

再次查找:

// 这里可能会有错误
if (version_compare(PHP_VERSION, '5.5.0', '>='))
{
    $body = @preg_replace_callback("#(^|>)([^<]+)(?=<|$)#sU", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);
} else {
    $body = @preg_replace("#(^|>)([^<]+)(?=<|$)#sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);
}

替换为:

// 这里可能会有错误
if (version_compare(PHP_VERSION, '7.5.0', '>='))
{
    if($cfg_replace_num > 0)
    {
        $query = "SELECT tag,tagdir FROM #@__tagindex WHERE id in (SELECT tid FROM #@__taglist WHERE aid='{$this->Fields['aid']}')";
        $this->dsql->SetQuery($query);
        $this->dsql->Execute();
        while($row = $this->dsql->GetArray())
        {
            $key = trim($row['tag']);
            $key_url='/tag/'.trim($row['tagdir']).'/';
            $body = str_replace_limit($key, "<a href='$key_url' target='_blank'><u>$key</u></a>", $body, $cfg_replace_num);
        }
    }
    else
    {
        $query = "SELECT tag,tagdir FROM #@__tagindex WHERE id in (SELECT tid FROM #@__taglist WHERE aid='{$this->Fields['aid']}')";
        $this->dsql->SetQuery($query);
        $this->dsql->Execute();
        while($row = $this->dsql->GetArray())
        {    
            $key = trim($row['tag']);
            $key_url='/tag/'.trim($row['tagdir']).'/';
            $body = str_replace($key, "<a href='$key_url' target='_blank'><u>$key</u></a>", $body);
        }
    }
} else {
    $body = @preg_replace("#(^|>)([^<]+)(?=<|$)#sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);
}

再次查找:

//高亮专用, 替换多次是可能不能达到最多

在它的上面添加一段代码,代码如下:

//指定替换次数功能
function str_replace_limit($search, $replace, $subject, $limit){ 
    if(is_array($search)){ 
        foreach($search as $k=>$v){ 
        $search[$k] = '`'. preg_quote($search[$k], '`'). '`'; 
    } 
    }else{ 
        $search = '`'. preg_quote($search, '`'). '`'; 
    } 
    return preg_replace($search, $replace, $subject, $limit); 
}

最后,顺便把高亮专用下的代码:

if (version_compare(PHP_VERSION, '5.5.0', '>='))

修改为:

if (version_compare(PHP_VERSION, '7.5.0', '>='))

完成。

版权声明:本文为博主原创文章,未经博主允许不得转载。http://www.dedenotes.com/course/dede-taglink.html
(1)
打赏 微信扫一扫 微信 支付宝 QQ 扫码打赏

解决织梦CMS未审核文章仍然生成的问题

Dedenotes 赞(3)

有时候,我们采集了很多的文章,或者使用的别人的源码,系统中已经带了很多文章数据。全部发布出去这个是不可取的,比较好的办法是把这些文档数据设置为未审核,然后自己手工伪原创处理之后再审核发布。

织梦列表页使用 dede:listsql 标签实现静态分页

Dedenotes 赞(3)

将 dede:list 标签进行改造了,熟悉 dede 的朋友应该知道这个列表页专用标签的工作原理,大致是先通过栏目变量 id 获取到对应的数据源再呈现到页面上来,那么我们就可以让它不仅仅通过栏目变量 id, 还可以通过指定的sql语句来获取数据源了。

MySql数据库学习笔记之嵌套查询

Dedenotes 赞(3)

嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。

织梦DedeCMS V5.7调用其他站点数据库数据的方法

Dedenotes 赞(3)

网站是用dedecmsv5.7写的,后来加了一套论坛discuzX3.4。因为dede要调用dz的数据,本来用jsonp跨域请求的数据,但是m端掉用的时候会把请求的链接的域名后面自动加个/m(不知道在哪儿加的……),所以就上网找了另一种方法,dede直接调用dz的数据库。