前几天一网友找我写一个筛选功能,他要做一个关于房产信息的网站,希望访客能在网页上根据条件筛选符合条件的文章。
根据他的功能要求,我给他的建议是,给每个筛选条件建立自定义分类法。比如他需求是根据四个条件来筛选,省、市、类型、价格。
其次,筛选页面我还是根据习惯使用了以前的伪静态方法,使访问的url地址类型为:www.shouce.ren/sift/、www.shouce.ren/sift/0_0_0_0、www.shouce.ren/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 ) ); } //获取筛选页面的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: *shouce.ren/sift shouce.ren/sift/0_0_0_0/ shouce.ren/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'); 筛选页面的内容较多,直接贴出,部分代码有注释。大概思路就是: 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. 先在主题文件夹下面建立一个page-sift.php文件(文件名无要求,与下面代码中对应即可),这个文件将作为筛选页面的模板文件。
2.添加重写规则,使得用户访问类似www.shouce.ren/sift、www.shouce.ren/sift/0_0_0_0类型url时,不会出现404,而且能正确加载模板。
关于wordpress重写规则,你也可以访问wordpress进阶教程(16):添加一个重写规则,构建新页面初试
下列代码存放在本教程提供的主题中的 include/rewrite.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 ) ); } //获取筛选页面的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: *shouce.ren/sift shouce.ren/sift/0_0_0_0/ shouce.ren/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'); 筛选页面的内容较多,直接贴出,部分代码有注释。大概思路就是: 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>
由此,添加完代码后,你可以尝试重新启用你的主题,看访问类似www.shouce.ren/sift地址的时候是否会出现404,如果是空白页,那就对了,因为我们的筛选页面模板page-sift.php还没有添加内容,所以是空白页。
步骤三、筛选页面模板
前面步骤二中,我们已经为筛选页面建立了页面模板page-sift.php,而且使用wordpress的url重写使得我们的筛选url能正确载入模板。接下来就要完善筛选页面的内容。
//给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 ) ); } //获取筛选页面的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: *shouce.ren/sift shouce.ren/sift/0_0_0_0/ shouce.ren/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'); 筛选页面的内容较多,直接贴出,部分代码有注释。大概思路就是: 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.shouce.ren/sift 或者www.shouce.ren/sift/0_1_1_0等等。
好了,阿树只能帮网友们到这了。
阿树工作室-筛选功能