Phần 1. Ẩn tài khoản admin khỏi danh sách người dùng trong Admin
Mục tiêu của bài viết
Chỉ cho phép tồn tại duy nhất một tài khoản admin đặc biệt (ví dụ:
admin123admin
)Tự động xóa bất kỳ tài khoản admin nào khác nếu xuất hiện
Ngăn không cho phép tạo thêm tài khoản admin mới, kể cả qua form tạo user
Ẩn tài khoản đặc biệt khỏi danh sách người dùng trong admin
Cảnh báo:
Khi đã dùng phần 1 thì KHÔNG ĐƯỢC dùng phần 2.
Muốn chuyển sang phần 2, phải xóa toàn bộ code của phần 1 trước khi triển khai phần 2 để tránh xung đột và mất dữ liệu user.
1.1 Chuẩn bị và lưu ý trước khi thực hiện
Đảm bảo bạn backup website trước khi thay đổi code
Kiểm tra user cần giữ lại có username chính xác và có vai trò
administrator
Truy cập file
functions.php
của theme (hoặc child theme đang dùng)
1.2. Mã nguồn đầy đủ
Sao chép đoạn code dưới đây và dán vào cuối file functions.php
trong thư mục theme của bạn:
1. Ẩn tài khoản khỏi danh sách người dùng
1 2 3 4 5 6 | add_action('pre_user_query','completely_hide_specific_user'); function completely_hide_specific_user($user_search) { $hidden_user = 'admin123admin'; global $wpdb; $user_search->query_where .= " AND {$wpdb->users}.user_login != '{$hidden_user}'"; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | add_filter('user_has_cap', 'disable_admin_creation_globally', 10, 3); function disable_admin_creation_globally($allcaps, $caps, $args) { if (!empty($args[0]) && $args[0] === 'create_users') { if (isset($_POST['role']) && $_POST['role'] === 'administrator') { $allcaps['create_users'] = false; } } if (!empty($args[0]) && $args[0] === 'promote_user') { if (isset($_POST['new_role']) && $_POST['new_role'] === 'administrator') { $allcaps['promote_users'] = false; } } return $allcaps; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 3. Tự động xóa các tài khoản admin khác trừ admin123admin add_action('init', 'remove_other_admin_users'); function remove_other_admin_users() { if (!is_admin()) return; $keep_user = 'admin123admin'; $users = get_users([ 'role' => 'administrator', 'exclude' => [username_to_userid($keep_user)], ]); foreach ($users as $user) { if ($user->user_login !== $keep_user) { require_once ABSPATH.'wp-admin/includes/user.php'; wp_delete_user($user->ID); } } } // Hàm phụ trợ để lấy ID từ username function username_to_userid($username) { $user = get_user_by('login', $username); return $user ? $user->ID : 0; } |
1.3. Giải thích chi tiết từng phần
1.3.1 Ẩn tài khoản admin khỏi danh sách người dùng
Hook pre_user_query
can thiệp vào truy vấn danh sách user và loại bỏ tài khoản có username là admin123admin
. Việc này giúp tài khoản đó không hiển thị trong bảng quản trị user, tránh bị lộ.
1.3.2 Chặn tạo tài khoản admin mới
Filter user_has_cap
sẽ kiểm tra nếu người dùng đang cố tạo user mới với role administrator
thì sẽ bị chặn lại. Đồng thời cũng chặn cả việc thay đổi role của user hiện tại thành administrator
.
1.3.3 Tự động xóa mọi tài khoản admin khác
Hook init
kiểm tra danh sách user có role administrator
. Nếu phát hiện có user không trùng với admin123admin
thì sẽ tự động xóa user đó ra khỏi hệ thống.
1.4. Lưu ý bảo mật
Đảm bảo chỉ có một tài khoản admin cần giữ lại, không bị nhập sai username
Luôn cập nhật WordPress và plugin để tránh bị tấn công từ các lỗ hổng cũ
Hạn chế cài plugin từ nguồn không rõ ràng
1. 5. Kết luận phần 1
Giải pháp này phù hợp cho các website WordPress yêu cầu mức bảo mật cao, chỉ cho phép duy trì một tài khoản quản trị viên duy nhất. Khi kết hợp với bảo mật hosting, plugin firewall, và cập nhật định kỳ, bạn sẽ giảm thiểu đáng kể nguy cơ bị xâm nhập qua đường tạo user admin trái phép.
Phần 2: Cấp quyền truy cập cho nhiều admin phụ có kiểm soát (nâng cao)
Mục tiêu
Cho phép tạo thêm admin khác, nhưng không được đăng nhập admin ngay
Khi một admin phụ đăng nhập, hệ thống gửi email về cho admin chính để phê duyệt
Sau khi được duyệt, admin phụ có thể vào admin panel trong 60 phút
Sau 60 phút, quyền hết hạn và cần yêu cầu lại
Điều kiện triển khai
Bạn phải gỡ toàn bộ các đoạn code sau nếu đã dùng ở phần 1:
1 2 3 4 5 6 7 8 9 10 11 | // Ẩn tài khoản chính khỏi danh sách user add_action('pre_user_query','completely_hide_specific_user'); ... // Không cho tạo tài khoản admin mới add_filter('user_has_cap', 'disable_admin_creation_globally', 10, 3); ... // Xóa toàn bộ admin khác add_action('init', 'remove_other_admin_users'); ... |
Lý do: Những đoạn code trên sẽ:
Tự động xóa tài khoản admin phụ ngay cả trước khi có thể xin phê duyệt
Ngăn tạo thêm user admin, khiến phần 2 không thể hoạt động đúng chức năng
2.1 Cho phép tạo admin phụ, nhưng kiểm soát quyền truy cập bằng xác nhận từ admin chính
Dưới đây là toàn bộ code hoàn chỉnh cho phần 2, giúp bạn triển khai tính năng quản lý quyền truy cập admin với xác nhận từ admin chính và thời gian truy cập giới hạn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | // Cấu hình define('MAIN_ADMIN_USERNAME', 'admin123admin'); define('ADMIN_SESSION_DURATION', 60); // phút // Kiểm tra trạng thái phê duyệt function is_admin_access_approved($user_id) { $approved_until = get_user_meta($user_id, '_admin_access_approved_until', true); return $approved_until && strtotime($approved_until) > time(); } // Cấp quyền truy cập tạm thời function approve_admin_access($user_id, $minutes = ADMIN_SESSION_DURATION) { $time = time() + ($minutes * 60); update_user_meta($user_id, '_admin_access_approved_until', date('Y-m-d H:i:s', $time)); } // Gửi yêu cầu phê duyệt function notify_main_admin_for_approval($user) { if (get_user_meta($user->ID, '_admin_access_requested', true)) return; $admin_email = get_option('admin_email'); $approval_link = add_query_arg([ 'approve_admin_access' => $user->ID, 'admin_key' => md5(AUTH_KEY) ], home_url()); $subject = 'Yêu cầu truy cập admin từ: ' . $user->user_login; $message = "Tài khoản {$user->user_login} yêu cầu quyền truy cập admin.\n"; $message .= "Click để duyệt truy cập trong " . ADMIN_SESSION_DURATION . " phút:\n\n"; $message .= $approval_link; wp_mail($admin_email, $subject, $message); update_user_meta($user->ID, '_admin_access_requested', true); } // Xử lý đường link duyệt add_action('init', 'handle_admin_access_approval'); function handle_admin_access_approval() { if (!isset($_GET['approve_admin_access']) || !isset($_GET['admin_key'])) return; if ($_GET['admin_key'] !== md5(AUTH_KEY)) return; $user_id = intval($_GET['approve_admin_access']); if (!$user_id) return; approve_admin_access($user_id); delete_user_meta($user_id, '_admin_access_requested'); wp_die("✅ Đã duyệt quyền truy cập cho User ID {$user_id} trong " . ADMIN_SESSION_DURATION . " phút."); } // Chặn toàn bộ thao tác nếu chưa được duyệt add_action('admin_init', 'restrict_admin_action_until_approved'); function restrict_admin_action_until_approved() { $user = wp_get_current_user(); if (!in_array('administrator', $user->roles)) return; if ($user->user_login === MAIN_ADMIN_USERNAME) return; if (!is_admin_access_approved($user->ID)) { notify_main_admin_for_approval($user); // Hủy mọi quyền truy cập giao diện admin nếu chưa được duyệt wp_die('⛔ Bạn chưa được duyệt để truy cập admin. Vui lòng chờ admin xác nhận qua email.', 'Truy cập bị từ chối', [ 'response' => 403 ]); } } // Đăng xuất nếu quá hạn truy cập add_action('init', 'auto_logout_admin_after_expiry'); function auto_logout_admin_after_expiry() { if (is_user_logged_in()) { $user = wp_get_current_user(); if (!in_array('administrator', $user->roles)) return; if ($user->user_login === MAIN_ADMIN_USERNAME) return; $approved_until = get_user_meta($user->ID, '_admin_access_approved_until', true); if ($approved_until && strtotime($approved_until) < time()) { delete_user_meta($user->ID, '_admin_access_approved_until'); delete_user_meta($user->ID, '_admin_access_requested'); wp_logout(); wp_redirect(home_url()); exit; } } } // Đảm bảo mỗi lần đăng nhập lại phải được duyệt mới add_action('wp_login', 'reset_admin_access_on_login', 10, 2); function reset_admin_access_on_login($user_login, $user) { if ($user->user_login !== MAIN_ADMIN_USERNAME && in_array('administrator', $user->roles)) { delete_user_meta($user->ID, '_admin_access_approved_until'); delete_user_meta($user->ID, '_admin_access_requested'); } } |
2.2. Cách sử dụng:
Bước 1: Thêm mã trên vào file
functions.php
của theme hoặc tạo một plugin mới và dán mã vào đó.Bước 2: Sửa đổi
MAIN_ADMIN_USERNAME
thành tên đăng nhập của admin chính bạn.Bước 3: Khi bạn tạo admin phụ, họ sẽ không thể đăng nhập ngay. Email sẽ được gửi đến admin chính để duyệt quyền truy cập.
Bước 4: Sau khi admin chính duyệt qua email, admin phụ sẽ có quyền truy cập trong 60 phút.
Lưu ý quan trọng phần 2:
Nếu bạn đã sử dụng phần 1 (ẩn và xóa admin), hãy xóa toàn bộ mã phần 1 trước khi triển khai phần 2.
Phần 2 không hạn chế việc tạo admin, chỉ kiểm soát quyền truy cập sau khi admin được tạo.
- Tiêu đề là gì? 4 Cách viết tiêu đề lôi cuốn giúp tăng lượt đọc ngay lập tức
- Cách Chọn Theme WordPress Phù Hợp Với Ngành Kinh Doanh: Hướng Dẫn Chi Tiết 2024
- Hướng dẫn viết game trò chơi lật hình trong website wordpress mới nhất 2024
- Bật tính năng đánh giá sản phẩm WooCommerce chỉ với vài dòng code
- Cách Chống Brute Force và Cảnh Báo Đăng Nhập Cho WordPress (Phần 2)