DEDE,给文章中的标题加上链接

DEDE能给文章中的关键字加上链接,同理,也可以自动给文章中其它文章的标题加上链接,今天就来实现这个功能。

实现的思路和过程如下:

  1. 将所有文章的标题和链接地址缓存到临时表或者缓存文件
  2. 这里的文章链接地址可以是动态也可以静态,但生成静态链接则要消耗更多资源

我这里采用了静态地址+文件缓存的办法,在一键更新网站的过程中,按需要增加一步缓存过程,将所有文章的标题和链接缓存处理,然后调用替换过程。

本实例为客户定制开发代码,故不能完整提供程序代码,仅供有动手能力的朋友参考。

以下是缓存函数:

//缓存所有文档数据
function cacheAllArc()
{
 global $dsql;
 require_once(DEDEINC."/arc.archives.class.php");
 $dsql->SetQuery("Select id From `#@__arctiny` where arcrank >= 0");
 $dsql->Execute();
 $arcArray = array();
 while($row = $dsql->GetObject())
 {
 $arc = new Archives($row->id);
 $arcArray[$row->id] = array('t'=>$arc->Fields['title'], 'u'=>$arc->GetTrueUrl());
 unset($arc);
 }
 $mkcachefile = DEDEROOT."/data/cache/mkall_cache_arc.php";
 $fp = fopen($mkcachefile,'w') or die("无法将文档缓存写入文件:{$mkcachefile}");
 $str = '<?php $arcArray='. var_export($arcArray, true) . ';?>';
 fwrite($fp, $str);
 fclose($fp);

}

以下是核心函数,可以加到arc.archives.class.php中做处理:


function ReplaceArticleURL(&$body)
 {
 global $cfg_cmspath;

 $maxkey = 5;
 $mkcachefile = DEDEROOT."/data/cache/mkall_cache_arc.php";
 $arcArray = '';
 if(!is_file($mkcachefile)) return $body;
 else include $mkcachefile;
 if(!is_array($arcArray) || !count($arcArray)) return $body;

 $i=0;
 $karr = $kaarr = $GLOBALS['replaced'] = array();

 //暂时屏蔽超链接
 $body = preg_replace("/(<a(.*))(>)(.*)(<)(\/a>)/isU", '\\1-]-\\4-[-\\6', $body);

 foreach($arcArray as $arc)
 {
 $k = trim($arc['t']);
 if($k != "")
 {
 $karr[] = $k;
 $GLOBALS['replaced'][$k] = 0;
 $kaarr[] = "<a href='{$arc['u']}'><u>$k</u></a>";

 $i++;
 }
 }
 $body = preg_replace("/(^|>)([^<]+)(?=<|$)/sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);

 //恢复超链接
 $body = preg_replace("/(<a(.*))-\]-(.*)-\[-(\/a>)/isU", '\\1>\\3<\\4', $body);
 return $body;
 }

上述代码中,include $mkcachefile,不能使用require替代,原因未知,待查。

发表评论

电子邮件地址不会被公开。