|
官方的dede:likearticle并没有那么精准的输出相关文章,下面我们自定义一个类库文件来实现精准获取相关文章,支持直接输出自定义字段,支持flag文章属性,非常适合SEO
eregtype='all|tag|keyword',单用tag来调用相关文章,也可用tag|keyword来调用相关文章(默认tag优先于keyword,可以自己排序)
在 /include/taglib 下添加一个 liketags.lib.php 文件代码如下
if(!defined('DEDEINC')) exit('Request Error!');
function lib_liketags(&$ctag,&$refObj)
{
global $dsql,$envs;
//属性处理
$attlist="row|12,titlelen|30]infolen|250]col|1,tablewidth|100]typeid|0]byabs|0]imgwidth|120]imgheight|90]flag|";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = '';
if(empty($tablewidth)) $tablewidth = 100;
if(empty($col)) $col = 1;
$colWidth = ceil(100/$col);
$tablewidth = $tablewidth."%";
$colWidth = $colWidth."%";
$orwheres = '';
if($flag != '') {
$flags = explode(',', $flag);
for($i=0; isset($flags[$i,); $i++) $orwheres .= " AND FIND_IN_SET('{$flags[$i,}', arc.flag)>0 ";
}
$ids = array();
$tids = array();
if(!empty($refObj->Fields['tags',)) {
$keyword = $refObj->Fields['tags',;
}
else {
$keyword = ( !empty($refObj->Fields['keywords',) ? $refObj->Fields['keywords', : '' );
}
$typeid = ( !empty($typeid) ? $typeid : 0 );
if(empty($typeid))
{
if(!empty($refObj->Typelink->TypeInfos['reid',)) {
$typeid = $refObj->Typelink->TypeInfos['reid',;
}
else {
if(!empty($refObj->Fields['typeid',)) $typeid = $refObj->Fields['typeid',;
}
}
if( !empty($typeid) && !preg_match('#,#', $typeid) ) {
$typeid = GetSonIds($typeid);
}
if(!empty($refObj->Fields['tags',) && $eregtype != 'keyword' )
{
$tags = explode(',', addslashes($refObj->Fields['tags',));
$getsql = " tag like '".join("' OR tag like '", $tags)."' ";
$dsql->Execute('me', "Select * From `dede_tagindex` where $getsql ");
while($arow = $dsql->GetArray('me'))
{
$tids[, = $arow['id',;
}
$tid = join(',', $tids);
if($tid!='')
{
$dsql->Execute("me", "Select aid From `dede_taglist` where tid in($tid) And arcrank > -1 group by aid order by aid desc");
while($arow = $dsql->GetArray("me"))
{
$ids[, = $arow['aid',;
$arcid = $refObj->Fields['aid',;
}
}
}
//获得附加表的相关信息
$addField = "";
$addJoin = "";
if(is_object($refObj->ChannelUnit))
{
$addtable = $refObj->ChannelUnit->ChannelInfos['addtable',;
if($addtable!="")
{
$addJoin = " LEFT JOIN $addtable ON arc.id = ".$addtable.".aid ";
$addField = "";
$fields = explode(",",$refObj->ChannelUnit->ChannelInfos['listfields',);
foreach($fields as $k=>$v)
{
$nfields[$v, = $k;
}
foreach($refObj->ChannelUnit->ChannelFields as $k=>$arr)
{
if(isset($nfields[$k,))
{
if(!empty($arr['rename',))
{
$addField .= ",".$addtable.".".$k." as ".$arr['rename',;
}
else
{
$addField .= ",".$addtable.".".$k;
}
}
}
}
}
if($eregtype == 'tag' && count($ids) == 0 )
{
return;
}
else
{
if(count($ids) > 0)
{
if(!empty($typeid))
{
$typeid = " And arc.typeid in($typeid) And arc.id$arcid ";
}
$idsStr = join(',', $ids);
$query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl]tp.sitepath $addField
from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id $addJoin
where arc.arcrank>-1 and arc.id in($idsStr) $typeid order by arc.id desc limit 0] $row";
}
else
{
$limitRow = $row - count($ids);
$keyword = '';
if(!empty($refObj->Fields['keywords',))
{
$keywords = explode(',' , trim($refObj->Fields['keywords',));
$keyword = '';
$n = 1;
foreach($keywords as $k)
{
if($n > 3) break;
if(trim($k)=='') continue;
else $k = addslashes($k);
$keyword .= ($keyword=='' ? " CONCAT(arc.keywords,' ',arc.title) like '%$k%' " : " OR CONCAT(arc.keywords,' ',arc.title) like '%$k%' ");
$n++;
}
}
$arcid = (!empty($refObj->Fields['id',) ? $refObj->Fields['aid', : 0);
if( empty($arcid) || $byabs==0 )
{
$orderquery = " order by arc.id desc ";
}
else
{
$orderquery = " order by ABS(arc.id - ".$arcid.") ";
}
if($keyword != '')
{
if(!empty($typeid))
{
$typeid = " And arc.typeid in($typeid) And arc.id$arcid ";
}
$query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl]tp.sitepath $addField
from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id $addJoin
where arc.arcrank>-1 and ($keyword) $typeid $orderquery limit 0] $row";
}
else
{
if(!empty($typeid))
{
$typeid = " arc.typeid in($typeid) And arc.id$arcid ";
}
$query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl]tp.sitepath $addField
from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id $addJoin
where arc.arcrank>-1 and $typeid $orderquery limit 0] $row";
}
}
}
$innertext = trim( $ctag->GetInnerText() );
if($innertext=='') $innertext = GetSysTemplets('part_arclist.htm');
$dsql->SetQuery($query);
$dsql->Execute('al');
$artlist = '';
if($col > 1){
$artlist = "";
}
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace('field', '[', ',');
$dtp2->LoadString($innertext);
$GLOBALS['autoindex', = 0;
$line = $row;
for($i=0; $i
{
if($col>1) $artlist .= "";
for($j=0; $j
{
if($col>1) $artlist .= " ";
if($row = $dsql->GetArray("al"))
{
$ids[, = $row['id',;
//处理一些特殊字段
$row['info', = $row['infos', = cn_substr($row['description',,$infolen);
$row['id', = $row['id',;
if($row['corank', > 0 && $row['arcrank',==0)
{
$row['arcrank', = $row['corank',;
}
$row['filename', = $row['arcurl', = GetFileUrl($row['id',,$row['typeid',,$row['senddate',,$row['title',,$row['ismake',,
$row['arcrank',,$row['namerule',,$row['typedir',,$row['money',,$row['filename',,$row['moresite',,$row['siteurl',,$row['sitepath',);
$row['typeurl', = GetTypeUrl($row['typeid',,$row['typedir',,$row['isdefault',,$row['defaultname',,$row['ispart',,
$row['namerule2',,$row['moresite',,$row['siteurl',,$row['sitepath',);
if($row['litpic', == '-' || $row['litpic', == '')
{
$row['litpic', = $GLOBALS['cfg_cmspath',.'/images/defaultpic.gif';
}
if(!preg_match("#^http://#i", $row['litpic',) && $GLOBALS['cfg_multi_site', == 'Y')
{
$row['litpic', = $GLOBALS['cfg_mainsite',.$row['litpic',;
}
$row['picname', = $row['litpic',;
$row['stime', = GetDateMK($row['pubdate',);
$row['typelink', = "[url=".$row[,".$row['typename',."[/url]";
$row['image', = "
[img]".$row[[/img]
$row['fulltitle', = $row['title',;
$row['title', = cn_substr($row['title',, $titlelen);
if($row['color',!='') $row['title', = "
[color=,".$row['title',."
";
if(preg_match('#b#', $row['flag',)) $row['title', = "".$row['title',."";
$row['textlink', = "[url=".$row[,".$row['title',."[/url]";
$row['plusurl', = $row['phpurl', = $GLOBALS['cfg_phpurl',;
$row['memberurl', = $GLOBALS['cfg_memberurl',;
$row['templeturl', = $GLOBALS['cfg_templeturl',;
if(is_array($dtp2->CTags))
{
foreach($dtp2->CTags as $k=>$ctag)
{
if($ctag->GetName()=='array') {
$dtp2->Assign($k,$row);
}
else {
if(isset($row[$ctag->GetName()])) $dtp2->Assign($k,$row[$ctag->GetName()]);
else $dtp2->Assign($k,'');
}
}
$GLOBALS['autoindex',++;
}
$artlist .= $dtp2->GetResult();
}
//if hasRow
else
{
$artlist .= '';
}
if($col>1) $artlist .= " ";
}
//Loop Col
if($col>1) $i += $col - 1;
if($col>1) $artlist .= " ";
}
//loop line
if($col>1) $artlist .= "";
$dsql->FreeResult("al");
return $artlist;
}
前台模板标签调用写法
{dede:liketags row='3' typeid='6' titlelen='250' eregtype='all|tag|keyword' flag='c' infolen='250'}
[*,
[url=,
[img][/img]
[field:title/,
¥[field:jiage/,元
[/url]
{/dede:liketags} |
|