Discuz的关联链接一直有个头疼的问题:关联链接没法嵌套,显示异常。
例如下面的关键词:
较短词语:兔源码 https://tuyuanma.com/
较长词语:兔源码社区 https://www.tuyuanma.com/
就无法显示成功,只能显示较短的一个,并且会出现乱码。
为了解决这个问题,我们把代码调整了一下,主要涉及2个文件:
1、source/function/cache/cache_relatedlink.php
2、source/class/helper/helper_SEO.php
代码修改:
1、cache_relatedlink.php
将原来的代码注释,修改成未注释的代码,目的是将关联词语按照长度排序,让长词在前面(显示逻辑)- //$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');
复制代码 2、helper_seo.php
解释:
原来的代码在处理嵌套的时候,只替换了一次,会导致后面词语替换的时候,将已经替换好的代码清除掉。
我们中间用了一个临时的不会冲突的代码做过渡,这样替换以后,就不会影响了。
找到函数:- public static function parse_related_link($content, $extent) {
复制代码 整个替换为以下代码:- 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;
- }
复制代码 管理后台,更新缓存,添加2个嵌套的词语进行测试,看看效果。 |