我为汽车经销商建立了一个主题。每辆汽车都是自定义帖子类型(“车辆”),并具有约12个自定义字段,其中包括品牌,型号,里程,燃料类型等。
因此,基本上在主页上,我需要一个搜索表单,该表单具有用于Make&Model的下拉列表,并包含任何可用的Make或Models。
我还希望它具有Year的2个选项,因此最终用户可以选择“ 2006”和“ 2012”,并且搜索结果包含年份在这两个数字之间的所有车辆。
有没有可以做到这一点的插件?
谢谢你的帮助..这已经使我疯狂了好几个小时!!!
我为汽车经销商建立了一个主题。每辆汽车都是自定义帖子类型(“车辆”),并具有约12个自定义字段,其中包括品牌,型号,里程,燃料类型等。
因此,基本上在主页上,我需要一个搜索表单,该表单具有用于Make&Model的下拉列表,并包含任何可用的Make或Models。
我还希望它具有Year的2个选项,因此最终用户可以选择“ 2006”和“ 2012”,并且搜索结果包含年份在这两个数字之间的所有车辆。
有没有可以做到这一点的插件?
谢谢你的帮助..这已经使我疯狂了好几个小时!!!
Answers:
______更新________
尽管我获得了越来越多的选票,并且该解决方案可行,但是cybmeta的答案实际上是一种很好的答案,并且是WordPress的方式。您绝对应该尝试一下。
首先制作一个您希望用户与网站进行交互的高级搜索表单,并用一个名称保存它(即,我将其另存为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。
你刚才需要的是:查询数据库和查询岗位类型和它的自定义字段按搜索查询。请记住,您的搜索查询现在是您提交表单后获得的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
查询),样本可以是:
<?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();
?>
所以,这是您的最后一件事。但是仍然存在许多挑战:
$wpdb
对复杂的搜索结果使用自定义SQL查询,而该查询将是纯MySQL-WordPress完全没有。page.php
(或search.php
)模板,并以此为基础制作此页面。因此,您有了主意,现在该轮到探索和发现方式了。记住,每个人的方式都不一样。做你的,以便我可以跟随你。:)
WP_Query()
使用自定义字段参数并循环显示结果<option>
。
pre_get_posts
挂钩而不是辅助循环来完成此“高级搜索” 。
尽管@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;
}