在使用帝国CMS的过程中,发现启用tag后,连接的地址中有中文,随即想到用tagid来作为访问地址,避免中文对收录的影响。

使用情况为设置cid为selfinfo的情况下,如果设定了cid,此方法无效。

即[showtags]'selfinfo',10,10,'tagid desc',0,'','   ',0,''[/showtags]

1、修改e\class\t_functions.php文件中sys_eShowTags函数

//显示TAGS
function sys_eShowTags($cid,$num=0,$line=0,$order='',$isgood='',$isgoodshow='',$showjg='',$shownum=0,$cs=''){
	global $empire,$dbtbpre,$public_r,$navinfor;
	$str='';
	if(empty($showjg))
	{
		$showjg='   ';
	}
	$ln=0;
	if($cid=='selfinfo')
	{
		if(empty($navinfor['infotags']))
		{
			return '';
		}
		$jg='';
		$r=explode(',',$navinfor['infotags']);		
		$count=count($r);	
		for($i=0;$i<$count;$i++)
		{
		$sql=$empire->query("select tagid from {$dbtbpre}enewstags where tagname='".$r[$i]."'");
		$rtagid=$empire->fetch($sql);
			$ln++;
			$br='';
			if($line)
			{
				if($ln%$line==0)
				{
					$br='
'; } } $str.=$jg.''.$r[$i].''.$br; //$str.=$jg.''.$r[$i].''.$br; $jg=$br?'':$showjg; } } else { $and=''; $where=''; if($cid) { $where=strstr($cid,',')?"cid in ($cid)":"cid='$cid'"; $and=' and '; } if($isgood) { $where.=$and.'isgood=1'; } if($where) { $where=' where '.$where; } $order=$order?' '.$order:' tagid desc'; $limit=''; if($num) { $limit=' limit '.$num; } //推荐标红 $gfont1=''; $gfont2=''; if($isgoodshow) { if(strstr($isgoodshow,'r')) { $gfont1=''; $gfont2=''; } if(strstr($isgoodshow,'s')) { $gfont1=$gfont1.'';
$gfont2='
'.$gfont2; } } $jg=''; $snum=''; $sql=$empire->query("select tagid,tagname,num,isgood from {$dbtbpre}enewstags".$where." order by".$order.$limit); while($r=$empire->fetch($sql)) { if($shownum) { $snum='('.$r[num].')'; } $font1=''; $font2=''; if($isgoodshow&&$r[isgood]) { $font1=$gfont1; $font2=$gfont2; } $ln++; $br=''; if($line) { if($ln%$line==0) { $br='
'; } } $str.=$jg.''.$font1.$r[tagname].$snum.$font2.''.$br; $jg=$br?'':$showjg; } } echo $str; }

其实其中加入了三句代码,也可自行修改。

$sql=$empire->query("select tagid from {$dbtbpre}enewstags where tagname='".$r[$i]."'");
$rtagid=$empire->fetch($sql);

$str.=$jg.''.$r[$i].''.$br;

2、加入伪静态规则。
nginx下伪静态为

rewrite "^/tags\/([0-9]+)\.html$" /e/tags/?tagid=$1 last;

完成后又发现tag列表项过多时,会有导航栏,导航栏内的链接为动态形式,需要修改,方法如下。
1、修改e/tag/index.php
172行

$listpage=page1($num,$line,$page_line,$start,$page,$search);

改成

$listpage=pagetag($num,$line,$page_line,$start,$page,$tagid);

2、修改e/class/connect.php
复制一份函数function page1(),命名为function pagetag()
修改
function pagetag()函数如下

//TAGS分页
function pagetag($num,$line,$page_line,$start,$page,$tagid){
	global $fun_r;
	if($num<=$line)
	{
		return '';
	}
	$tagid='_'.$tagid;
	$url='index';
	$snum=2;//最小页数
	$totalpage=ceil($num/$line);//取得总页数
	$firststr=' '.$num.'  ';
	//上一页
	if($page<>0)
	{
		$toppage=''.$fun_r['startpage'].' ';
		$pagepr=$page-1;
		$prepage=''.$fun_r['pripage'].'';
	}
	//下一页
	if($page!=$totalpage-1)
	{
		$pagenex=$page+1;
		$nextpage=' '.$fun_r['nextpage'].'';
		$lastpage=' '.$fun_r['lastpage'].'';
	}
	$starti=$page-$snum<0?0:$page-$snum;
	$no=0;
	for($i=$starti;$i<$totalpage&&$no<$page_line;$i++)
	{
		$no++;
		if($page==$i)
		{
			$is_1="";
$is_2="
"; } else { $is_1='';
$is_2="
"; } $pagenum=$i+1; $returnstr.=" ".$is_1.$pagenum.$is_2; } $returnstr=$firststr.$toppage.$prepage.$returnstr.$nextpage.$lastpage; return $returnstr; }

3、nginx伪静态规则

rewrite "^/tags\/index\_([0-9]+)\_([0-9]+)\.html$" /e/tags/index.php?page=$2&tagid=$1&line=25&tempid=1 last;

备注:本来想采用输出的内容$returnstr,用正则替换的方法改变链接方式,结果发现无效果,屡试不成功,就放弃了,代码如下。

e/class/connect.php的pagetag函数中,最后一部分改成

$returnstr=$firststr.$toppage.$prepage.$returnstr.$nextpage.$lastpage;
$aaaaa='/e\/tags\/index\.php\?page\=([0-9]+)\&tagid\=([0-9]+)\&line\=25\&tempid\=1/';
$bbbbb='/tags/index_$2_$1.html';
$returnstr=preg_replace($aaaaa,$bbbbb,$returnstr);
return $returnstr;
实现转换成的模式为
tags/index_tagid_page.html
原连接模式为
/e/tags/index.php?page=1&tagid=2&line=25&tempid=1
转换伪静态
rewrite "^/tags\/index\_([0-9]+)\_([0-9]+)\.html$" /e/tags/index.php?page=$2&tagid=$1&line=25&tempid=1 last;