配置typecho的多分类筛选 - spzac主题篇

如图所示,这个功能并没有整合到主题里面,是因为大部分功能都是固定写死的,比如每个人的主题字段都不一样,而多分类筛选是可以按字段来检索的,所以就简单的在这里分享一下教程,但是具体来说,还是较为复杂,也就简单看看思路把

QQ图片20210326085925.png

页面地址:https://www.veimoz.com/search/sy/?allsuo=1&cat=1&prox=0&leix=&price=0&status=1

域名+/search/sy/ = 意思是搜索关键字为“sy”的搜索页面

这里就只是为了获取搜索页面,搜索任意关键字都可以,然后看看

?allsuo=1&cat=1&prox=0&leix=0&price=0&status=1

这里是搜索页面后面的参数,以“?”开始,allsuo=1的意思为启用多分类筛选,cat=1为指定的栏目id,prox=0&leix=0&price=0&status=1自定义字段prox,leix,price,status为0,我这里的0是指全部搜索

字面上的意思就是搜索栏目id为1的文章里面带字段prox,leix,price,status的指定搜索

QQ图片20210326085925.png

我这里的程序类型,费用都是以字段来进行区分搜索

也就是搜索出来字段不同的结果都是不同的搜索路径地址,

比如:

https://www.veimoz.com/search/sy/?allsuo=1&cat=1&prox=0&leix=2&price=0&status=1

这是下载类的字段搜索结构

https://www.veimoz.com/search/sy/?allsuo=1&cat=1&prox=0&leix=4&price=0&status=1

这是博客类的字段搜索结构

QQ图片20210326085925.png

我这里高亮筛选的效果,是因为专门做了接受参数的处理,比如

$prox=$_GET['prox'];
$leix=$_GET['leix'];
$price=$_GET['price'];
$status=$_GET['status'];

if(!$prox){$prox=0;}
if(!$lex){$lex=0;}
if(!$price){$price=0;}
if(!$status){$status=0;}

$prox获取了$_GET['prox'];参数值,如果没有值,就赋予默认值为0,如果存在值,比如<?php if($prox==2){ echo "sol_live";}?> 就输出高亮的样式类,这样就通过判断参数值来显示当前搜索页面的高亮效果

完整代码:

<div class="solist">
<span class="button">程序:</span>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=0&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==0){ echo "sol_live";}?>" >全部</a>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=2&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==2){ echo "sol_live";}?>" >wordpress</a>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=1&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==1){ echo "sol_live";}?>" >typecho</a>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=6&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==6){ echo "sol_live";}?>" >zblog</a>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=7&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==7){ echo "sol_live";}?>" >maccms</a>
<a href="<?php $this->options->siteUrl(); ?>search/sy/?allsuo=1&cat=1&prox=4&leix=<?php echo $leix; ?>&price=<?php echo $price; ?>&status=<?php echo $status; ?>" class="<?php if($prox==4){ echo "sol_live";}?>" >帝国cms</a>
</div>

很简单吧

接下来是核心部分,就是各种不同的字段是怎么搜索出来结果的,这里主要是Soso高级检索插件的功能

参考代码:

$po = $obj->select()
            ->from('table.contents')
            ->join('table.relationships a','a.cid = table.contents.cid','left')
            ->join('table.relationships b','b.cid = table.contents.cid','left')
            ->join('table.metas c','c.mid = a.mid and c.type ="category"','left')
            //->join('table.metas d','d.mid = b.mid and d.type ="tag"','left')
            ->join('table.fields f','f.cid = table.contents.cid and f.name ="prox"','left')
            ->join('table.fields e','e.cid = table.contents.cid and e.name = "leix"','left')
            ->join('table.fields p','p.cid = table.contents.cid and p.name = "tprice"','left')
            ->where("table.contents.password IS NULL OR table.contents.password = ''")
            ->where('table.contents.status = ?', 'publish')
            ->where('table.contents.type = ?', 'post');
            //筛选分类
            if($cat>0){
                $po = $po ->where('c.mid='.$cat.' or c.parent  = '.$cat);
            }
            //筛选类型
            if($leix>0){
            $po = $po->where('e.str_value = ?',$leix);
            }
            //筛选程序
            if($prox>0){
            $po = $po->where('f.str_value = ?',$prox);  
            }
            //筛选程序
            if($price==2){
            $po = $po->where("p.str_value IS NULL OR p.str_value = ''"); //免费筛选
            }
            if($price==1){
            $po = $po->where("p.str_value <> ''"); //付费筛选
            }

这里较为复杂,实在没能力一句一句的,大概意思就是检索一个字段的内容,然后再检索另一个字段的内容,共同符合字段的搜索结果才是最终内容,注意里面的a,b,c,d,e的用法,以此参考就可以举一反三了

QQ图片20210326085925.png

最后一个排序是最新发布,最受欢迎,最多访问,这个较为简单,就是对以上筛选好的内容,再通过数据库的mysql语法去区分排序

if($status==0){//最新发布
   $po = $po->order('table.contents.modified', Typecho_Db::SORT_DESC)
   ->page($page, $obj->parameter->pageSize);
  }
  if($status==1){//最受欢迎
   $po = $po->order('table.contents.views', Typecho_Db::SORT_DESC)
   ->page($page, $obj->parameter->pageSize);
  }
  if($status==2){//最多访问
   $po = $po->order('table.contents.agree', Typecho_Db::SORT_DESC)
   ->page($page, $obj->parameter->pageSize);
  }

因为主题里面已经包含了时间,访问量和点赞数,所以简单的通过mysql语法去排序结果就可以了,还是一样安装搜索页面的参数做指令筛选

多分类的筛选功能我是整合到主题的插件里面的,由插件来控制,本教程个人觉得不适合新手去尝试,多尝试尝试吧,如有疑问,下方留言~~

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/917
2 条评论
4.8k

发表评论

已有 2 条评论

  1. ₍₍..絕對ꦿ     Win 10 /    Chrome
    2022-05-10 00:30

    能把这个功能集成到模板配套插件里面去吗? 改代码对我这种还没入门的小白着实太难了。。:大哭:

    1. 【管理员】Vv     Win 10 /    Chrome
      2022-05-11 09:14

      @₍₍..絕對ꦿ

      不能,大部分的文章, 只是为了收纳思路,这些功能对主题来说,难度太大,如果个别真的需要,可以付费定制

!