简介

WordPress 的 users 表旨在仅包含有关用户的基本信息。

自 WP 4.7 起,该表包含:ID、user_login、user_pass、user_nicename、user_email、user_url、user_registered、user_activation_key、user_status 和 display_name。

因此,为了存储额外数据,引入了 usermeta 表,它可以存储有关用户的任意数量的数据。

这两个表通过基于 users 表中 ID 的一对多关系绑定在一起。

操作用户元数据

有两种主要方式可以操作用户元数据。

  1. 用户个人资料屏幕中的表单字段。
  2. 通过函数调用进行编程操作。

通过表单字段

表单字段选项适用于用户将能够访问 WordPress 管理区域的情况,在该区域中用户可以查看和编辑个人资料。

在我们深入示例之前,重要的是要理解过程中涉及的钩子及其存在的原因。

show_user_profile 钩子

此操作钩子在用户编辑自己的用户个人资料时触发。

请记住,没有编辑自己个人资料能力的用户不会触发此钩子。

edit_user_profile 钩子

此操作钩子在用户编辑其他人的用户个人资料时触发。

请记住,没有编辑第三方个人资料能力的用户不会触发此钩子。

示例表单字段

在下方的示例中,我们将向所有个人资料屏幕添加生日字段,并在个人资料更新时将其保存到数据库中。

/**
 * 编辑屏幕上的字段。
 *
 * @param $user WP_User 用户对象
 */
function wporg_usermeta_form_field_birthday( $user ) {
    ?>
    <h3>It's Your Birthday</h3>
    <table class="form-table">
        <tr>
            <th>
                <label for="birthday">Birthday</label>
            </th>
            <td>
                <input type="date"
                       class="regular-text ltr"
                       id="birthday"
                       name="birthday"
                       value="<?= esc_attr( get_user_meta( $user->ID, 'birthday', true ) ) ?>"
                       title="Please use YYYY-MM-DD as the date format."
                       pattern="(19[0-9][0-9]|20[0-9][0-9])-(1[0-2]|0[1-9])-(3[01]|[21][0-9]|0[1-9])"
                       required>
                <p class="description">
                    Please enter your birthday date.
                </p>
            </td>
        </tr>
    </table>
    <?php
}
 
/**
 * 保存操作。
 *
 * @param $user_id int 当前用户的 ID。
 *
 * @return bool 如果键不存在则返回元数据 ID,成功更新时返回 true,失败时返回 false。
 */
function wporg_usermeta_form_field_birthday_update( $user_id ) {
    // 检查当前用户是否有编辑 $user_id 的能力
    if ( ! current_user_can( 'edit_user', $user_id ) ) {
        return false;
    }
 
    // 为 $user_id 创建/更新用户元数据
    return update_user_meta(
        $user_id,
        'birthday',
        $_POST['birthday']
    );
}
 
// 将字段添加到用户自己的个人资料编辑屏幕。
add_action(
    'show_user_profile',
    'wporg_usermeta_form_field_birthday'
);
 
// 将字段添加至用户个人资料编辑屏幕。
add_action(
    'edit_user_profile',
    'wporg_usermeta_form_field_birthday'
);
 
// 将保存操作添加至用户自己的个人资料编辑屏幕更新。
add_action(
    'personal_options_update',
    'wporg_usermeta_form_field_birthday_update'
);
 
// 将保存操作添加至用户个人资料编辑屏幕更新。
add_action(
    'edit_user_profile_update',
    'wporg_usermeta_form_field_birthday_update'
);

编程方式

此选项适用于您正在构建自定义用户区域和/或计划禁用对 WordPress 管理区域访问的情况。

可用于操作用户元数据的函数是:add_user_meta()、update_user_meta()、delete_user_meta() 和 get_user_meta()。

添加

add_user_meta(
    int $user_id,
    string $meta_key,
    mixed $meta_value,
    bool $unique = false
);

请参阅关于 add_user_meta() 的函数参考,以获取有关所用参数的完整说明。

更新

update_user_meta(
    int $user_id,
    string $meta_key,
    mixed $meta_value,
    mixed $prev_value = ''
);

请参阅关于 update_user_meta() 的函数参考,以获取有关所用参数的完整说明。

删除

delete_user_meta(
    int $user_id,
    string $meta_key,
    mixed $meta_value = ''
);

请参阅关于 delete_user_meta() 的函数参考,以获取有关所用参数的完整说明。

获取

get_user_meta(
    int $user_id,
    string $key = '',
    bool $single = false
);

请参阅关于 get_user_meta() 的函数参考,以获取有关所用参数的完整说明。

请注意,如果您仅传递 $user_id,该函数将检索所有元数据作为关联数组。

您可以在插件或主题的任意位置渲染用户元数据。