配置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

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

  1. $prox=$_GET['prox'];
  2. $leix=$_GET['leix'];
  3. $price=$_GET['price'];
  4. $status=$_GET['status'];
  5. if(!$prox){$prox=0;}
  6. if(!$lex){$lex=0;}
  7. if(!$price){$price=0;}
  8. if(!$status){$status=0;}

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

完整代码:

  1. <div class="solist">
  2. <span class="button">程序:</span>
  3. <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>
  4. <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>
  5. <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";}?>" >"https://www.veimoz.com/Typecho/" target="_blank">typecho</a>
  6. <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>
  7. <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>
  8. <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>
  9. </div>

很简单吧

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

参考代码:

  1. $po = $obj->select()
  2. ->from('table.contents')
  3. ->join('table.relationships a','a.cid = table.contents.cid','left')
  4. ->join('table.relationships b','b.cid = table.contents.cid','left')
  5. ->join('table.metas c','c.mid = a.mid and c.type ="category"','left')
  6. //->join('table.metas d','d.mid = b.mid and d.type ="tag"','left')
  7. ->join('table.fields f','f.cid = table.contents.cid and f.name ="prox"','left')
  8. ->join('table.fields e','e.cid = table.contents.cid and e.name = "leix"','left')
  9. ->join('table.fields p','p.cid = table.contents.cid and p.name = "tprice"','left')
  10. ->where("table.contents.password IS NULL OR table.contents.password = ''")
  11. ->where('table.contents.status = ?', 'publish')
  12. ->where('table.contents.type = ?', 'post');
  13. //筛选分类
  14. if($cat>0){
  15. $po = $po ->where('c.mid='.$cat.' or c.parent = '.$cat);
  16. }
  17. //筛选类型
  18. if($leix>0){
  19. $po = $po->where('e.str_value = ?',$leix);
  20. }
  21. //筛选程序
  22. if($prox>0){
  23. $po = $po->where('f.str_value = ?',$prox);
  24. }
  25. //筛选程序
  26. if($price==2){
  27. $po = $po->where("p.str_value IS NULL OR p.str_value = ''"); //免费筛选
  28. }
  29. if($price==1){
  30. $po = $po->where("p.str_value <> ''"); //付费筛选
  31. }

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

QQ图片20210326085925.png

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

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

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

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

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

发表评论

已有 2 条评论

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

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

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

      @₍₍..絕對ꦿ

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

!