与wp_USERS一起查询wp_usermeta

时间:2014-10-25 作者:Wold

我想使用WordPress查询功能,而不需要外部插件。以下是我目前掌握的情况:

add_filter(\'user_search_columns\', \'user_search_columns_bd\' , 10, 3);

function user_search_columns_bd($search_columns, $search, $this){
    if(!in_array(\'display_name\', $search_columns)){
        $search_columns[] = \'display_name\';
    }
    return $search_columns;
}

$args = array(
\'search\'         => $s,
\'search_columns\' => array( \'user_login\', \'user_email\'),
\'meta_query\' => array(
    \'relation\' => \'OR\',
    0 => array(
        \'key\'     => \'first_name\',
        \'value\'   => $s,
        \'compare\' => \'LIKE\'
    ),
    1 => array(
        \'key\'     => \'last_name\',
        \'value\'   => $s,
        \'compare\' => \'LIKE\'
    )
)
);

$user_query = new WP_User_Query( $args );
当您输入完整的display\\u名称、完整的user\\u登录名或完整的user\\u电子邮件时,此搜索将正常工作。

如果搜索查询包含usermeta表中的名字或姓氏,我希望能够返回结果,并且我希望所有查询都不区分大小写(这是我遇到的另一个问题)。

我不确定我是否在使用meta_query 正确地作为一个参数,但我试图遵循WordPress Codex条目中的示例WP_User_Query().

感谢您的帮助或指导。

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

这并不是一个简单的答案,所以首先您需要包含一个以上的过滤器,以允许您获取两个meta_query 通过OR 而不是AND, 检查我的代码示例:

add_filter(\'user_search_columns\', \'q166419_user_search_columns\' , 10, 3);

function q166419_user_search_columns($search_columns, $search, $this){
    if(!in_array(\'display_name\', $search_columns)){
        $search_columns[] = \'display_name\';
    }
    return $search_columns;
}

// Here is where the magic happens
add_filter( \'get_meta_sql\', \'q166419_user_meta_filter\', 10, 6 );

function q166419_user_meta_filter( $sql, $queries, $type, $primary_table, $primary_id_column, $context ){
    // If it\'s not user forget it!
    if ( $type !== \'user\' ){
        return $sql;
    }

    // Only if our variable is true then we will do the change
    if ( ! isset( $context->query_vars[\'meta_query\'][\'replace_and\'] ) || $context->query_vars[\'meta_query\'][\'replace_and\'] !== true ){
        return $sql;
    }

    $sql[\'where\'] = preg_replace(\'/AND/\', \'OR\', $sql[\'where\'], 1);
    return $sql;
}

$args = array(
    \'search\' => $s,
    \'search_columns\' => array( \'user_login\', \'user_email\'),
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        \'replace_and\' => true, // Flag for the dark magic
        array(
            \'key\' => \'first_name\',
            \'value\' => $s,
            \'compare\' => \'LIKE\'
        ),
        array(
            \'key\' => \'last_name\',
            \'value\' => $s,
            \'compare\' => \'LIKE\'
        )
    )
);
Bonus: 要解决区分大小写的搜索问题,需要将其应用于SQL表;

ALTER TABLE wp_usermeta CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE wp_users CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
TheciCollate 代表不区分大小写。

结束

相关推荐

从GET_USERS()或GET_USERDATA()函数获取作者页面插件

wp_list_authors() 提供永久链接的作者页面列表(site.com/author/john、site.com/author/jenny等)。我想使用相同的链接get_users() 或get_userdata() 而不是函数。我需要这些函数,因为我以一种非常定制的方式显示作者。然而,我不知道如何用这些函数获得适当的作者页面。(例如,一位作者的用户名是电子邮件地址wp_list_authors()-为她的作者页生成的链接用破折号代替了“@”和“.”。这意味着作者页面slug不一定与用户名相同)