我遇到以下情况的问题:我正在创建一个自定义表单来搜索我的自定义帖子类型(immobiliare)并附加到此我有2个自定义分类:location和tipologia。
我的searchform.php是:
<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
<input type="hidden" value="proceed" name="s" id="s" />
<fieldset>
<legend>Ricerca per:</legend>
<label class="screen-reader-text" for="query">Testo:</label>
<input type="text" value="<?php the_search_query(); ?>" name="query" id="query" />
</fieldset>
<fieldset>
<label class="screen-reader-text" for="s">Tipologia:</label>
<?php wp_dropdown_categories(array(
'hide_empty' => 0,
'taxonomy' => 'tipologia',
'name' => 'tipologia',
'show_option_all' => 'Nessuna Preferenza'
)); ?>
</fieldset>
<fieldset>
<label class="screen-reader-text" for="s">Località:</label>
<?php wp_dropdown_categories(array(
'hide_empty' => 0,
'taxonomy' => 'location',
'name' => 'location',
'show_option_all' => 'Nessuna Preferenza'
)); ?>
</fieldset>
<input type="submit" id="searchsubmit" value="Search" />
</form>
如您所见,我有3个字段:1是文本字段,另外2个是我的分类法的下拉列表。我希望用户能够搜索这些字段。我不得不破解“s”输入类型,因为它不会让我提交空查询并添加“查询”字段。 我的functions.php文件如下:
<?php
// Start LOGGING
if(!function_exists('_log')){
function _log( $message ) {
if( WP_DEBUG === true ){
if( is_array( $message ) || is_object( $message ) ){
error_log( print_r( $message, true ) );
} else {
error_log( $message );
}
}
}
}
// end LOGGING
// start SEARCH FORM
function ij_get_int($var){
if (isset($var)) {
$int_var = intval($var);
if ($int_var > 0)
return $int_var;
}
return false;
}
function ij_get_str($var) {
$str_var = esc_attr($var);
if (strlen($str_var) > 0)
return $str_var;
return false;
}
function custom_search_results($query) {
if ($query->is_search && $query->is_main_query()) {
$tax_query = array(
'relation' => 'AND',
);
$location = ij_get_int($_GET['location']);
$tipologia = ij_get_int($_GET['tipologia']);
if ($location) {
array_push($tax_query, array(
'taxonomy' => 'location',
'field' => 'id',
'terms' => $location,
'operator' => 'IN'
));
}
if ($tipologia) {
array_push($tax_query, array(
'taxonomy' => 'tipologia',
'field' => 'id',
'terms' => $tipologia,
'operator' => 'IN'
));
}
$query->set('tax_query', $tax_query);
$query->set('s', ij_get_str($_GET['query']));
$query->set('post_type', 'immobiliare');
}
}
add_action('pre_get_posts', 'custom_search_results');
// end SEARCH FORM
?>
在这里,我将自定义表单的响应挂钩并添加:
我不知道为什么这没有用(花了一天!),我可以看到我的查询返回正确的's'参数:
$query->set('s', ij_get_str($_GET['query']));
但不是分类过滤器。
我做错了什么?我想在search.php文件中使用标准循环,所以在某种程度上我想让我的钩子函数自动插入到循环中。一个奇怪的事情是,如果我使用相同的设置创建一个新的WP_Query对象(而不是使用“set”方法),它将返回我想要的内容!我试过做$ query = new WP_Query ......但是这也不行!!
如果我将查询请求转储到search.php的顶部,我会得到以下内容:
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts WHERE 1=1 AND 0 = 1 AND (((wp_posts.post_title LIKE '%vil%') OR (wp_posts.post_content LIKE '%vil%'))) AND wp_posts.post_type = 'immobiliare' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
有没有人有任何提示可以分享?帮我一臂之力真是太酷了! 谢谢 丹
答案 0 :(得分:0)
你现在可能已经解决了这个问题,但是你的查询有......其中1 = 1和0 = 1 ......所以它不会返回任何内容,因为你要求记录的一组项目都是真的和假的。