wordpress meta_query 数组用于多字段表单搜索的问题

问题描述 投票:0回答:1

我正在尝试使用具有多个字段(文本、数字和选择)的表单在 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(); ?>
php wordpress search meta-query
1个回答
0
投票

我很确定,鉴于您有一个包含 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();
© www.soinside.com 2019 - 2024. All rights reserved.