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 href='”.$row[
‘typeurl’].
“‘>”.$row[
‘typename’].
“</a>”;

        $row[
‘image’] =
“<img src='”.$row[
‘picname’].
“‘ border=’0′ width=’$imgwidth’ height=’$imgheight’
>”;

        $row[
‘imglink’] =
“<a 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 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 href=
“[field:arcurl/]”>[field:title/]</a></li>

{/dede:likearticle}

 

代码释义:

eregtype属性

eregtype = keyword 只匹配关键字

eregtype = tag 只匹配tag

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

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