如何在自定义搜索中正确使用AND/OR

时间:2020-06-16 作者:user10980228

我有一个文本字段和一个带有国家名称的下拉列表。如果我使用或,只在文本字段中填写一个人的名字,则会返回错误的结果。如果我键入名称并选择国家,我会得到正确的结果。如果我输入了一个名称,并故意选择了他们不在的错误国家,我会得到所选国家的结果。所以,这里有些地方工作不正常。

如果我使用AND和只键入人名,而不输入国家/地区,我将不会得到任何结果,至少我希望看到一些基于姓名搜索的结果。这两个字段都不是必需的,您应该只能按1或同时按2进行搜索。

如果仅按位置搜索,则应显示该国家/地区的所有用户;如果仅输入名称,则应显示任何国家/地区中具有该名称的所有用户;如果同时使用两个字段进行搜索,则应仅显示指定国家/地区中具有该名称的用户。

$s_query = $_GET[\'s\'];
$country = $_GET[\'location\'];

$args = array(
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'first_name\',
            \'value\' => $s_query,
            \'compare\' => \'LIKE\'
        ) ,
        array(
            \'key\' => \'last_name\',
            \'value\' => $s_query,
            \'compare\' => \'LIKE\'
        ),
        array(
            \'key\' => \'location\',
            \'value\' => $country,
            \'compare\' => \'LIKE\'
        )
    )
);



$wp_user_query = new WP_User_Query($args);


$authors = $wp_user_query->get_results();


if (!empty($authors)) {
    echo \'<ul>\';

    foreach ($authors as $author) {

        $author_info = get_userdata($author->ID);
        echo \'<li>\' . $author_info->first_name . \' \' . $author_info->last_name . \' - \' . $author->location . \'</li>\';
    }
    echo \'</ul>\';
} else {
    echo \'No authors found\';
}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

请注意s 查询参数/字符串是为帖子保留的,因此您应该为自定义用户搜索使用不同的名称。

所以基本上,你只需要;“播放”;使用元查询嵌套

是的,就像普通(PHP)数组可以是多维/多级格式一样meta_query parameter, 是为了WP_Query 或者WP_User_Query 在你的情况下。所以你可以在一个元查询子句中有一个元查询子句在一个元查询子句中。。。好吧,你明白了。:-)

在这个修订版本中,我们需要name参数($s_query) 始终处于<first name> <last name> 格式类似John Doe 或者也许Jane Doe Jr., 因此,例如,如果只指定了名字,那么我们只搜索该meta,如果指定了国家值,则搜索位置meta:

// Parse the first and last names into an array.
$names = preg_split( \'/ +/\', trim( $s_query ), 2 );

// Then, define the meta query variable.
$meta_query = [];

// If a name if specified, add the first and last name queries to the $meta_query.
// So we\'re using a nested meta query clause to search in either the first and last
// name meta.
if ( $s_query ) {
    $name_query = [];

    if ( ! empty( $names[0] ) ) {
        $name_query[] = [ // child clause
            \'key\'     => \'first_name\',
            \'value\'   => $names[0],
            \'compare\' => \'LIKE\',
        ];
    }

    if ( ! empty( $names[1] ) ) {
        $name_query[] = [ // child clause
            \'key\'     => \'last_name\',
            \'value\'   => $names[1],
            \'compare\' => \'LIKE\',
        ];
    }

    // Add a top-level clause for $s_query
    if ( ! empty( $name_query ) ) {
        $name_query[\'relation\'] = \'AND\';
        $meta_query[] = $name_query;
    }
}

// If a country is specified, add the country query to the $meta_query.
if ( $country ) {
    $meta_query[] = [ // top-level clause
        \'key\'     => \'location\',
        \'value\'   => $country,
        \'compare\' => \'LIKE\',
    ];
}

// Now set the relationship for the top-level meta query clauses.
$meta_query[\'relation\'] = ( $s_query && $country ) ? \'AND\' : \'OR\';

// Then add the meta query to the main query args (for WP_User_Query).
$args = [
    \'meta_query\' => $meta_query,
];

相关推荐

Wp-query and column blocks

也许这要求太高了,但新的块提供了一种简单的方法来添加响应良好的列。ie您只需将图像拇指放入列块中,它们就可以在移动和桌面上完美工作。有没有办法让WP查询输出the_post_thumbnail 如我在3列行中的参数(12篇x类已发布帖子)所述?