使users.php搜索包含特定的用户元数据字段,而不会影响SQL查询本身

时间:2019-05-30 作者:Joaquin Brandan

我想让管理员通过wordpress/wp admin/users中一个名为“indice de busqueda”的元值来搜索用户。php页面

如何以这种方式连接到搜索框中,以便将查询更改为如下所示?

    $query = get_users([
      \'meta_key\' => \'indice de busqueda\',
      \'meta_value\' => $search_value,
      \'meta_compare\'=>\'REGEX\'
    ])
我尝试了许多可能的方法,但似乎找不到一种可以避免与SQL混淆的方法。

2 个回复
最合适的回答,由SO网友:Radley Sustaire 整理而成

看看pre_get_users 钩如果您熟悉pre\\u get\\u posts,它与它非常相似,只是它用于wp\\u user\\u查询而不是wp\\u查询。

您需要确保只检查仪表板中的用户屏幕,因为该挂钩会影响任何用户列表。

下面是代码的示例。Not fully tested 但基于我自己插件中的一些工作代码。

function so339209_filter_users_indice_de_busqueda( $query ) {
    if ( !function_exists(\'get_current_screen\') ) return;

    // Only apply on the Users screen in the dashboard
    $screen = get_current_screen();
    if ( !screen || screen->in !== \'users\' ) return;

    $query->set(\'meta_key\', \'indice de busqueda\');
    $query->set(\'meta_value\', $search_value);
    $query->set(\'meta_compare\', \'REGEX\');
}
add_action( \'pre_get_users\', \'so339209_filter_users_indice_de_busqueda\', 20 );

SO网友:Joaquin Brandan

我发现了问题。

来自的查询pre_get_users 返回为空,因为wordpress正在附加和前置星号* 到我的搜索字符串。如果我搜索11那么$query->query_vars[\'search\'] 等于\'*11*\' 而不是11 这把我所有的搜索都搞砸了,不管是正则表达式还是其他的。

解决方案是从搜索值中删除星号

function so339209_filter_users_indice_de_busqueda($query)
{
    global $pagenow;

    if (is_admin() && \'users.php\' == $pagenow) {


        //Remove trailing and starting empty spaces
        $the_search = trim($query->query_vars[\'search\']);

        //Remove trailing and starting asterisks that wordpress adds to your search
        // string
        $the_search = trim($query->query_vars[\'search\'], \'*\');

        //Build your query from the search string, Im using a LIKE comparison 
        //for simplicity but you could use a REGEX too
        $query->set(\'meta_key\', \'indice de busqueda\');
        $query->set(\'meta_value\', $the_search);
        $query->set(\'meta_compare\', \'LIKE\');

        //Nuke the search string so that the query does not try to match your search
        //with the users username or email.
        $query->set(\'search\', \'\');
    }
}
add_action(\'pre_get_users\', \'so339209_filter_users_indice_de_busqueda\', 20);