DedeCMS通过Tag和Keyword标签获取相关文章的方法

树缝里也漏着一两点路灯光,没精打彩的,是渴睡人的眼。春尚浅,几处山顶上的梅花却挣扎着吐出红苞来。微风柔和地吹,柔和地爱抚我的面孔。荷塘里的荷花都羞涩地打着朵。落叶随着风高低起舞。

DedeCMS默认自带的相关文章是likearticle标签实现,实际应用的时候发现这个标签调用的相关文章并不完美,我们需要改进下,一般我们要调用相关文章都是以Tag或者keyword匹配,我们今天就做下改进,实现全站按TAG和关键字调用相关文章,这个方法可单用tag来调用相关文章,也可用tag+keyword来调用相关文章(默认tag优先于keyword,可以自己排序),非常适合SEO,经测试效果极佳。

具体方法如下:

把下面的php代码换掉include/taglib/likearticle.lib.php里的代码:

	
	<?php
	if(!defined('DEDEINC')) exit('Request Error!');
	/*--------------------------------------
	按关键词关连文章的标签
	eregtype属性
	eregtype = keyword 只匹配关键字
	eregtype = tag 只匹配tag
	eregtype = all tag优先,不存在tag则匹配关键字
	mytypeid='' 栏目ID,多个栏目用,隔开
	---------------------------------------*/
	function lib_likearticle(&$ctag,&$refObj)
	{
	 global $dsql;
	
	 //属性处理
	 $attlist="row|12,titlelen|28,infolen|150,col|1,tablewidth|100,mytypeid|0,byabs|0,imgwidth|120,imgheight|90";
	 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."%";
	
	 $ids = array();
	 $tids = array();
	
	 $typeid = ( !empty($mytypeid) ? $mytypeid : 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) && !ereg(',', $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 limit 0, $row");
	   while($arow = $dsql->GetArray("me"))
	   {
	    $ids[] = $arow['aid'];
	                                $arcid = $refObj->Fields['aid'];
	   }
	  }
	 }
	
	 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
	            from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
	            where arc.id in($idsStr) $typeid order by arc.id desc";
	  }
	  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
	            from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
	            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
	            from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
	           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 = "<table width='$tablewidth' border='0' cellspacing='0' cellpadding='0'> ";
	 }
	 $dtp2 = new DedeTagParse();
	 $dtp2->SetNameSpace('field', '[', ']');
	 $dtp2->LoadString($innertext);
	 $GLOBALS['autoindex'] = 0;
	 $line = $row;
	 for($i=0; $i < $line; $i++)
	 {
	  if($col>1) $artlist .= "<tr> ";
	  for($j=0; $j < $col; $j++)
	  {
	   if($col>1) $artlist .= " <td width='$colWidth'> ";
	   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(!eregi("^http://",$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'] = "<a rel="nofollow noopener noreferrer" href='".$row['typeurl']."'>".$row['typename']."</a>";
	    $row['image'] = "<img src='".$row['picname']."' border='0' width='$imgwidth' height='$imgheight'>";
	    $row['imglink'] = "<a rel="nofollow noopener noreferrer" href='".$row['filename']."'>".$row['image']."</a>";
	    $row['fulltitle'] = $row['title'];
	    $row['title'] = cn_substr($row['title'],$titlelen);
	    if($row['color']!='') $row['title'] = "<font color='".$row['color']."'>".$row['title']."</font>";
	    if(ereg('b',$row['flag'])) $row['title'] = "<strong>".$row['title']."</strong>";
	    $row['textlink'] = "<a rel="nofollow noopener noreferrer" href='".$row['filename']."'>".$row['title']."</a>";
	    $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 .= " </td> ";
	  }
	  //Loop Col
	  if($col>1) $i += $col - 1;
	  if($col>1) $artlist .= " </tr> ";
	 }
	 //loop line
	 if($col>1) $artlist .= " </table> ";
	 $dsql->FreeResult("al");
	 return $artlist;
	}
	?>
	

UTF-8格式文件下载 GBK/GB2312格式文件下载

调用代码为:

	
	{dede:likearticle col='2' row='8' titlelen='48' mytypeid='4' eregtype=all|tag|keyword}
	<li><a rel="nofollow noopener noreferrer" href="[field:arcurl/]">[field:title/]</a></li>
	{/dede:likearticle}
	

代码释义:

eregtype属性

eregtype = keyword 只匹配关键字

eregtype = tag 只匹配tag

eregtype = all tag优先,不存在tag则匹配关键字

mytypeid='' 栏目ID,多个栏目用,隔开

以上就是DedeCMS通过Tag和Keyword标签获取相关文章的方法。世事往往如此,想回头也已经来不及,即使你肯沦为劣马,也不一定有回头草在等你。更多关于DedeCMS通过Tag和Keyword标签获取相关文章的方法请关注haodaima.com其它相关文章!

您可能有感兴趣的文章
织梦后台文档列表添加复制文档功能支持所有模型

织梦无法上传ico图标格式文件的如何解决方法

dedecms如何实现任意页面调用当前会员信息的方

织梦dede:tag调用指定多个栏目的TAG标签

织梦栏目列表按附加表自定义字段排序