Vì sao lại xảy ra lỗi này?
Google Site Kit sử dụng cơ chế đăng nhập OAuth của Google, và trong quá trình xác thực, nó cung cấp địa chỉ email làm định danh duy nhất. WordPress sau đó xử lý chuỗi này bằng hàm sanitize_user(), tự động loại bỏ các ký tự không hợp lệ như @ và .. Kết quả là, [email protected] trở thành johnsmithgmailcom.
Hậu quả là:
- Username trông như một email bị hỏng, ảnh hưởng đến giao diện và tính chuyên nghiệp.
- Nếu có hai người dùng với local-part trùng nhau (ví dụ:
[email protected]và[email protected]), dễ gây trùng lặp và khó quản lý.
Giải pháp kỹ thuật
WordPress có sẵn hook pre_user_login cho phép can thiệp ngay trước khi tài khoản được tạo. Bằng cách gắn filter này, ta có thể bắt username, cắt bỏ phần domain, chuẩn hóa lại, và đảm bảo nó là duy nhất trước khi ghi vào cơ sở dữ liệu.
Đoạn mã hoàn chỉnh
<?php
// Cắt bỏ domain email, chỉ giữ lại local-part làm username khi đăng ký
add_filter('pre_user_login', function ($user_login) {
// Nếu username trông như email thì cắt phần sau dấu @
if (strpos($user_login, '@') !== false) {
$user_login = substr($user_login, 0, strpos($user_login, '@'));
}
// Chuẩn hóa username (chuyển về lowercase, bỏ ký tự lạ)
$user_login = sanitize_user($user_login, true);
// Nếu rỗng thì đặt mặc định là "user"
if ($user_login === '') {
$user_login = 'user';
}
// Nếu chưa tồn tại, trả về ngay (không thêm hậu tố)
if (!username_exists($user_login)) {
return $user_login;
}
// Nếu trùng, thêm hậu tố -1, -2,...
$base = $user_login;
$i = 1;
$candidate = "{$base}-{$i}";
while (username_exists($candidate)) {
$i++;
$candidate = "{$base}-{$i}";
}
return $candidate;
}, 10, 1);
Cách triển khai
- Tạo MU-Plugin (khuyến nghị):
Tạo filefix-google-sitekit-username.phptrong thư mụcwp-content/mu-pluginsvà dán đoạn mã trên vào. MU-plugin tự động kích hoạt và không bị ghi đè khi cập nhật theme hoặc plugin. - Sử dụng plugin Code Snippets:
Tạo một snippet mới, đặt tên “Cắt domain email khỏi username”, chọn “Run everywhere”, rồi dán đoạn code vào. - Chèn vào functions.php:
Dán đoạn mã vàofunctions.phpcủa theme đang hoạt động. Cách này đơn giản nhưng có thể bị ghi đè khi cập nhật theme.
Kiểm tra kết quả
- Đăng ký bằng
[email protected]→ username sẽ làexample. - Đăng ký bằng
[email protected]→ username sẽ làexample-1. - Thử với email có ký tự đặc biệt (ví dụ:
[email protected]) để đảm bảosanitize_user()hoạt động đúng.
Tương thích với các plugin SSO
Giải pháp này hoạt động ở tầng core của WordPress nên tương thích với hầu hết các plugin đăng nhập qua Google, OAuth hoặc Nextend Social Login. Nếu plugin nào đó ghi đè username sau hook pre_user_login, bạn có thể thay đổi độ ưu tiên của filter hoặc tìm hook riêng của plugin đó (như sitekit_user_register).
Bảo mật và thực hành tốt
- Không nên hiển thị email làm username — giúp bảo mật thông tin người dùng.
- Không tác động tới trường email, chỉ sửa username (
user_login). - Luôn thử nghiệm trên staging trước khi áp dụng cho website thật.
Kết luận
Với một đoạn filter pre_user_login nhỏ gọn, bạn có thể xử lý triệt để vấn đề username bị biến dạng khi dùng Google Site Kit. Cách này giúp username trở nên gọn gàng, an toàn, dễ đọc và không còn lộ thông tin email người dùng — một giải pháp tối ưu và an toàn cho mọi website WordPress.
Bình luận