在做一些内容比较丰富的 CMS 站点、产品站点或在线商店的时候,我们需要对网站的内容进行筛选过滤,比较通用的方法就是以产品分类或产品属性作为过滤条件(产品属性也可以看成具有某种共同属性的分类)。
对数码产品比较关注的朋友对下面的功能应该很熟悉,这是中关村在线的产品列表页面的截图。
下面这一个是我为客户定制的一个明星过滤的截图,前台过滤条件中的所有分类都可以在后台添加。过滤条件在后台以自定义分类项目或自定义字段的形式出现。
上面的效果看似复杂,实现起来其实也不困难,这主要得益于 WordPress 灵活的数据结构和丰富的功能函数,下面我们就来看看如何实现上面的功能。
添加查询参数,构造查询 URL
实现上面的功能主要通过 WordPress 的自定义查询和 add query var 函数。
第一步,我们需要列出自定义分类里面的所有分类项目作为查询条件,这一步是关键所在。
$args = array('taxonomy' => 'star_aera');
$terms = get_terms('star_aera', $args);
$is_all = get_query_var('star_aera') ? '' : 'checked';
$term_list_area .= '<input name="star_aera"' . $is_all . ' type="checkbox" value="' . remove_query_arg('star_aera') . '" onclick="location.href=this.value">' . '所有';
$count = count($terms);
if ($count > 0) {
foreach ($terms as $term) {
$is_checked = (get_query_var('star_aera') == $term->term_id) ? 'checked' : '';
$term_list_area .= '<input name="star_aera" type="checkbox"' . $is_checked . ' value="' . add_query_arg(array('star_aera' => $term->term_id, 'paged' => false)) . '" onclick="location.href=this.value">' . $term->name;
}
echo $term_list_area;
}
合并多种查询条件并构造查询
然后根据查询条件,查询后台的内容,并输出。
if (!empty($star_zhiye)) {
//构造其中一个查询条件的查询数组,这里是根据自定义字段查询
$array_star_zhiye = array(
'taxonomy' => 'star_zhiye',
'field' => 'id',
'terms' => $star_zhiye,
);
} else {
$array_star_zhiye = "";
};
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
//合并所有查询调节并构造查询参数
$args = array(
'post_type' => 'star',
'posts_per_page' => '12',
's' => $phone,
'paged' => $paged,
'tax_query' => array(
'relation' => 'AND',
//$array_star_sex,
//$array_star_chuchang,
//$array_star_daiyan,
//$array_star_aera,
$array_star_zhiye, //篇幅问题,上面的4个查询条件省略掉了,可以根据自己的需要添加
)
);
//新建查询对象
$wp_query = new WP_Query($args);
输入自定义查询结果
有了上面的自定义查询对象,我们就可以像 WordPress 普通的分类模板那样输出文件内容了。
while ($wp_query->have_posts()) : $wp_query->the_post();
get_template_part('content', 'stars');
endwhile;
其实 WordPress 发展到今天,早已不只是当初的 Blog 程序了,她已经强大到可以作为一个功能全面的 CMS 甚至是 PHP 框架来使用了。根据不同的需求,我们完全可以定制出各种各样的Web应用程序。
9 thoughts on “WordPress 根据多种条件筛选查询内容-类似于中关村手机查询”
你好,能否给一个空白主题的案例代码分享呢?
你的意思是带这个筛选功能的主题?
嗯嗯,可以分享下吗,谢谢
这个是集成到一个定制主题里面的,有空的时候做成插件放出来吧。
第一步里面的内容应该放在主题函数文件还是哪个文件里面啊?
放在新建的模板文件里面。
三部分代码应该怎么放入?是都放入函数文件还是单独的页面文件里面啊?代码看了就是不知道放哪些文件里面
都是放到自定义页面模板中的。
已收藏,学习了!