Tới nội dung chính
hstation
Dịch vụDự ánVề tôiBlogThư viện nhạc

WordPress · 7 phút đọc · 2026-09-17

WordPress trắng trang: phân biệt 200, 500, tìm lỗi và Recovery Mode

Mình dựng lại ba kiểu trắng trang trên WordPress 7.1: có kiểu để lại log, có kiểu chỉ nằm trong error_log của PHP, và có kiểu trả 200 không một dòng lỗi. Kèm cách vào wp-admin bằng chế độ khôi phục.

WordPress trắng trang là triệu chứng nghe thì một, nhưng thực ra có mấy kiểu khác nhau, và cách tìm lỗi của từng kiểu khác hẳn nhau. Người gặp lỗi trắng trang WordPress thường mô tả giống nhau: "WordPress bị trắng trang, không thấy gì cả". Mình dựng lại từng kiểu trên một site thử WordPress 7.1 (theme Twenty Twenty-Five, PHP 8.3.30) bằng hai plugin tự viết: một plugin gọi hàm không tồn tại, và một plugin dừng PHP mà không báo lỗi gì. Mỗi lần, mình đo mã HTTP và số byte của trang chủ, trang quản trị và trang đăng nhập.

Kết quả gọn trong một câu: cùng là màn hình trắng, có kiểu trả 500 kèm log, có kiểu trả 500 không để lại gì trong log của WordPress, và có kiểu trả 200 hoàn toàn không có lỗi. Bài này chỉ bạn cách nhận ra mình đang gặp kiểu nào, rồi dùng chế độ khôi phục của WordPress để vào lại trang quản trị.

Nếu site của bạn hiện dòng "Đã có một lỗi nghiêm trọng trên trang web của bạn." thì đó chưa phải trắng trang thật. Cách bật log và đổi tên thư mục plugin cho trường hợp này đã có ở bài lỗi 500 WordPress.

Đo trước: mã HTTP và số byte

Với lỗi màn hình trắng WordPress, mắt người chỉ thấy "trắng". Hai con số dưới đây mới cho biết đó là kiểu nào:

bash
curl -s -o /dev/null -w "%{http_code} %{size_download}\n" https://ten-mien-cua-ban/
curl -s -o /dev/null -w "%{http_code} %{size_download}\n" https://ten-mien-cua-ban/wp-login.php

Lúc bình thường, site thử trả 200 63150 cho trang chủ và 200 cho trang đăng nhập. Cách đọc mã HTTP ở nhiều chỗ cùng lúc có ở bài sửa lỗi WordPress theo mã HTTP.

Kiểu 1: có dòng thông báo lỗi, chưa phải trắng thật

Plugin gọi hàm không tồn tại ở hook init. Kết quả phụ thuộc vào việc PHP có hiển thị lỗi hay không.

Máy chủ bật `display_errors` (Laragon bật sẵn, một số host cũng vậy): cả ba đường trả 500, trang in nguyên dòng "Fatal error: Uncaught Error: Call to undefined function ham_khong_ton_tai() in I:\laragon\www\wp-demo\wp-content\plugins\...". Tức là lộ luôn đường dẫn thư mục trên máy chủ cho bất kỳ ai ghé thăm.

Tắt `display_errors` như đa số host thật: trình xử lý lỗi của WordPress nhận việc.

  • Trang chủ: 500, 2.702 byte, dòng "Đã có một lỗi nghiêm trọng trên trang web của bạn."
  • /wp-admin/ và /wp-login.php: 500, 2.924 byte, dòng "Đã xảy ra lỗi nghiêm trọng trên trang web này. Vui lòng kiểm tra hộp thư email của quản trị viên trang web để biết hướng dẫn."

Ngay lúc đó, WordPress cập nhật option recovery_mode_email_last_sent và tạo một khoá mới trong option recovery_keys. Nghĩa là nó đã gọi hàm gửi email khôi phục tới địa chỉ email quản trị. Email đó chính là lối vào ở phần cuối bài.

