前几天一网友找我写一个筛选功能,他要做一个关于房产信息的网站,希望访客能在网页上根据条件筛选符合条件的文章。
根据他的功能要求,我给他的建议是,给每个筛选条件建立自定义分类法。比如他需求是根据四个条件来筛选,省、市、类型、价格。
其次,筛选页面我还是根据习惯使用了以前的伪静态方法,使访问的 url 地址类型为:www.ashuwp.com/sift/、 www.ashuwp.com/sift/0_0_0_0 、 www.ashuwp.com/sift/1_23_33_32/ 后面以下划线分割的字符,就是我们要筛选的参数,分别为四个分类的 ID 。然后根据这四个 ID 值,来筛选符合条件的文章。最终效果:
要做这种功能,内容较多,文章最后面直接提供一个我已经写好了此功能的极简单主题,安装即可用。
注意:本文内容仅仅在伪静态状态下可用,win 主机,不管你伪不伪静态,,,都勿用。
步骤一:建立自定义分类法。
本教程讲述的内容中用到了四个筛选条件:省、市、类型、价格。所以,我就给建立四个自定义分类法 (使用默认的 post) 。使用下述代码,你可以直接复制粘贴到 functions.php 文件中。关于自定义分类法,你也可以访问 WordPress 进阶教程 (三): 创建自定义分类法
下列代码存放在本教程提供的主题中的 include/taxonomy.php 文件中
- //给 post 创建四个自定义分类法
- add_action('init', 'ashu_post_type');
- function ashu_post_type() {
- register_taxonomy(
- 'province',
- 'post',
- array(
- 'label' => '省',
- 'rewrite' => array( 'slug' => 'province' ),
- 'hierarchical' => true
- )
- );
- register_taxonomy(
- 'city',
- 'post',
- array(
- 'label' => '市',
- 'rewrite' => array( 'slug' => 'city' ),
- 'hierarchical' => true
- )
- );
- register_taxonomy(
- 'genre',
- 'post',
- array(
- 'label' => '类型',
- 'rewrite' => array( 'slug' => 'genre' ),
- 'hierarchical' => true
- )
- );
- register_taxonomy(
- 'price',
- 'post',
- array(
- 'label' => '价格',
- 'rewrite' => array( 'slug' => 'price' ),
- 'hierarchical' => true
- )
- );
- }
添加完代码,应该在后台文章下面会多出四个自定义分类法:
步骤二:添加筛选默认,重写规则。
1. 先在主题文件夹下面建立一个 page-sift.php 文件 (文件名无要求,与下面代码中对应即可),这个文件将作为筛选页面的模板文件。
2. 添加重写规则,使得用户访问类似 www.ashuwp.com/sift 、 www.ashuwp.com/sift/0_0_0_0 类型 url 时,不会出现 404,而且能正确加载模板。
关于 WordPress 重写规则,你也可以访问 WordPress 进阶教程 (16): 添加一个重写规则,构建新页面初试
下列代码存放在本教程提供的主题中的 include/rewrite.php 文件中:
- //获取筛选页面的 Url
- function ashuwp_sift_link(){
- return home_url()."/sift";
- }
- /*
- *添加 query 变量
- */
- function ashuwp_query_vars($public_query_vars) {
- $public_query_vars[] = 'ashuwp_page';
- $public_query_vars[] = 'condition';
- return $public_query_vars;
- }
- /*
- *sift 页面的重写规则, 三种 url:
- *ashuwp.com/sift ashuwp.com/sift/0_0_0_0/ ashuwp.com/sift/0_0_0_0/page/2
- */
- function ashuwp_rewrite_rules( $wp_rewrite ){
- $new_rules = array(
- 'sift/?$' => 'index.php?ashuwp_page=sift',
- 'sift/([^/]+)/?$' => 'index.php?ashuwp_page=sift&condition='.$wp_rewrite->preg_index(1),
- 'sift/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?ashuwp_page=sift&condition='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2)
- );
- $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
- }
- /*
- *载入模板规则
- *用 page-sift.php 作为筛选页面的模板文件
- */
- function ashuwp_template_redirect(){
- global $wp,$wp_query,$wp_rewrite;
- if( !isset($wp_query->query_vars['ashuwp_page']) )
- return;
- $reditect_page = $wp_query->query_vars['ashuwp_page'];
- if ($reditect_page == "sift"){
- include(get_template_directory().'/page-sift.php');
- die();
- }
- }
- /*
- *更新重写规则
- *激活主题的时候
- */
- function ashuwp_flush_rewrite_rules() {
- global $pagenow, $wp_rewrite;
- if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
- $wp_rewrite->flush_rules();
- }
- add_action( 'load-themes.php', 'ashuwp_flush_rewrite_rules' );
- add_action('generate_rewrite_rules', 'ashuwp_rewrite_rules' );
- add_action('query_vars', 'ashuwp_query_vars');
- add_action("template_redirect", 'ashuwp_template_redirect');
由此,添加完代码后,你可以尝试重新启用你的主题,看访问类似 www.ashuwp.com/sift 地址的时候是否会出现 404,如果是空白页,那就对了,因为我们的筛选页面模板 page-sift.php 还没有添加内容,所以是空白页。
步骤三、筛选页面模板
前面步骤二中,我们已经为筛选页面建立了页面模板 page-sift.php,而且使用 WordPress 的 url 重写使得我们的筛选 url 能正确载入模板。接下来就要完善筛选页面的内容。
筛选页面的内容较多,直接贴出,部分代码有注释。大概思路就是:
1. 先获取所有分类法的所有分类 ID,有两个用途:判断从 url 获取的分类 ID 是否存在、输出筛选页面中筛选条件的 url 。
2. 从 url 中获取四个 ID 参数。
3. 输出筛选条件列表。注意判断当前访问、以及 「不限」 的条件
4. 根据条件查询文章。
下面代码存在放本教程提供的主题的 page-sift.php 文件中
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title> 阿树工作室--筛选页面教程</title>
- <link rel='stylesheet' id='ashuwp-style-css' href='<?php echo get_stylesheet_uri(); ?>' type='text/css' media='all' />
- </head>
- <body>
- <div id="site-page">
- <div id="header">
- <h1 id="logo">
- <a href="http://www.treework.cn">treework.cn</a>
- </h1>
- <h2 class="align-cenetr"> 阿树工作室--筛选页面教程</h2>
- </div>
- <div class="container content">
- <?php
- //1.1 获取所有 province 分类, 将 id 放入 $province_id 数组
- $args = array(
- 'taxonomy'=>'province',
- 'orderby'=>'id',
- 'hide_empty'=>0
- );
- $province_ob = get_categories( $args );
- $province_id = array();
- foreach($province_ob as $province){
- $province_id[] = $province->term_id;
- }
- //1.2 获取所有 city 分类, 将 id 放入 $city_id 数组
- $args = array(
- 'taxonomy'=>'city',
- 'orderby'=>'id',
- 'hide_empty'=>0
- );
- $city_ob = get_categories( $args );
- $city_id = array();
- foreach($city_ob as $city){
- $city_id[] = $city->term_id;
- }
- //1.3 获取所有 genre 分类, 将 id 放入 $genre_id 数组
- $args = array(
- 'taxonomy'=>'genre',
- 'orderby'=>'id',
- 'hide_empty'=>0
- );
- $genre_ob = get_categories( $args );
- $genre_id = array();
- foreach($genre_ob as $genre){
- $genre_id[] = $genre->term_id;
- }
- //1.4 获取所有 price 分类, 将 id 放入 $price_id 数组
- $args = array(
- 'taxonomy'=>'price',
- 'orderby'=>'id',
- 'hide_empty'=>0
- );
- $price_ob = get_categories( $args );
- $price_id = array();
- foreach($price_ob as $price){
- $price_id[] = $price->term_id;
- }
- //2 参数处理
- //2.1 页码
- $wp_query->query_vars['paged'] > 1 ? $pagenum = $wp_query->query_vars['paged'] : $pagenum = 1;
- /*2.2 从 url 中获取参数 即 url 中 0_0_0_0
- *将获取到的四个参数放入 $cons 数组中
- */
- global $wp_query;
- if( isset($wp_query->query_vars['condition']) && $wp_query->query_vars['condition']!='' ){
- $condition = $wp_query->query_vars['condition'];
- $conditions = explode('_',$condition);
- $cons = array();
- if(isset($conditions[0])){
- $conditions[0] = (int)$conditions[0];
- }else{
- $conditions[0]=0;
- }
- if(isset($conditions[1])){
- $conditions[1] = (int)$conditions[1];
- }else{
- $conditions[1]=0;
- }
- if(isset($conditions[2])){
- $conditions[2] = (int)$conditions[2];
- }else{
- $conditions[2]=0;
- }
- if(isset($conditions[3])){
- $conditions[3] = (int)$conditions[3];
- }else{
- $conditions[3]=0;
- }
- //从 url 中获取到的各分类法分类 ID 是否真实存在
- if( in_array($conditions[0],$province_id) ){
- $cons[0]=$conditions[0];
- }else{
- $cons[0]=0;
- }
- if( in_array($conditions[1],$city_id) ){
- $cons[1]=$conditions[1];
- }else{
- $cons[1]=0;
- }
- if( in_array($conditions[2],$genre_id) ){
- $cons[2]=$conditions[2];
- }else{
- $cons[2]=0;
- }
- if( in_array($conditions[3],$price_id) ){
- $cons[3]=$conditions[3];
- }else{
- $cons[3]=0;
- }
- $sift_link = ashuwp_sift_link().'/'.$cons[0].'_'.$cons[1].'_'.$cons[2].'_'.$cons[3];
- }else{
- $cons = array(0,0,0,0);
- $sift_link = ashuwp_sift_link().'/0_0_0_0';
- }
- ?>
- <div class="sift_query">
- <div class="sift_cons">
- <div class="sift_li">
- <span> 省:</span>
- <a <?php if($cons[0]==0){ echo 'class="current"'; } ?> href="<?php echo ashuwp_sift_link(); ?>/0_<?php echo $cons[1];?>_<?php echo $cons[2];?>_<?php echo $cons[3];?>/"> 不限</a>
- <?php
- foreach( $province_ob as $province ){
- ?>
- <a href="<?php echo ashuwp_sift_link(); ?>/<?php echo $province->term_id; ?>_<?php echo $cons[1]; ?>_<?php echo $cons[2]; ?>_<?php echo $cons[3];?>" <?php if($cons[0] == $province->term_id){ echo 'class="current"'; } ?>><?php echo $province->name; ?></a>
- <?php } ?>
- </div>
- <div class="sift_li"><span> 市:</span><a <?php if($cons[1] == 0){ echo 'class="current"'; } ?> href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0];?>_0_<?php echo $cons[2]; ?>_<?php echo $cons[3];?>/"> 不限</a>
- <?php
- foreach( $city_ob as $city ){ ?>
- <a href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0]; ?>_<?php echo $city->term_id; ?>_<?php echo $cons[2]; ?>_<?php echo $cons[3];?>" <?php if($cons[1] == $city->term_id){ echo 'class="current"'; } ?>><?php echo $city->name; ?></a>
- <?php } ?>
- </div>
- <div class="sift_li"><span> 类型:</span><a <?php if($cons[2] == 0){ echo 'class="current"'; } ?> href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0];?>_<?php echo $cons[1]; ?>_0_<?php echo $cons[3];?>/"> 不限</a>
- <?php
- foreach( $genre_ob as $genre ){ ?>
- <a href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0]; ?>_<?php echo $cons[1]; ?>_<?php echo $genre->term_id; ?>_<?php echo $cons[3];?>" <?php if($cons[2] == $genre->term_id){ echo 'class="current"'; } ?>><?php echo $genre->name; ?></a>
- <?php } ?>
- </div>
- <div class="sift_li"><span> 价格:</span><a <?php if($cons[3] == 0){ echo 'class="current"'; } ?> href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0];?>_<?php echo $cons[1]; ?>_<?php echo $cons[2]; ?>_0/"> 不限</a>
- <?php
- foreach( $price_ob as $price ){ ?>
- <a href="<?php echo ashuwp_sift_link(); ?>/<?php echo $cons[0]; ?>_<?php echo $cons[1]; ?>_<?php echo $cons[2]; ?>_<?php echo $price->term_id; ?>" <?php if($cons[3] == $price->term_id){ echo 'class="current"'; } ?>><?php echo $price->name; ?></a>
- <?php } ?>
- </div>
- </div>
- <?php
- //将获取到的参数组合为 query_posts 的参数
- $tax_query = array(
- 'relation'=> 'AND',
- );
- //province
- if( $cons[0] != 0 ){
- $tax_query[] = array(
- 'taxonomy'=>'province',
- 'field'=>'id',
- 'terms'=>$cons[0]
- );
- }
- //city
- if( $cons[1] != 0 ){
- $tax_query[] = array(
- 'taxonomy'=>'city',
- 'field'=>'id',
- 'terms'=>$cons[1]
- );
- }
- //genre
- if( $cons[2] != 0 ){
- $tax_query[] = array(
- 'taxonomy'=>'genre',
- 'field'=>'id',
- 'terms'=>$cons[2]
- );
- }
- //price
- if( $cons[3] != 0 ){
- $tax_query[] = array(
- 'taxonomy'=>'price',
- 'field'=>'id',
- 'terms'=>$cons[3]
- );
- }
- $args = array(
- 'paged' => $pagenum,
- 'tax_query'=> $tax_query
- );
- global $ashuwp_query;
- $ashuwp_query = new WP_Query( $args );
- ?>
- <div class="query_count"> 共找到<?php echo $ashuwp_query->found_posts;?> 个符合条件的内容</div>
- </div>
- <?php
- if($ashuwp_query->have_posts()) : ?>
- <div id="post_list">
- <?php while($ashuwp_query->have_posts()) : $ashuwp_query->the_post(); ?>
- <div class="post">
- <a href="<?php the_permalink();?>"><?php the_title();?></a>
- </div>
- <?php endwhile;?>
- </div>
- <?php endif; ?>
- <div id="ashuwp_page">
- <?php
- $pagination = paginate_links( array(
- 'base' => $links.'/page/%#%',
- 'format' => '/page/%#%',
- 'prev_text' => '上一页',
- 'next_text' => '下一页',
- 'total' => $ashuwp_query->max_num_pages,
- 'current' => $pagenum
- ) );
- if ( $pagination ) {
- echo $pagination;
- }
- ?>
- </div>
- </div>
- </div><!--site-page-->
- <div id="footer">
- <div class="container">
- <p> 阿树工作室,联系作者 admin@treework.cn</p>
- </div>
- </div>
- </body>
- </html>
文件下载
下载的文件为一个极简单的主题,效果预览步骤:
1. 下载主题并安装,并设置好伪静态
2. 添加几篇文章到自定义分类法中
3. 直接访问筛选页面的 url,比如 www.ashuwp.com/sift 或者 www.ashuwp.com/sift/0_1_1_0 等等。
好了,阿树只能帮网友们到这了。
阿树工作室-筛选功能
以下内容为 2016 年 3 月增加:
有网友提到如何修改页面的标题,这里给出一个简单粗暴的范例,如果你需要更自由的修改方式,请参考官网关于 wp_title 函数的介绍:
- //修改筛选页面的标题
- add_filter('wp_title','ashuwp_sift_page_title',10,1);
- function ashuwp_sift_page_title($title){
- global $wp_query;
- //与载入模板的判断类似
- if( isset($wp_query->query_vars['ashuwp_page']) && $wp_query->query_vars['ashuwp_page']=='sift' ){
- $title = '筛选页面-阿树工作室';
- }
- return $title;
- }