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

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

实现的思路和过程如下:

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

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

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

以下是缓存函数:

[php]
//缓存所有文档数据
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);

}

[/php]

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

[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;
}

[/php]

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

发表评论