虽然@mayenelislam的答案可能有效,但我认为进行高级搜索的正确方法是使用pre_get_posts
行动挂钩。
Step 1: Search Form
这一步等于另一个答案中的第1步,只是改变了
id
的
name
字段(
<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;
}