解决Discuz关联链接无法嵌套的问题-Discuz教程下载

解决Discuz关联链接无法嵌套的问题

来自版块: Discuz教程发表于: 2022-7-29 19:12:54
3093
0
如本资源下载地址失效,请点击此处进行反馈
开通本站Svip会员,全站资源免费下
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
将原来的代码注释,修改成未注释的代码,目的是将关联词语按照长度排序,让长词在前面(显示逻辑)
  1. //$query = C::t('common_relatedlink')->range(0, 0, 'length(name)');
  2. $query = DB::fetch_all('SELECT * FROM '.DB::table('common_relatedlink').' order by length(name) DESC');
复制代码
2、helper_seo.php
解释:
原来的代码在处理嵌套的时候,只替换了一次,会导致后面词语替换的时候,将已经替换好的代码清除掉。
我们中间用了一个临时的不会冲突的代码做过渡,这样替换以后,就不会影响了。
找到函数:
  1. public static function parse_related_link($content, $extent) {
复制代码
整个替换为以下代码:
  1. public static function parse_related_link($content, $extent) {
  2.                 global $_G;
  3.                 loadcache('relatedlink');
  4.                 $allextent = array('article' => 0, 'forum' => 1, 'group' => 2, 'blog' => 3);
  5.         if($_G['cache']['relatedlink'] && isset($allextent[$extent])) {
  6.             $searcharray = $replacearray = array();
  7.             $fixedcode_array = $search_fixedcode_array = array();
  8.             $index = 0;
  9.             foreach($_G['cache']['relatedlink'] as $link) {
  10.                 $link['extent'] = sprintf('%04b', $link['extent']);
  11.                 if($link['extent'][$allextent[$extent]] && $link['name'] && $link['url']) {
  12.                     $searcharray[$link[name]] = '/('.preg_quote($link['name']).')/i';
  13.                     $fixed_code = 'AAABBBCCC['.$index.']'.'XXXYYYZZZ';
  14.                     $fixedcode_array[$link[name]] = $fixed_code;
  15.                     $search_fixedcode_array[$link[name]] = '/('.preg_quote($fixed_code).')/i';
  16.                     $replacearray[$link[name]] = "<a href="$link[url]" target="_blank" class="relatedlink" title="$link[name]">$link[name]</a>";
  17.                     $index += 1;
  18.                 }
  19.             }
  20.             if($searcharray && $replacearray) {
  21.                 $_G['trunsform_tmp'] = array();
  22.                 $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);
  23.                 $content = preg_replace($searcharray, $fixedcode_array, $content, 1);
  24.                 $content = preg_replace($search_fixedcode_array, $replacearray, $content, 1);
  25.                 $content = preg_replace("/<relatedlink>(.*?)<\/relatedlink>/ies", "helper_seo::base64_transform('decode', '', '\\1', '')", $content);
  26.             }
  27.         }
  28.                 return $content;
  29.         }
复制代码
管理后台,更新缓存,添加2个嵌套的词语进行测试,看看效果。

全部评论 0

您需要登录后才可以回帖 立即登录
登录
0
0
0
返回顶部