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

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

页面地址: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的指定搜索

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

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

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

比如:

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

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

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

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

$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,如果存在值,比如 就输出高亮的样式类,这样就通过判断参数值来显示当前搜索页面的高亮效果

完整代码:

很简单吧

接下来是核心部分,就是各种不同的字段是怎么搜索出来结果的,这里主要是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的用法,以此参考就可以举一反三了

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

最后一个排序是最新发布,最受欢迎,最多访问,这个较为简单,就是对以上筛选好的内容,再通过数据库的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语法去排序结果就可以了,还是一样安装搜索页面的参数做指令筛选

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

TAGS:typecho 多分类筛选
!如链接失效请在下方留言。本站所有资源均来源于网络,版权属于原作者!仅供学习参考,本站不对您的使用负任何责任。如果有侵权之处请第一时间联系我们删除,敬请谅解!