Kiểu 2: WordPress trắng trang 500, 0 byte

Hai tình huống trên site thử cho ra đúng một trang không có chữ nào.

Trình xử lý lỗi của WordPress bị tắt. Có dòng này trong wp-config.php:

php
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true );

Cùng plugin lỗi ở trên, trang chủ và /wp-admin/ giờ trả 500, 0 byte. Không một dòng thông báo. Bật log theo cách thường dùng:

php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Trang vẫn 500, 0 byte, nhưng wp-content/debug.log xuất hiện (982 byte) với dòng cuối "thrown in ...\thu-loi-nghiem-trong.php on line 7". Log là manh mối duy nhất. Nếu site bạn đang có hằng số WP_DISABLE_FATAL_ERROR_HANDLER, hãy tìm hiểu ai thêm nó và vì sao trước khi xoá.

Lỗi nằm ngay trong wp-config.php. Mình thêm một lời gọi hàm không tồn tại vào dòng thứ ba của tệp. Kết quả:

  • Trang chủ và /wp-admin/: 500, 0 byte.
  • WP-CLI cũng im lặng: wp option get home thoát với mã 255 và không in gì.
  • debug.log của WordPress không thể có dòng nào, vì lỗi xảy ra trước khi WordPress kịp nạp.

Lỗi chỉ nằm trong error_log của PHP. Trên Laragon, php.ini ghi error_log="I:/laragon/tmp/php_errors.log", và tệp đó có 4 dòng "PHP Fatal error: Uncaught Error: Call to undefined function ham_trong_wp_config()". Trên hosting, tệp này thường nằm trong mục log lỗi của bảng điều khiển; đường dẫn cụ thể tuỳ nhà cung cấp.

Dấu hiệu nhận ra kiểu này: WP-CLI cũng hỏng. Nếu wp plugin list chạy bình thường mà trang vẫn trắng, nhiều khả năng lỗi không nằm trong wp-config.php.

Kiểu 3: trắng với mã 200, không có lỗi nào

Plugin thứ hai chỉ làm một việc: gọi exit ở hook template_redirect. PHP không có lỗi gì. Kết quả:

  • Trang chủ: 200, 0 byte.
  • /wp-admin/ và /wp-login.php vẫn bình thường.
  • Bật WP_DEBUG_LOG: không có tệp debug.log nào được tạo.

Đây là kiểu khó nhất: không log, trang quản trị vẫn vào được nên dễ tưởng "máy chủ trục trặc". Vì vẫn vào được quản trị, cách tìm là cô lập plugin, tốt nhất làm trên bản sao của site:

bash
wp plugin list --status=active --field=name > plugin-dang-bat.txt
wp plugin deactivate --all
curl -s -o /dev/null -w "%{http_code} %{size_download}\n" https://ten-mien-cua-ban/

Trên site thử, sau deactivate --all trang chủ về 200 63150. Sau đó bật lại từng plugin theo danh sách đã lưu, đo lại sau mỗi lần. Plugin nào làm số byte rơi về 0 là thủ phạm. Ở đây, bật lại Query Monitor thì trang vẫn 63.150 byte; bật plugin thoát sớm thì về 0.

Mình chưa thử trường hợp theme gây ra kiểu này. Nếu tắt hết plugin mà trang vẫn 200 và 0 byte, đổi sang một theme mặc định là bước kiểm tiếp theo nên thử.

Dùng chế độ khôi phục (WordPress recovery mode) để vào lại wp-admin

Khi WordPress trắng trang không vào được admin, chế độ khôi phục là lối vào mà WordPress chuẩn bị sẵn. Quay lại Kiểu 1. Khi trình xử lý lỗi còn bật, WordPress gửi email khôi phục cho quản trị viên. Trên site thử không có máy chủ mail đang chạy nên mình không đọc được email. Mình tạo đúng loại link đó bằng lớp có sẵn của WordPress, WP_Recovery_Mode_Link_Service. Link có dạng wp-login.php?action=enter_recovery_mode&rm_token=...&rm_key=....

