WP_USER_QUERY忽略‘META_QUERY’参数

时间:2021-12-11 作者:Marcelo Henriques Cortez

因此,我试图基于使用AJAX的表单的一些输入,对“成员”进行查询。

问题是,在搜索“角色”时,我得到了预期的结果。但是,一旦我尝试寻找其他元值,返回就会将DB中的所有成员都带来。

我尝试了很多方法,但我要么得到了我刚才说的结果,要么根本没有结果(即使是扮演这个角色)

这是我的PHP代码,在\'functions.php\':

function my_ajax_filter_search_callback() {
    header("Content-Type: application/json");

    if(isset($_GET[\'name\']) && !empty($_GET[\'name\'])) {
        $name = sanitize_text_field( $_GET[\'name\'] );
        $searchName = array(
            \'search\' => $name,
            \'search_columns\' => array( \'first_name\' ),
            \'compare\' => \'LIKE\'
        );
        $searchName[] = array(
            \'search\' => $name,
            \'search_columns\' => array( \'last_name\' ),
            \'compare\' => \'LIKE\'
        );
    }

    if(isset($_GET[\'keywords\']) && !empty($_GET[\'keywords\'])) {
        $keywords = sanitize_text_field( $_GET[\'keywords\'] );
        $searchKeywords = array(
            \'key\' => \'keywords\',
            \'value\' => $keywords,
            \'compare\' => \'LIKE\'
        );
    }

    if(isset($_GET[\'countries\']) && !empty($_GET[\'countries\'])) {
        $country = sanitize_text_field( $_GET[\'countries\'] );
        $searchCountry = array(
            \'key\' => \'country\',
            \'value\' => $country,
            \'compare\' => \'=\'
        );
    }

    if(isset($_GET[\'disciplines\']) && !empty($_GET[\'disciplines\'])) {
        $discipline = sanitize_text_field( $_GET[\'disciplines\'] );
        $searchDiscipline = array(
            \'key\' => \'disciplines\',
            \'value\' => $discipline,
            \'compare\' => \'=\'
        );
    }

    if(isset($_GET[\'roles\']) && !empty($_GET[\'roles\'])) {
        $role = sanitize_text_field($_GET[\'roles\']);
    }

    $args = array(
        \'role\' => $role,
        \'meta_query\' => array(
            \'relation\' => \'AND\',
            array(
                \'relation\' => \'OR\',
                $searchName
            ),
            $searchKeywords,
            $searchCountry,
            $searchDiscipline
        )
    );


    $user_query = new WP_User_Query( $args );

    if ( !empty( $user_query->get_results() ) ) {
        $results = array();
        $count = 0;
        foreach ( $user_query->get_results() as $member ) {
            $member_info = get_userdata( $member->ID );
            $results[] = array(
                \'id\' => $member->ID,
                \'name\' => $member_info->first_name .\' \'.$member_info->last_name,
                \'role\' => $member_info->roles,
                \'keywords\' => $member_info->keywords,
                \'country\' => $member_info->country,
                \'disciplines\' => $member_info->disciplines,
            );

            $count++;
        }

        echo json_encode($results);

    }

    wp_die();
}
我甚至试着在同一个地方创建所有参数的结构,以确保没有额外的“数组”或其他什么,相同的结果。

以下是我在寻找name:enter image description here

下面是我在寻找role:enter image description here

我尝试搜索的字段是随插件添加的Paid Memberships Pro 该信息位于\'wp_usermeta\' 桌子以下是其中一个字段“规程”的打印:enter image description here

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

但是,一旦我尝试寻找其他元值,返回就会将DB中的所有成员都带来。

是否确定除名称之外的元不起作用,即返回了所有成员/用户?

因为正如我所见keywords, countrydisciplines 梅塔,只要你compare 值是好的,则元查询将工作,并且只有具有指定元数据的成员才会返回。

例如,您的compare 对于keywords meta是LIKE, 所以如果你搜索foo 还有一些成员foo (不考虑字母大小写)在keywords meta,则只有这些成员才会出现在用户查询的结果中。

因此,请确保compare 价值是好的,尤其是对于disciplines meta,我认为它包含多个用逗号分隔的值(例如。discipline 1, discipline 2) 然而,你的compare= 这意味着一个精确的匹配搜索,通常用于具有单个值的元值。

现在,关于名字/姓氏搜索,我注意到以下问题:

缺少元查询子句key (元键/名称)和value (元值),WordPress忽略了元查询,因为没有指定元键。而且searchsearch_columns 不是元查询中子句的有效键。

array( \'relation\' => \'OR\', $searchName ) 生产array( \'relation\' => \'OR\', array( \'search\' => ..., ..., ..., array( ... ) ) ) 而不是array( \'relation\' => \'OR\', array( ... ), array( ... ) ), 因此,即使指定了正确的元键,元查询也无法正常工作。

您应该使用$searchName[] = array( 添加first_name 数组,就像您对last_name 大堆

因此,请尝试定义$searchName 像这样:

$searchName = array(
    \'relation\' => \'OR\',
);

$searchName[] = array(
    \'key\'     => \'first_name\', // meta key
    \'value\'   => $name,        // meta value
    \'compare\' => \'LIKE\'
);

$searchName[] = array(
    \'key\'     => \'last_name\', // meta key
    \'value\'   => $name,       // meta value
    \'compare\' => \'LIKE\'
);
然后进来$args, 添加meta_query 像这样:

\'meta_query\' => array(
    \'relation\' => \'AND\',
    $searchName,
    $searchKeywords,
    $searchCountry,
    $searchDiscipline
)