我最近开始使用WP的自定义帖子类型,字段和分类法,到目前为止,我还是很喜欢的,但是要尽我所能能够正确搜索它。我需要手动做吗?如果是,怎么办?
PS。如果有问题,我将使用以下插件:高级自定义字段和自定义帖子类型用户界面。
下面,我模拟了一个示例,说明过滤的外观以及与帖子的关系上面的类型。
#1 楼
我认为最好是这样写自己。看看:http://www.catalysthomes.co.uk/homes-for-sale/
属性已加载到CPT中,我在侧边栏中有自己的自定义搜索。在该搜索中,它搜索许多内容,例如分类法,自定义字段和按日期价格排序等。
那么我该如何实现呢?我将表单提交到页面模板,然后从那里处理帖子数据并根据搜索条件构建一个新的WP_query。我使用会话存储搜索变量,以便可以对结果进行分页。
WP_Query非常强大。看看:http://codex.wordpress.org/Class_Reference/WP_Query
在这里您可以使用
meta_query
查询多个自定义字段,并使用tax_query
查询您的分类法,此外还有更多内容。下面是我的构建方法,以使您有所了解。模板文件:
<?php
$temp = $wp_query;
$wp_query = NULL;
$args = array();
?>
<?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
<?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>
<?php
$args['post_type'] = "homes-for-sale";
$args['showposts'] = 10;
$args['paged'] = $paged;
$wp_query = new WP_Query($args);
?>
<?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>
原始结果
<?php
if($_POST['sortby']) {
$_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}
switch($_SESSION['prop_selectedsortby']) {
case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
case "name-desc": $args['orderby'] = "title"; break;
case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
case "date-asc": $args['order'] = "ASC"; break;
default: /* No need to set arguments here as wp query defaults */ break;
}
$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>
搜索结果
<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_types_nbrs',
'value' => $_SESSION['s_property_ptype']
);
}
if( ! empty( $_SESSION['s_property_development'] ) ) {
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_ofdevelopment',
'value' => $_SESSION['s_property_development']
);
}
if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
$args['tax_query'][] = array(
'taxonomy' => 'areas',
'field' => 'id',
'terms' => array( (int) $_SESSION['s_property_area'] ),
);
}
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bedrooms',
'value' => $_SESSION['s_property_bedrooms_min'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bedrooms',
'value' => $_SESSION['s_property_bedrooms_max'],
'compare' => '<=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bathrooms',
'value' => $_SESSION['s_property_bathrooms_min'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bathrooms',
'value' => $_SESSION['s_property_bathrooms_max'],
'compare' => '<=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_fmv',
'value' => $_SESSION['s_property_min_price'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_fmv',
'value' => $_SESSION['s_property_max_price'],
'compare' => '<=',
'type' => 'SIGNED'
);
?>
列表布局
只是一个标准的WP循环以显示帖子摘录和信息。
评论
嗨,布雷迪,这个例子的Thx。请问是否可以分享表格?在其中,您将其提交到哪个URL?
–皂素
2012年6月28日7:46
@salocin-可以通过在答案中查看给定URL上的页面源来获取该信息
–斯科特
2012年6月28日上午8:06
th布雷迪,那么页面模板的网址?
–皂素
2012年6月28日上午11:49
表格在cataloghomes.co.uk上。您可以查看源代码并查看表单的工作方式
–斯科特
2012年6月28日13:15
您是否要检查自定义分类法是否将其作为自定义字段发布?您如何精确填充搜索表单? @布拉迪谢谢
–菲尔·哈德森(Phil Hudson)
16年2月19日下午6:00
#2 楼
尝试将Taxonomy Picker插件与Relevanssi一起使用。杀手组合。http://www.squidoo.com/taxonomy-picker-wordpress-plugin
http://wordpress.org/extend/plugins/relevanssi/
评论
这并没有考虑到职位关系,这是我问题中最困难的部分。通过分类法过滤帖子更容易,我需要过滤它们来购买相关文章的分类法(或自定义字段)。
–pax
2012年1月14日17:09
#3 楼
看看Relevanssi插件,它可能会满足您的需求:http://wordpress.org/extend/plugins/relevanssi/评论
它不适合我需要的方法(带有特定的过滤器),但是它是一个非常有趣的插件,它看起来像是默认搜索功能的绝佳替代品,非常感谢您指出它。
–pax
2012年1月10日17:37
#4 楼
如果有人(如我所做的那样)难以实施上述布雷迪的解决方案,则有一个提示:似乎WordPress在传递会话数据方面存在一些问题,因此您可能需要做一些额外的工作才能使其正常工作。在这里讨论这些问题在functions.php中:
function init_sessions() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'init_sessions');
在您的模板中:
/**
* Enable sessions
*/
if (!session_id())
session_start();
对我来说,安装Peter Wooster的“简单会话支持”插件可以达到目的。
评论
嗨,史蒂夫。感谢您在这里发布您的第一个答案。很高兴有您加入WPSE。为了将来参考,答案不应该完全围绕外部链接。如果链接被禁用,您的答案将变为良性。您介意通过几个示例相关的代码片段来更新您的答案吗?
–布莱恩·费格特(Brian Fegter)
2012年9月16日下午4:09
评论
如果有人在执行上述布雷迪的解决方案时遇到困难(如我所做的那样),则有一个提示:似乎Wordpress在传递会话数据方面存在一些问题,因此您可能需要做一些额外的工作才能使其正常工作。这里讨论了这些问题:frank-verhoeven.com/using-session-in-wordpress对于我来说,安装Peter Wooster的“简单会话支持”插件很有效。在帖子的评论部分有指向该插件的链接。