我想为特定的自定义帖子类型构建高级搜索表单,为自定义帖子类型自定义字段,自定义分类法以及单独的自定义帖子类型属性(字段和分类法)创建过滤器,这些属性将链接到第一个使用自定义关系字段的帖子类型。

我最近开始使用WP的自定义帖子类型,字段和分类法,到目前为止,我还是很喜欢的,但是要尽我所能能够正确搜索它。我需要手动做吗?如果是,怎么办?

PS。如果有问题,我将使用以下插件:高级自定义字段和自定义帖子类型用户界面。

下面,我模拟了一个示例,说明过滤的外观以及与帖子的关系上面的类型。



评论

如果有人在执行上述布雷迪的解决方案时遇到困难(如我所做的那样),则有一个提示:似乎Wordpress在传递会话数据方面存在一些问题,因此您可能需要做一些额外的工作才能使其正常工作。这里讨论了这些问题:frank-verhoeven.com/using-session-in-wordpress对于我来说,安装Peter Wooster的“简单会话支持”插件很有效。在帖子的评论部分有指向该插件的链接。

#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