解析dedecms使用關鍵詞關聯文章無效的解決方法
來源:程序員人生 發布時間:2014-03-19 21:29:54 閱讀次數:2430次
前段時間因為一直沒用這個使用關鍵詞關聯文章的功能,所以一直沒在意,但最近發現內連建設好了,對于文章的排名起很大的作用,于是就開始整理內鏈,但是在操作過程中遇到了很多問題,dede無法自動替換關鍵詞,無法使用關鍵詞關聯文章等等,于是就開始在網上找,找了很多方法,不能說沒有用,但是每個都有缺點,于是自己就開始研究了,經過半天的努力,終于讓我搞明白了,今天就給大家分享出來。
按dede默認的如何才能正確替換關鍵詞? 1.需要你在后臺設置關鍵詞鏈接地址,2。需要你在系統的基本參數設置里找到 核心設置---關鍵字替換(是/否)使用本功能會影響HTML生成速度:選是,3.需要你在系統基本參數里 找到性能選項----使用關鍵詞關連文章: 是。 4.然后再發布內容的時候 需要你在內容的tags里填上 你想替換的關鍵詞(V5.7以下版本) V5.7以上版本的需要你在文章的關鍵詞里填入你想替換的關鍵詞或者關鍵詞不能為空。只有滿足這些時,dede才會替換你想要替換的關鍵詞。比如我在我的網站發布一篇文章http://www.ixuela.com/yingyu/yufa/12944.html,我想把里面的 名詞,代詞等幾個關鍵詞連接到我想要的頁面,但是我發布的時候很懶,也不想填tags和關鍵詞,這樣發布的時候就無法替換關鍵詞鏈接了,通過以下方法就可以不用填tags和關鍵詞就能替換。
很多朋友在發布文章時,一半不填寫關鍵詞,或者Tags,那么久這個功能就無效了。那么如何解決呢? 讓我們先看下 解決錢的dede默認的代碼,和解決后的代碼,分析以下 就明白了。。
代碼有2個部分,一是在arc.archives.class。php 里第204行左右。一個是在最后面的function ReplaceKeyword($kw,&$body)函數,讓我們看看解決前和解決后的代碼的不同吧。
解決前:204行代碼:
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函數的代碼:
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行代碼:
if($arr['type']=='htmltext' && $GLOBALS['cfg_keyword_replace']=='Y')
{
$this->Fields[$nk] = $this->ReplaceKeyword($this->Fields['keywords'],$this->Fields[$nk]);
}
解決后 ReplaceKeyword函數的代碼
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,無法控制總的關鍵詞鏈接數量。希望有高手能夠解決下。
出處:http://www.ixuela.com
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