Discuz的關(guān)聯(lián)鏈接一直有個頭疼的問題:關(guān)聯(lián)鏈接沒法嵌套,顯示異常。 
例如下面的關(guān)鍵詞: 
較短詞語:汽車改裝 http://wangaiche.com 
較長詞語:汽車改裝店 http://www.appmagiablanca.com/dian 
就無法顯示成功,只能顯示較短的一個,并且會出現(xiàn)亂碼。 
為了解決這個問題,我們把代碼調(diào)整了一下,主要涉及2個文件: 
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 
解釋: 
原來的代碼在處理嵌套的時候,只替換了一次,會導(dǎo)致后面詞語替換的時候,將已經(jīng)替換好的代碼清除掉。 
我們中間用了一個臨時的不會沖突的代碼做過渡,這樣替換以后,就不會影響了。 
找到函數(shù):-  public static function parse_related_link($content, $extent) {
 
 
  復(fù)制代碼 整個替換為以下代碼:-  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ù)制代碼 管理后臺,更新緩存,添加2個嵌套的詞語進行測試,看看效果。 
 
 |