WordPress WP_User class用于处理用户信息,是WordPress的核心类。在WordPress插件或主题中获取用户信息时应该使用WP_User class提供的方法,不要直接访问object内容。本文列举了常用的WP_User方法和代码示例。
目录
WordPress WP_User使用方法、代码示例和返回结果
测试环境:WordPress 6.1
创建WP_User的实例
语法:
$users = new WP_User( $id [, $name [, $blog_id ] ] );
例如:
// 创建一个WP_User的实例,用户ID为22
$user = new WP_User( 22 );
// 创建一个WP_User的实例,用户登录名为TEST-Username
$user = new WP_User( '', 'TEST-Username' );
返回结果:
WP_User Object
(
[data] => stdClass Object
(
[ID] => 22
[user_login] => TEST-Username
[user_pass] => $P$BxHrZf4YeOB5wrt2zrUleYaIpoqd7x0
[user_nicename] => test-username
[user_email] => test@emaildomain.com
[user_url] => http://www.youdomain.com
[user_registered] => 2017-12-06 05:59:56
[user_activation_key] =>
[user_status] => 0
[display_name] => 张 三
)
[ID] => 22
[caps] => Array
(
[administrator] => 1
)
[cap_key] => wp_capabilities
[roles] => Array
(
[0] => administrator
)
[allcaps] => Array
(
[switch_themes] => 1
[edit_themes] => 1
[activate_plugins] => 1
[edit_plugins] => 1
[edit_users] => 1
[edit_files] => 1
[manage_options] => 1
[moderate_comments] => 1
[manage_categories] => 1
[manage_links] => 1
[upload_files] => 1
[import] => 1
[unfiltered_html] => 1
[edit_posts] => 1
[edit_others_posts] => 1
[edit_published_posts] => 1
[publish_posts] => 1
[edit_pages] => 1
[read] => 1
[level_10] => 1
[level_9] => 1
[level_8] => 1
[level_7] => 1
[level_6] => 1
[level_5] => 1
[level_4] => 1
[level_3] => 1
[level_2] => 1
[level_1] => 1
[level_0] => 1
[edit_others_pages] => 1
[edit_published_pages] => 1
[publish_pages] => 1
[delete_pages] => 1
[delete_others_pages] => 1
[delete_published_pages] => 1
[delete_posts] => 1
[delete_others_posts] => 1
[delete_published_posts] => 1
[delete_private_posts] => 1
[edit_private_posts] => 1
[read_private_posts] => 1
[delete_private_pages] => 1
[edit_private_pages] => 1
[read_private_pages] => 1
[delete_users] => 1
[create_users] => 1
[unfiltered_upload] => 1
[edit_dashboard] => 1
[update_plugins] => 1
[delete_plugins] => 1
[install_plugins] => 1
[update_themes] => 1
[install_themes] => 1
[update_core] => 1
[list_users] => 1
[remove_users] => 1
[promote_users] => 1
[edit_theme_options] => 1
[delete_themes] => 1
[export] => 1
[administrator] => 1
)
[filter] =>
[site_id:WP_User:private] => 1
)
WP_User::get_data_by( string $field, string|int $value )
获取用户的主要信息,不包含权限、角色等。该方法为静态方法,通过class名称直接调用。
$field可以是:id,ID,slug,email和login。
例如:
$userdata = WP_User::get_data_by( 'email', 'test@emaildomain.com');
返回:
stdClass Object
(
[ID] => 22
[user_login] => TEST-Username
[user_pass] => $P$BxHrZf4YeOB5wrt2zrUleYaIpoqd7x0
[user_nicename] => test-username
[user_email] => test@emaildomain.com
[user_url] => http://www.youdomain.com
[user_registered] => 2017-12-06 05:59:56
[user_activation_key] =>
[user_status] => 0
[display_name] => 张 三
)
WP_User::exists()
根据用户ID是否被赋值判断用户是否存在。
例如:
$user = new WP_User( 22 );
if( $user->exists() ){
echo "ID为22的用户存在";
} else {
echo "该用户不存在";
}
WP_User::get( string $key )
从users和usermeta表中查询用户数据
例如:
$user = new WP_User( 22 );
$user_email = $user->get( 'user_email' );
有效的参数包括但不限于:
- ID – 用户id
- user_login – 用户登录名称
- user_pass – 用户密码
- user_nicename – 可在url中安全使用的user_login,例如出现在文章作者链接中
- user_email – 用户电子邮箱
- user_url – 用户的站点链接
- user_registered – 用户注册时间
- display_name – 公开显示的名字
- description – 用户介绍
wp_usermeta表中所有的meta_key都可以作为该方法的参数。
WP_User::has_prop( string $key )
查询某个用户字段是否存在
例如:
if ( $user->has_prop( 'my_user_key') ){
echo 'my_user_key 存在';
} else {
echo '不存在';
}
WP_User::to_array()
返回一个数组形式的结果
例如:
$user = new WP_User( 22 );
$user_array = $user->to_array();
打印$user_array得到:
Array
(
[ID] => 22
[user_login] => TEST-Username
[user_pass] => $P$BxHrZf4YeOB5wrt2zrUleYaIpoqd7x0
[user_nicename] => test-username
[user_email] => test@emaildomain.com
[user_url] => http://www.youdomain.com
[user_registered] => 2017-12-06 05:59:56
[user_activation_key] =>
[user_status] => 0
[display_name] => 张 三
)
WP_User::get_role_caps()
获取用户的所有权限
例如:
$user = new WP_User( 22 );
$allcaps = $user->get_role_caps();
得到一个包含用户所有权限的数组
Array
(
[switch_themes] => 1
[edit_themes] => 1
[activate_plugins] => 1
...
...
[level_10] => 1
[level_9] => 1
...
...
[delete_themes] => 1
[export] => 1
[administrator] => 1
)
WP_User::add_role( string $role )
WP_User::set_role( string $role )
WP_User::remove_role( string $role )
给用户增加、设置唯一角色或删除角色,set_role和add_role的区别是,set_role会执行覆盖操作,把其余角色删除,只保留set的那一个角色。
例如:
// 创建一个自定义角色custom_role,注意这句话只需执行一次,比如在插件启用的时候。可以使用插件代替,例如User Role Editor
add_role( 'custom_role',
'Custom Subscriber',
array( 'read' => true, 'level_0' => true )
);
// 更改用户角色
$user->add_role( 'custom_role' );
$user->set_role( 'custom_role' );
$user->remove_role( 'custom_role' );
WP_User::add_cap( string $cap, bool $grant = true )
WP_User::remove_cap( string $cap )
WP_User::remove_all_caps()
增加一个、删除一个或删除所有用户权限。add_cap()的第二个参数为false,表示给用户增加一个权限,但用户无权使用该权限。
例如:
$user = new WP_User( 22 );
$user->add_cap( 'can_edit_posts' );
$user->remove_cap( 'can_edit_posts' );
$user->remove_all_caps( 'can_edit_posts' );
WP_User::has_cap( string $cap )
判断用户是否有某项权限
例如:
$user = new WP_User( 22 );
$user->add_cap( 'can_edit_posts', false );
if ( $user->has_cap( 'can_edit_posts') ){
echo "用户有can_edit_posts权限";
} else {
echo "没有can_edit_posts权限";
}
在增加权限时,add_cap()第二个参数设为false,所以程序运行结果是 “没有can_edit_posts权限”。
WP_User::get_site_id()
查询当前用户权限属于哪个站点,返回这个站点的ID。multisite下用户在每个子站可能有不同的权限。
如何获取多个用户
class WP_User
用于操作一个用户,要获取多个用户就要借助 class WP_User_Query
,或者在它基础上工作的get_users()
。
$args = array(
'blog_id' => $GLOBALS['blog_id'],
'role' => '',
'role__in' => array(),
'role__not_in' => array(),
'meta_key' => '',
'meta_value' => '',
'meta_compare' => '',
'meta_query' => array(),
'date_query' => array(),
'include' => array(),
'exclude' => array(),
'orderby' => 'login',
'order' => 'ASC',
'offset' => '',
'search' => '',
'number' => '',
'count_total' => false,
'fields' => 'all',
'who' => '',
);
get_users( $args );
具体请参考文档:
https://codex.wordpress.org/Function_Reference/get_users
https://codex.wordpress.org/Class_Reference/WP_User_Query
操作用户的常用函数
获取当前用户或指定用户的信息
获取当前用户信息不需要指定ID,要获取某个用户的信息,需要指定ID或者其他字段,方法如下:
$user = wp_get_current_user(); //获取当前登录用户信息
$user_by_id = get_userdata(1); //获取指定用户ID的用户信息
$user_by_field = get_user_by('email', 'useremail@email.com'); //根据email获取用户信息
这三个函数的返回值都是WP_User的实例,这样就能用WP_User的方法来操作了,例如:
$user = wp_get_current_user(); //获取当前登录用户信息
if( is_a($user,'WP_User') ){
// 获取用户基本信息
$user_id = $user->get('ID'); //用户ID
$user_email = $user->get('user_email'); //用户注册使用的电子邮箱
$user_login = $user->get('user_login'); //用户的登录名
$user_pass = $user->get('user_pass'); //用户的登录密码(加密后的)
$user_nicename = $user->get('user_nicename'); //用户的nicename
$user_displayname = $user->get('display_name'); //用户的显示名称
$user_url = $user->get('user_url'); //用户的网站地址
$user_registered = $user->get('user_registered'); //用户的注册时间
$user_description = $user->get('description'); //用户的个人描述
// 获取用户角色
if( in_array( 'administrator', $user->roles ) ){
echo '该用户是管理员';
}
}
获取当前登录用户的ID
$current_user_id = get_current_user_id();
快速获取用户字段或usermeta信息
如果不需要获取所有的用户信息,而仅仅获取某个字段的信息,可以使用操作metadata的快捷函数。注意update操作只能更改usermeta信息,wp_users表里的字段不能用update_user_option
更新。
$user_id = 1;
// 获取wp_users表里的字段,或者wp_usermeta表里的字段
// 不指定第二个参数(用户ID),则默认获取当前登录用户的字段
$user_email = get_user_option('user_email');
$user_meta = get_user_option('user_meta_key', $user_id);
// 更新字段
update_user_option( $user_id,'user_meta_key','meta信息123');
$updated_value = get_user_option('user_meta_key',$user_id);
// 删除字段
delete_user_option( $user_id, 'user_meta_key' );
用户列表——下拉菜单
使用wp_dropdown_users($args)
函数可以显示一个用户下拉菜单,默认显示所有用户。例如,显示一个只有contributor用户的列表。
$contributors = get_users(array(
'role' => 'Contributor',
'fields' => 'ID'
));
if( is_array($contributors) && sizeof($contributors) ){
wp_dropdown_users(array(
'show_option_all' => '选择用户',
'include' => implode(',', $contributors)
));
}
判断用户是否存在
有两个函数可以判断用户是否存在。
$exists_by_username = username_exists('username'); //存在则返回用户ID,不存在返回false
$exists_by_email = email_exists('useremail@email.com'); //存在则返回用户ID,不存在返回false
用代码创建新用户
快速创建一个用户,只提供用户名、密码和邮箱,应该使用wp_create_user()
。
$new_user_id = wp_create_user( 'username', 'password', 'useremail@emaio.com');
如果想写入更详细的信息,需要使用wp_insert_user()
,该函数是wp_create_user()
的基础。
$userdata = array(
'user_login' => 'username3',
'user_pass' => wp_generate_password( 12, true,true),
'user_nicename' => 'nicename',
'user_email' => 'email3@email.com',
'user_url' => 'https://url.com',
'role' => 'editor'
);
$new_user_id = wp_insert_user($userdata);
if( ! is_wp_error($new_user_id) ){
echo '用户创建成功,用户ID为:', $new_user_id;
} else {
echo $new_user_id->get_error_message();
}
将当前用户登出
使用wp_logout()
函数。