创建自定义域的搜索表单

时间:2014-10-15 作者:absdigital

我为一家汽车经销商建立了一个主题。每辆车都是一种定制的post类型(“车辆”),大约有12个定制字段,包括品牌、型号、里程、燃油类型等。

因此,基本上在主页上,我想要一个带有Make&;下拉列表的搜索表单;模型,并包含任何可用品牌或模型。

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

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

谢谢你的帮助。。这已经让我发疯好几个小时了!!!!

2 个回复
最合适的回答,由SO网友:Mayeenul Islam 整理而成

______UPDATE_______<虽然我获得了越来越多的选票,解决方案也很有效,但是cybmeta\'s answer 事实上,这是一个很好的答案。你绝对应该试试。

步骤1首先制作一个高级搜索表单,您希望您的用户与网站进行交互,并将其保存为一个名称(即我将其保存为advanced-searchform.php &mdash;但不要用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中。

第二步,你只需要:根据搜索查询查询数据库,查询帖子类型及其自定义字段。请记住,您的搜索查询现在是提交表单后获得的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的某个地方带来了代码(我忘记了根),但使用上面的代码存在争议。但它实际上是有效的(当然是站不住脚的借口)。

检查another way @G、 M.建议。

步骤3创建新文件并保存advanced-search-result.php (因为我们在functions.php) 很明显,现在你自由了。概念是:

从URL获取数据,使用简单的WP_Query() (如果您的查询很复杂,请使用$wpdb 查询),在查询中传递命令,从数据库中提取数据,并显示结果,示例可以是:

<?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();
?>
  • Your best friend while using WP_Query — Codex 以及Custom Field Parameters

    • Alternative Values - 可以使用执行高级搜索ALL 字段或ANY ,因此您必须确保查询按照搜索和数据获取所有结果。您可以使用$wpdb 用于复杂搜索结果的自定义SQL查询,这将是纯MySQL-WordPress没有任何内容
    • Sanitization & Validation - 文本字段和文本区域非常容易受到攻击,可能会导致您的站点出现不当行为。因此,传递原始数据是不安全的,您需要在传递到db查询之前对其进行清理和验证。(Data Sanitization and Validation with WordPress - TutsPlus)
    • Designing - 您可以选择page.php (或search.php) 模板,并在此基础上创建此页面

SO网友:cybmeta

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

Step 1: Search Form

这一步等于另一个答案中的第1步,只是改变了idname 字段(<input type="text" ...> 用于搜索到"s", 因此,它将直接用于as搜索字段。将此代码保存在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>
Step 2: Add filters to search query

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 );

    }
}
Step 3: Templating (optional)

使用此方法,将使用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;
}

结束

相关推荐

Custom Search Query

我想设置一个自定义搜索页面,该页面执行以下操作:用户以一种他希望在搜索中看到返回的表单(基本上是从标签列表中选择)检查多个项目。返回与他选择的所有标记匹配的结果(使用和不使用或)。具体示例如下:返回标记=“小学”和“公园”的“区域”类别中的所有帖子我需要为我的搜索表单命名特别的内容吗在搜索结果页面上,如何对自定义查询进行编码,使其能够捕获区域类别内的所有帖子,并具有用户在搜索表单中选择的所有标签的标签