我正在尝试使用具有多个字段(文本、数字和选择)的表单在 WordPress 中进行搜索。结果页面需要显示按此表单过滤的帖子(带有自定义字段)。
问题是:我的结果运行不佳,无法通过添加搜索首选项来显示结果。例如:我需要返回一个包含在搜索中选择的 3 个值(房产代码、房产类型、房间数量)的帖子,但这不会发生,并且返回总是显示所有注册的帖子。
我应该如何继续正确过滤我的搜索,添加表单中所做的选择?
我尝试更改meta_query数组中的参数,例如“关系”,“类型”或“比较”,但不起作用......
我的代码(page-imoveis.php):
<?php
if( $_GET ){
query_posts( array(
'post_type' => 'post',
'order' => 'DESC',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'codigo',
'value' => $_GET['codigo'],
'compare' => '='
),
array(
'key' => 'tipo_venda',
'value' => $_GET['tipo-venda'],
'compare' => 'LIKE'
),
array(
'key' => 'tipo_de_imovel',
'value' => $_GET['tipo-imovel'],
'compare' => 'LIKE'
),
array(
'key' => 'cidade',
'value' => $_GET['cidade'],
'compare' => 'LIKE'
),
array(
'key' => 'bairro',
'value' => $_GET['bairro'],
'compare' => 'LIKE'
),
array(
'key' => 'quartos',
'value' => $_GET['quartos'],
'compare' => '='
),
array(
'key' => 'banheiros',
'value' => $_GET['banheiros'],
'compare' => '='
),
array(
'key' => 'suites',
'value' => $_GET['suites'],
'compare' => '='
),
array(
'key' => 'vagas',
'value' => $_GET['vagas'],
'compare' => '='
)
)
) );
} else{
query_posts( array(
'post_type' => 'post',
'order' => 'DESC',
'posts_per_page' => -1
) );
}
?>
<?php get_template_part('loop', 'imovel'); ?>
<?php wp_reset_query(); ?>
我很确定,鉴于您有一个包含 8 个选项的数组,并且给出了一个只有 3 个选项的示例,您将给 meta_query 空值并使用 LIKE 来比较它们,这当然会找到所有内容。
相反,在将每个期望值添加到您的元查询之前,请检查每个期望值是否存在且不为空。
我们在检查值不为空之前使用
if isset(...)
以避免生成错误,这些错误可能不会显示但仍然存在。
我们通过将查询设置为变量来避免编写相同的代码两次,而不是通过在“if then”和“else”中调用
query_posts()
来复制其某些内容。
// set up the base query
$query = [
'post_type' => 'post',
'order' => 'DESC',
'posts_per_page' => -1,
];
if ( isset($_GET) && !empty($_GET) ) {
// create a list of things you're expecting and how they're being compared
$search = [
'codigo' => '=',
'tipo_venda' => 'LIKE',
'tipo_de_imovel' => 'LIKE',
'cidade' => 'LIKE',
'bairro' => 'LIKE',
'quartos' => '=',
'banheiros' => '=',
'suites' => '=',
'vagas' => '=',
];
$meta_query = []; // by the way [] is the same as array()
// now see if they've actually been submitted
foreach ($search as $key => $compare) {
// Check if the node exists and that it's not empty
if ( isset($_GET[$key]) && !empty($_GET[$key]) ) {
// Add to meta query
$meta_query[] = [
'key' => $key,
'value' => $_GET[$key],
'compare' => $compare,
];
}
}
// If there's anything in meta_query add it to your query
if ( !empty($meta_query) )
$query['meta_query'] = $meta_query
}
}
// Now run the query. It either has meta_query or it doesn't.
query_posts($query);
get_template_part('loop', 'imovel');
wp_reset_query();