TL;DR: Cách khắc phục nhanh
Thật khó chịu khi bạn đăng nhập và bị chặn bởi một dòng văn bản duy nhất. Nếu bạn đang bị khóa quyền truy cập ngay bây giờ, hãy thử ba bước sau để lấy lại quyền:
- Đồng bộ hóa Database Prefix: Kiểm tra xem
$table_prefixtrongwp-config.phpcó khớp với các khóa (keys) trong bảngwp_usermetacủa bạn hay không. - Làm mới .htaccess: Đổi tên tệp thành
.htaccess_oldđể bỏ qua các quy tắc máy chủ tùy chỉnh. - Vô hiệu hóa Plugin: Tạm thời đổi tên thư mục
wp-content/pluginsthànhplugins_oldbằng cách sử dụng FTP hoặc SSH.
Điều gì thực sự đang xảy ra?
Hãy coi lỗi này như một thông báo 403 Forbidden nội bộ. Khác với việc bị chặn ở cấp máy chủ, chính WordPress đang quyết định rằng tài khoản của bạn—mặc dù đã đăng nhập thành công—không có đủ 'capabilities' (quyền hạn) để xem trang bạn yêu cầu. Điều này thường xảy ra sau khi di chuyển trang web (migration), nơi khoảng 80% trường hợp bị khóa quyền truy cập bắt nguồn từ một dòng không khớp duy nhất trong tệp cấu hình.
Các nguyên nhân phổ biến bao gồm:
- Database prefixes không khớp (nguyên nhân số 1 sau khi di chuyển trang web).
- Các plugin bảo mật như Wordfence hoặc Sucuri chặn IP cụ thể của bạn.
- Phân quyền tệp (file permissions) không chính xác khiến WordPress không thể đọc các tệp cốt lõi của chính nó.
- Không tương thích phiên bản PHP, đặc biệt nếu máy chủ của bạn vừa cập nhật lên PHP 8.x.
Các bước khắc phục chi tiết
1. Xác minh Database Table Prefix
WordPress lưu trữ quyền quản trị của bạn trong cơ sở dữ liệu bằng cách sử dụng table prefix như một phần của tên khóa (key name). Nếu bạn đã thay đổi prefix từ wp_ thành wp_secure_ trong wp-config.php nhưng không cập nhật các hàng bên trong cơ sở dữ liệu, WordPress sẽ coi bạn là một 'subscriber' với quyền hạn bằng không.
Đầu tiên, hãy mở wp-config.php và tìm dòng này:
$table_prefix = 'wp_custom_';
Tiếp theo, sử dụng phpMyAdmin để xem bảng wp_usermeta của bạn. Kiểm tra cột meta_key. Nếu prefix của bạn là wp_custom_, bạn sẽ thấy các khóa có tên là wp_custom_capabilities. Nếu chúng vẫn hiển thị là wp_capabilities, bạn đã tìm ra vấn đề. Hãy chạy các lệnh SQL sau để đồng bộ hóa chúng:
UPDATE `wp_custom_usermeta` SET `meta_key` = 'wp_custom_capabilities' WHERE `meta_key` = 'wp_capabilities';
UPDATE `wp_custom_usermeta` SET `meta_key` = 'wp_custom_user_level' WHERE `meta_key` = 'wp_user_level';
UPDATE `wp_custom_options` SET `option_name` = 'wp_custom_user_roles' WHERE `option_name` = 'wp_user_roles';
2. Thiết lập Phân quyền Tệp Chính xác
Phân quyền không chính xác là một rủi ro bảo mật lớn. Nếu các thư mục của bạn được đặt thành 777, bạn đang mở toang cửa cho tin tặc; nếu chúng quá hạn chế, bạn sẽ bị khóa quyền truy cập. WordPress cần một sự cân bằng rất cụ thể để chạy các script một cách chính xác.
Phân quyền tiêu chuẩn nên là:
- Thư mục:
755(Đọc/Ghi/Thực thi cho chủ sở hữu, Đọc/Thực thi cho những người khác). - Tệp:
644(Đọc/Ghi cho chủ sở hữu, Chỉ đọc cho những người khác). - wp-config.php:
600hoặc640để bảo mật tối đa.
Chạy các lệnh này qua SSH để đặt lại toàn bộ cấu trúc thư mục của bạn một cách an toàn:
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
Tôi thường sử dụng Công cụ tính Phân quyền Unix trên ToolCraft để hình dung các thiết lập này. Nó giúp đảm bảo tôi không vô tình cấp quyền ghi cho công cộng.
3. Đặt lại tệp .htaccess
Một lỗi đánh máy nhỏ trong tệp .htaccess có thể làm hỏng bảng điều khiển quản trị của bạn. Các plugin bảo mật thường thêm hàng trăm dòng mã vào đây, điều này có thể gây xung đột với việc đăng nhập của bạn. Để kiểm tra điều này, hãy xóa tệp hiện tại và thay thế bằng khối mặc định của WordPress sau:
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
4. Tạo một Tài khoản Quản trị Khẩn cấp
Khi dữ liệu người dùng của bạn bị hỏng đến mức không thể sửa chữa, bạn có thể bỏ qua cơ sở dữ liệu hoàn toàn bằng cách chèn một quản trị viên mới thông qua theme của mình. Dán đoạn mã này vào tệp functions.php của theme:
function temp_admin_account() {
$user = 'recovery_admin';
$pass = 'SecurePass!2024';
$email = 'admin@yoursite.com';
if ( !username_exists( $user ) ) {
$user_id = wp_create_user( $user, $pass, $email );
$user_obj = new WP_User( $user_id );
$user_obj->set_role( 'administrator' );
}
}
add_action('init','temp_admin_account');
Tải lại trang web của bạn một lần, đăng nhập bằng thông tin mới này và sửa tài khoản chính của bạn. Đừng quên xóa mã này ngay sau khi bạn đã truy cập lại được.
Làm thế nào để tránh bị khóa quyền
Để ngăn điều này xảy ra lần nữa, hãy luôn giữ một bản sao lưu gần nhất. Tôi khuyên bạn nên sử dụng môi trường staging bất cứ khi nào bạn thay đổi database prefix hoặc cài đặt các bộ bảo mật nặng. Cuối cùng, hãy kiểm tra danh sách người dùng hai lần một năm để đảm bảo vai trò 'Administrator' của bạn không bị tước bỏ các quyền hạn cốt lõi do bản cập nhật plugin bị lỗi.