Mở link, WordPress chuyển sang trang đăng nhập với khung "Chế độ phục hồi được khởi tạo. Đăng nhập để tiếp tục."

Trang đăng nhập WordPress sau khi mở link khôi phục: khung viền xanh ghi Chế độ phục hồi được khởi tạo. Đăng nhập để tiếp tục., bên dưới là ô Tên người dùng hoặc địa chỉ email, ô Mật khẩu và nút Đăng nhập.
Trang đăng nhập WordPress sau khi mở link khôi phục: khung viền xanh ghi Chế độ phục hồi được khởi tạo. Đăng nhập để tiếp tục., bên dưới là ô Tên người dùng hoặc địa chỉ email, ô Mật khẩu và nút Đăng nhập.

Đăng nhập xong, wp-admin mở bình thường dù plugin vẫn lỗi. Trang Plugin cho biết đích danh plugin nào và dòng nào:

Trang Plugin trong chế độ khôi phục: khung thông báo Bạn đang ở chế độ khôi phục kèm liên kết Thoát chế độ khôi phục, bộ lọc Đã tạm dừng (1). Dòng plugin Thử lỗi nghiêm trọng tô đỏ, ghi Plugin này không hoạt động đúng cách và bị tạm dừng trong chế độ khôi phục, có lỗi E_ERROR tại dòng 7, kèm thông báo lỗi và stack trace, hai liên kết Vô hiệu hóa và Tiếp tục.
Trang Plugin trong chế độ khôi phục: khung thông báo Bạn đang ở chế độ khôi phục kèm liên kết Thoát chế độ khôi phục, bộ lọc Đã tạm dừng (1). Dòng plugin Thử lỗi nghiêm trọng tô đỏ, ghi Plugin này không hoạt động đúng cách và bị tạm dừng trong chế độ khôi phục, có lỗi E_ERROR tại dòng 7, kèm thông báo lỗi và stack trace, hai liên kết Vô hiệu hóa và Tiếp tục.

Hai điều mình đo được về chế độ này:

  1. Khách vẫn thấy lỗi. Trong lúc mình đang ở chế độ khôi phục, gọi trang chủ không kèm cookie vẫn nhận 500, 2.702 byte. Plugin chỉ bị tạm dừng trong phiên của quản trị viên.
  2. Phải bấm "Vô hiệu hóa" (hoặc sửa plugin) thì site mới lên cho mọi người. Liên kết "Tiếp tục" bỏ trạng thái tạm dừng; mình không bấm thử nó.

Thanh quản trị có nút "Thoát khỏi chế độ khôi phục" để rời chế độ này khi xong việc.

Mình chỉ kiểm dấu hiệu gửi email khôi phục ở Kiểu 1. Chế độ này phụ thuộc vào email: nếu địa chỉ email quản trị không nhận được thư, bạn sẽ không có link. Hãy kiểm tra địa chỉ đó ngay khi site còn chạy bình thường, đừng đợi tới lúc trắng trang.

Tóm tắt cách sửa lỗi trắng trang WordPress theo con số

  • 500, có dòng "lỗi nghiêm trọng": kiểm hộp thư quản trị tìm link khôi phục, hoặc đọc debug.log.
  • 500, 0 byte, WP-CLI vẫn chạy: tìm WP_DISABLE_FATAL_ERROR_HANDLER, bật WP_DEBUG_LOG rồi đọc debug.log.
  • 500, 0 byte, WP-CLI cũng hỏng: xem wp-config.php và error_log của PHP trên máy chủ.
  • 200, 0 byte: không có log để đọc; cô lập plugin theo danh sách, rồi tới theme.

Những gì mình chưa kiểm

  • Trình soạn thảo khối trắng vì lỗi JavaScript.
  • Theme gây trang trắng.
  • Email khôi phục thật đến hộp thư, và giới hạn tần suất gửi lại.
  • Các hosting cụ thể: vị trí tệp error_log và cách bật tắt display_errors.