Discuz的關(guān)聯(lián)鏈接一直有個(gè)頭疼的問題:關(guān)聯(lián)鏈接沒法嵌套,顯示異常。
例如下面的關(guān)鍵詞:
較短詞語:汽車改裝 http://wangaiche.com
較長詞語:汽車改裝店 http://www.beclighting.com.cn/dian
就無法顯示成功,只能顯示較短的一個(gè),并且會(huì)出現(xiàn)亂碼。
為了解決這個(gè)問題,我們把代碼調(diào)整了一下,主要涉及2個(gè)文件:
1、source/function/cache/cache_relatedlink.php
2、source/class/helper/helper_seo.php
代碼修改:
1、cache_relatedlink.php
將原來的代碼注釋,修改成未注釋的代碼,目的是將關(guān)聯(lián)詞語按照長度排序,讓長詞在前面(顯示邏輯)- //$query = C::t('common_relatedlink')->range(0, 0, 'length(name)');
- $query = DB::fetch_all('SELECT * FROM '.DB::table('common_relatedlink').' order by length(name) DESC');
復(fù)制代碼 2、helper_seo.php
解釋:
原來的代碼在處理嵌套的時(shí)候,只替換了一次,會(huì)導(dǎo)致后面詞語替換的時(shí)候,將已經(jīng)替換好的代碼清除掉。
我們中間用了一個(gè)臨時(shí)的不會(huì)沖突的代碼做過渡,這樣替換以后,就不會(huì)影響了。
找到函數(shù):- public static function parse_related_link($content, $extent) {
復(fù)制代碼 整個(gè)替換為以下代碼:- public static function parse_related_link($content, $extent) {
- global $_G;
- loadcache('relatedlink');
- $allextent = array('article' => 0, 'forum' => 1, 'group' => 2, 'blog' => 3);
- if($_G['cache']['relatedlink'] && isset($allextent[$extent])) {
- $searcharray = $replacearray = array();
- $fixedcode_array = $search_fixedcode_array = array();
- $index = 0;
- foreach($_G['cache']['relatedlink'] as $link) {
- $link['extent'] = sprintf('%04b', $link['extent']);
- if($link['extent'][$allextent[$extent]] && $link['name'] && $link['url']) {
- $searcharray[$link[name]] = '/('.preg_quote($link['name']).')/i';
- $fixed_code = 'AAABBBCCC['.$index.']'.'XXXYYYZZZ';
- $fixedcode_array[$link[name]] = $fixed_code;
- $search_fixedcode_array[$link[name]] = '/('.preg_quote($fixed_code).')/i';
- $replacearray[$link[name]] = "<a href="$link[url]" target="_blank" class="relatedlink" title="$link[name]">$link[name]</a>";
- $index += 1;
- }
- }
- if($searcharray && $replacearray) {
- $_G['trunsform_tmp'] = array();
- $content = preg_replace("/(<script\s+.*?>.*?<\/script>)|(<a\s+.*?>.*?<\/a>)|(<img\s+.*?[\/]?>)|(\[attach\](\d+)\[\/attach\])/ies", "helper_seo::base64_transform('encode', '<relatedlink>', '\\1\\2\\3\\4', '</relatedlink>')", $content);
- $content = preg_replace($searcharray, $fixedcode_array, $content, 1);
- $content = preg_replace($search_fixedcode_array, $replacearray, $content, 1);
- $content = preg_replace("/<relatedlink>(.*?)<\/relatedlink>/ies", "helper_seo::base64_transform('decode', '', '\\1', '')", $content);
- }
- }
- return $content;
- }
復(fù)制代碼 管理后臺(tái),更新緩存,添加2個(gè)嵌套的詞語進(jìn)行測(cè)試,看看效果。
|