如何让WordPress从username字段而非user_login读取登录用户名?
解决WordPress从共享数据库的
username字段读取登录用户名的问题 嘿,你之前用的代码找错钩子啦!manage_users_columns这个过滤器只是用来修改WordPress后台用户列表的列名称——把原来的user_login列显示成“username”而已,它完全不会影响登录时系统读取哪个字段来验证用户名。咱们得用专门处理用户认证的钩子来实现需求。
正确的解决方案
因为你的WordPress和Laravel共享同一个users表,且用户名存在username字段而非WordPress默认的user_login,我们需要重写WordPress的用户认证逻辑,让它通过username字段查找并验证用户:
add_filter('wp_authenticate', 'authenticate_using_username_column', 10, 2); function authenticate_using_username_column($user, $username) { // 如果已经存在合法的用户对象(比如记住登录状态),直接返回 if ($user instanceof WP_User) { return $user; } // 全局调用WordPress数据库对象 global $wpdb; // 根据username字段查询用户ID $user_id = $wpdb->get_var($wpdb->prepare( "SELECT ID FROM {$wpdb->users} WHERE username = %s", $username )); if ($user_id) { // 获取完整的用户对象 $target_user = get_user_by('id', $user_id); // 获取登录表单提交的密码 $submitted_password = $_POST['pwd'] ?? ''; // 验证密码是否匹配 if (wp_check_password($submitted_password, $target_user->user_pass, $user_id)) { return $target_user; // 验证成功,返回用户对象 } else { return new WP_Error('invalid_password', __('输入的密码不正确,请重试。')); } } // 如果没找到匹配的用户,返回默认错误 return new WP_Error('invalid_username', __('未找到匹配的用户名,请检查输入。')); }
补充说明
- 代码作用:这个钩子会在WordPress执行用户认证时触发,优先通过
username字段查找用户,验证密码后返回合法的用户对象,替代默认的user_login字段验证逻辑。 - 安全注意:使用
$wpdb->prepare避免SQL注入风险,这是处理数据库查询时必须遵守的安全规范。 - 后台列表优化:如果需要让后台用户列表也真实显示
username字段内容(而非只是改列名),可以配合以下代码:
// 添加自定义列到用户列表 add_filter('manage_users_columns', 'add_username_column_to_users_list'); function add_username_column_to_users_list($columns) { $columns['username'] = '用户名(来自Laravel字段)'; return $columns; } // 填充自定义列的内容 add_action('manage_users_custom_column', 'populate_username_column_content', 10, 3); function populate_username_column_content($value, $column_name, $user_id) { if ($column_name === 'username') { global $wpdb; return $wpdb->get_var($wpdb->prepare("SELECT username FROM {$wpdb->users} WHERE ID = %d", $user_id)); } return $value; }
内容的提问来源于stack exchange,提问作者Jay Bro
相关产品推荐
相关产品推荐

