配置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的指定搜索
我这里的程序类型,费用都是以字段来进行区分搜索
也就是搜索出来字段不同的结果都是不同的搜索路径地址,
比如:
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
这是博客类的字段搜索结构
我这里高亮筛选的效果,是因为专门做了接受参数的处理,比如
$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的用法,以此参考就可以举一反三了
最后一个排序是最新发布,最受欢迎,最多访问,这个较为简单,就是对以上筛选好的内容,再通过数据库的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语法去排序结果就可以了,还是一样安装搜索页面的参数做指令筛选
多分类的筛选功能我是整合到主题的插件里面的,由插件来控制,本教程个人觉得不适合新手去尝试,多尝试尝试吧,如有疑问,下方留言~~
发表评论
已有 2 条评论
热门文章
Spimes主题专为博客、自媒体、资讯类的网站设计....
一款个人简历主题,可以简单搭建一下,具体也比较简单....
仿制主题,Typecho博客主题,昼夜双版设计,可....
用于作品展示、资源下载,行业垂直性网站、个人博客,....
热评文章
最新评论
Z.
4天前
博主你好,Deng插件,这个点击不进去,提示这个(Warning: require_once(/www/wwwroot/w.zzy2020.com/usr/plugins/Deng/Deng/html/profile.php): failed to open stream: No such file or directory in /www/wwwroot/w.zzy2020.com/Fresh/extending.php on line 26
Fatal error: require_once(): Failed opening required '/www/wwwroot/w.zzy2020.com/usr/plugins/Deng/Deng/html/profile.php' (include_path='.:/www/server/php/72/lib/php') in /www/wwwroot/w.zzy2020.com/Fresh/extending.php on line 26)
能把这个功能集成到模板配套插件里面去吗? 改代码对我这种还没入门的小白着实太难了。。:大哭:
@₍₍..絕對ꦿ
不能,大部分的文章, 只是为了收纳思路,这些功能对主题来说,难度太大,如果个别真的需要,可以付费定制