为自定义字段创建搜索表单


11

我为汽车经销商建立了一个主题。每辆汽车都是自定义帖子类型(“车辆”),并具有约12个自定义字段,其中包括品牌,型号,里程,燃料类型等。

因此,基本上在主页上,我需要一个搜索表单,该表单具有用于Make&Model的下拉列表,并包含任何可用的Make或Models。

我还希望它具有Year的2个选项,因此最终用户可以选择“ 2006”和“ 2012”,并且搜索结果包含年份在这两个数字之间的所有车辆。

有没有可以做到这一点的插件?

谢谢你的帮助..这已经使我疯狂了好几个小时!!!


我认为您可以使用此插件来帮助您更好地wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI 2014年

谢谢..但是,这并不能解释如何实际创建搜索表单。我的意思是我可以用HTML编写表单,但实际上如何使它起作用?
absdigital 2014年

Answers:


16

______更新________
尽管我获得了越来越多的选票,并且该解决方案可行,但是cybmeta的答案实际上是一种很好的答案,并且是WordPress的方式。您绝对应该尝试一下。

第1步

首先制作一个您希望用户与网站进行交互的高级搜索表单,并用一个名称保存它(即,我将其另存为advanced-searchform.php-但不保存为该名称,searchform.php那么它将替换WordPress的默认搜索表单):

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

然后像下面这样将表单调用到您的模板中:

<?php get_template_part( 'advanced', 'searchform' ); ?>

现在,您的搜索表单已准备就绪,您现在可以使用搜索表单并将用户输入的内容输入URL。

第2步

你刚才需要的是:查询数据库和查询岗位类型和它的自定义字段按搜索查询。请记住,您的搜索查询现在是您提交表单后获得的URL。现在,请WordPress在提交表单时加载您的自定义搜索结果页面。将以下函数放入您的函数中functions.php,以启用您的自定义搜索模板,而不是默认模板search.php

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

我将代码从WPSE带到某个地方(我忘记了根源),但是使用上面的代码存在争议。但这确实有效(当然,la脚的借口)。

检查@GM建议的另一种方法

第三步

制作一个新文件并使用保存advanced-search-result.php(因为我们在中使用了此名称functions.php),现在您可以自由使用了-显然。概念是:

  • 从网址中获取数据,
  • 使用简单WP_Query()的查询(如果查询很复杂则使用$wpdb查询),
  • 在查询中传递命令,从db获取数据,以及
  • 显示结果

样本可以是:

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // finds models that matches 'model' from the select field
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

所以,这是您的最后一件事。但是仍然存在许多挑战:

  • 备用值 -可以使用所有字段或该字段的ANY进行高级搜索,因此您必须确保Query会根据搜索和数据获取所有结果。您可以$wpdb对复杂的搜索结果使用自定义SQL查询,而该查询将是纯MySQL-WordPress完全没有。
  • 消毒和验证 -文本字段和文本区域非常脆弱,可能导致对您的网站的不当使用。因此,传递原始数据将是不安全的,您需要先对它们进行清理和验证,然后再传递给db查询。(使用WordPress进行数据消毒和验证 -TutsPlus
  • 设计 -您可以选择page.php(或search.php)模板,并以此为基础制作此页面。

因此,您有了主意,现在该轮到探索和发现方式了。记住,每个人的方式都不一样。做你的,以便我可以跟随你。:)


谢谢您抽出宝贵的时间,非常感谢您。您知道我怎么拥有它,因此“制造商”的下拉菜单会自动显示在一个车位中输入的任何制造商吗?
2014年

如果它对您有用,将很高兴。:)
Mayeenul Islam 2014年

您知道我怎么拥有它,以便“制造商”的下拉菜单会自动显示在一个车位中输入的任何制造商吗?
2014年

使用WP_Query()使用自定义字段参数并循环显示结果<option>
Mayeenul Islam 2014年

我希望使用pre_get_posts挂钩而不是辅助循环来完成此“高级搜索” 。
cybmeta 2015年

23

尽管@MayeenulIslam的答案可能有效,但我认为进行高级搜索的正确方法是使用pre_get_posts动作挂钩。

步骤1:搜寻表格

这一步等于在对方的回答步骤1中,只是改变了id的的name字段(<input type="text" ...>用于搜索,以“S”中,这样就可以直接用于作为搜索字段。这段代码保存advanced-searchform.php你的主题文件夹下。然后,使用get_template_part( 'advanced', 'searchform' );到将其加载到您希望其出现在主题中的位置:

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

步骤2:将过滤器添加到搜索查询

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

第3步:模板化(可选)

通过这种方法,将使用WordPress的默认搜索模板来过滤结果,而无需二级查询。如果要使用其他模板进行高级搜索,则可以使用template_include过滤器。例如,如果要使用advanced-search-template.php文件作为高级搜索表单中结果的模板:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}

3
非常感谢您使用WordPress的方式。刚刚与这个工作,真是太棒了。:)
Mayeenul Islam 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.