解析dedecms使用关键词关联文章无效的解决方法

前段时间因为一直没用这个使用关键词关联文章的功能,所以一直没在意,但最近发现内连建设好了,对于文章的排名起很大的作用,于是就开始整理内链,但是在操作过程中遇到了很多问题,dede无法自动替换关键词,无法使用关键词关联文章等等,于是就开始在网上找,找了很多方法,不能说没有用,但是每个都有缺点,于是自己就开始研究了,经过半天的努力,终于让我搞明白了,今天就给大家分享出来。

按dede默认的如何才能正确替换关键词? 1.需要你在后台设置关键词链接地址,2。需要你在系统的基本参数设置里找到 核心设置---关键字替换(是/否)使用本功能会影响HTML生成速度:选是,3.需要你在系统基本参数里 找到性能选项----使用关键词关连文章: 是。 4.然后再发布内容的时候 需要你在内容的tags里填上 你想替换的关键词(V5.7以下版本) V5.7以上版本的需要你在文章的关键词里填入你想替换的关键词或者关键词不能为空。只有满足这些时,dede才会替换你想要替换的关键词。比如我在我的网站发布一篇文章http://www.zuola.net/yingyu/yufa/12944.html,我想把里面的 名词,代词等几个关键词连接到我想要的页面,但是我发布的时候很懒,也不想填tags和关键词,这样发布的时候就无法替换关键词链接了,通过以下方法就可以不用填tags和关键词就能替换。

很多朋友在发布文章时,一半不填写关键词,或者Tags,那么久这个功能就无效了。那么如何解决呢? 让我们先看下 解决钱的dede默认的代码,和解决后的代码,分析以下 就明白了。。

代码有2个部分,一是在arc.archives.class。php 里第204行左右。一个是在最后面的function ReplaceKeyword($kw,&$body)函数,让我们看看解决前和解决后的代码的不同吧。

解决前:204行代码:

Copy to zuola.net Codes引用的内容:[www.zuola.net]
if($arr['type']=='htmltext' && $GLOBALS['cfg_keyword_replace']=='Y' && !empty($this->Fields['keywords'])) 
{ 
$this->Fields[$nk] = $this->ReplaceKeyword($this->Fields['keywords'],$this->Fields[$nk]); 
}

解决前 ReplaceKeyword函数的代码:

Copy to zuola.net Codes引用的内容:[www.zuola.net]
function ReplaceKeyword($kw,&$body) 
{ 
global $cfg_cmspath; 
$maxkey = 5; 
$kws = explode(",",trim($kw)); //以分好为间隔符 
$i=0; 
$karr = $kaarr = $GLOBALS['replaced'] = array(); 
//暂时屏蔽超链接 
$body = preg_replace("/(<a(.*))(>)(.*)(<)(\/a>)/isU", '\\1-]-\\4-[-\\6', $body); 
foreach($kws as $k) 
{ 
$k = trim($k); 
if($k!="") 
{ 
if($i > $maxkey) 
{ 
break; 
} 
$myrow = $this->dsql->GetOne("select * from [url=mailto:dede_keywords]dede_keywords[/url] where keyword='$k' And rpurl<>'' "); 
if(is_array($myrow)) 
{ 
$karr[] = $k; 
$GLOBALS['replaced'][$k] = 0; 
$kaarr[] = "<a href='{$myrow['rpurl']}'><u>$k</u></a>"; 
} 
$i++; 
} 
} 
$body = preg_replace("/(^|>)([^<]+)(?=<|$)/sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body); 
//恢复超链接 
$body = preg_replace("/(<a(.*))-\]-(.*)-\[-(\/a>)/isU", '\\1>\\3<[url=file://\\4]\\4'[/url], $body); 
return $body; 
}

解决后 204行代码:

Copy to zuola.net Codes引用的内容:[www.zuola.net]
if($arr['type']=='htmltext' && $GLOBALS['cfg_keyword_replace']=='Y') 
{ 
$this->Fields[$nk] = $this->ReplaceKeyword($this->Fields['keywords'],$this->Fields[$nk]); 
}

解决后 ReplaceKeyword函数的代码

Copy to zuola.net Codes引用的内容:[www.zuola.net]
function ReplaceKeyword($kw,&$body) 
{ 
global $cfg_cmspath; 
$maxkey = 5; 
$kws = explode(",",trim($kw)); //以分好为间隔符 
$i=0; 
$karr = $kaarr = $GLOBALS['replaced'] = array(); 
//暂时屏蔽超链接 
$body = preg_replace("/(<a(.*))(>)(.*)(<)(\/a>)/isU", '\\1-]-\\4-[-\\6', $body); 
global $dsql; 
$query="SELECT * FROM [url=mailto:dede_keywords]dede_keywords[/url] WHERE rpurl<>'' ORDER BY rank DESC"; 
$dsql->SetQuery($query); 
$dsql->Execute(); 
while($row = $dsql->GetArray()) 
{ 
$key = trim($row['keyword']); 
$key_url=trim($row['rpurl']); 
$karr[] = $key; 
$kaarr[] = "<a href='$key_url' target='_blank'><u>$key</u></a>"; 

} 



$body = preg_replace("/(^|>)([^<]+)(?=<|$)/sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body); 
//恢复超链接 
$body = preg_replace("/(<a(.*))-\]-(.*)-\[-(\/a>)/isU", '\\1>\\3<[url=file://\\4]\\4'[/url], $body); 
return $body; 
}

先分析204行的代码,细心的朋友可能已经发现,解决后的代码比解决前少了&& !empty($this->Fields['keywords'] 对就是这个原因,dede获取关键词的时候要判断你这篇文章是否填了关键词,这个我们一半不填,所以把他去掉就行了,还有的朋友说应该把cfg_keyword_replace 换成 cfg_keyword_like  他认为是dede的人写错了,其实是自己没有看清罢了,其实不用换这个的,因为他们代表的就不是一个意思。
cfg_keyword_replace是指关键字替换(是/否)使用本功能会影响HTML生成速度: 这项 而cfg_keyword_like 是指使用关键词关连文章:

然后我们在分析ReplaceKeyword  原本的dede是从你所填的tag里 遍历tags,然后与你设置的文档关键词相比较,如果找到了,就将这个关键词替换成带链接的关键词,如果tags为空,就无法执行了。这就是为什么大家使用文档关键词关联文章失败的原因,而解决方法中,直接不让他遍历tags,直接去替换,这样就解决了。

但是出现了几个问题。1,这样解决在生成文章的时候速度会降低,2,无法控制总的关键词链接数量。希望有高手能够解决下。