Cách khắc phục lỗi 'Headers Already Sent' trong WordPress

intermediate📝 WordPress2026-04-27| WordPress (mọi phiên bản), PHP 7.4 - 8.3+, Nginx/Apache trên Linux hoặc Windows.

Error Message

Warning: Cannot modify header information - headers already sent by (output started at /home/username/public_html/wp-config.php:1)
#wordpress#php#khắc phục sự cố#wp-config

Ý nghĩa thực sự của lỗi này

Cảnh báo "headers already sent" là một vấn đề đau đầu kinh điển trong PHP. Hãy tưởng tượng một phản hồi HTTP giống như một bức thư vật lý. Các header là phong bì, và HTML là bức thư bên trong. PHP phải hoàn tất việc viết phong bì trước khi cho bức thư vào. Nếu máy chủ của bạn gửi đi dù chỉ một ký tự nội dung—một dấu cách, một lần xuống dòng hoặc một byte thừa—nó sẽ "đóng dấu" phong bì đó. Khi WordPress cố gắng thêm cookie hoặc chuyển hướng (cả hai đều là header) sau đó, nó sẽ thất bại vì phong bì đã bị đóng lại.

Thông báo lỗi chính là lộ trình của bạn. Nó cho bạn biết chính xác nơi mà sự "rò rỉ" bắt đầu:

Warning: Cannot modify header information - headers already sent by (output started at /path/to/wp-config.php:1)

Trong ví dụ này, vấn đề nằm ở dòng 1 của wp-config.php. Thông thường, điều này có nghĩa là có một ký tự ẩn nằm ngay đầu tệp.

Bước 1: Tìm kiếm khoảng trắng ở đầu tệp

Nguyên nhân phổ biến nhất là một dấu cách đơn giản hoặc một dòng trống trước thẻ mở <?php. Thậm chí chỉ một ký tự khoảng trắng 0x20 cũng đủ để làm hỏng trang web của bạn.

  • Truy cập các tệp trên máy chủ của bạn bằng SFTP (như FileZilla) hoặc Trình quản lý tệp (File Manager) của hosting.
  • Tải xuống tệp được đề cập trong lỗi (thường là wp-config.php hoặc functions.php).
  • Mở tệp trong một trình soạn thảo mã nguồn. Đảm bảo thẻ <?phpthứ đầu tiên tuyệt đối trong tệp. Không khoảng trắng. Không dòng trống.

Cách làm sai:

 [khoảng trắng hoặc dòng trống ở đây]
<?php
define('DB_NAME', 'database_name');

Cách làm đúng:

<?php
define('DB_NAME', 'database_name');

Bước 2: Loại bỏ UTF-8 BOM

Nếu dòng 1 trông có vẻ sạch sẽ nhưng lỗi vẫn còn, có khả năng bạn đang gặp lỗi Byte Order Mark (BOM). Đây là một tập hợp các ký tự ẩn (EF BB BF) mà các trình soạn thảo như Windows Notepad thường tự ý thêm vào đầu tệp. PHP coi những byte vô hình này là nội dung đầu ra.

Đừng sử dụng Notepad. Thay vào đó, hãy sử dụng một trình soạn thảo chuyên nghiệp như VS Code hoặc Notepad++:

  • Trong VS Code: Kiểm tra thanh trạng thái ở góc dưới bên phải. Nếu nó hiển thị "UTF-8 with BOM", hãy nhấp vào đó. Chọn "Save with Encoding" và chọn "UTF-8".
  • Trong Notepad++: Mở menu Encoding. Chọn "UTF-8 (No BOM)" và lưu lại.

Bước 3: Loại bỏ thẻ đóng PHP

Trong các tệp chỉ chứa mã PHP như functions.php, thẻ đóng ?> là không bắt buộc. Trên thực tế, việc xóa bỏ hoàn toàn thẻ này sẽ an toàn hơn. Nếu bạn có một thẻ đóng và vô tình nhấn phím "Enter" sau đó, dòng mới thừa đó sẽ được tính là nội dung đầu ra và kích hoạt lỗi.

Cuộn xuống cuối tệp. Nếu bạn thấy ?>, hãy xóa nó. Các tiêu chuẩn WordPress hiện đại (và hướng dẫn quy chuẩn mã nguồn PSR-12) khuyến nghị bỏ qua thẻ này để ngăn chặn chính xác vấn đề này.

Bước 4: Cô lập xung đột Plugin và Theme

Đôi khi lỗi chỉ đến một tệp nằm sâu bên trong wp-content/plugins/. Điều này xảy ra khi một plugin cố gắng echo dữ liệu hoặc tự bản thân nó có vấn đề về khoảng trắng.

  • Nếu lỗi chỉ đến /plugins/contact-form-7/functions.php:45, hãy hủy kích hoạt plugin cụ thể đó.
  • Nếu lỗi chỉ đến theme của bạn, hãy chuyển sang một theme mặc định như Twenty Twenty-Four.
  • Kiểm tra tệp xem có lệnh echo, print, hoặc mã HTML thô xuất hiện bên ngoài một hàm hay không. Những thứ này hầu như luôn phải được móc nối (hook) vào init hoặc wp_head thay vì chạy toàn cục.

Bước 5: Giải pháp tạm thời (Output Buffering)

Bạn cần đưa trang web hoạt động trở lại ngay lập tức trong khi điều tra? Bạn có thể buộc PHP chờ đợi trước khi gửi nội dung. Điều này được gọi là Đệm đầu ra (Output Buffering). Nó yêu cầu máy chủ giữ mọi thứ trong một bộ đệm tạm thời cho đến khi trang đã sẵn sàng.

Thêm dòng này vào ngay đầu tệp wp-config.php của bạn, ngay sau thẻ mở <?php:

ob_start();

Cảnh báo: Cách này không khắc phục được tận gốc vấn đề; nó chỉ che giấu triệu chứng. Nó cũng có thể làm tăng nhẹ mức sử dụng bộ nhớ, vì vậy chỉ nên sử dụng như một biện pháp tạm thời.

Cách xác minh việc khắc phục

Sau khi lưu các thay đổi, đừng chỉ làm mới trang chủ. Hãy thực hiện các bước sau:

  • Mở trang web của bạn trong cửa sổ Ẩn danh/Riêng tư để bỏ qua cookie cục bộ.
  • Thử đăng nhập vào /wp-admin. Quá trình đăng nhập phụ thuộc rất nhiều vào các header; nếu nó hoạt động, bạn đã thành công.
  • Kiểm tra tệp error_log trên máy chủ. Nếu không có mục "headers already sent" mới nào xuất hiện trong 60 giây qua, vấn đề đã được giải quyết.

Danh sách kiểm tra phòng ngừa

  • Bỏ dùng Notepad: Sử dụng VS Code, Sublime Text hoặc PHPStorm.
  • Không dùng thẻ đóng: Không bao giờ sử dụng ?> ở cuối các tệp PHP.
  • Kiểm tra các Hook: Không bao giờ sử dụng echo trước hàm get_header() trong các template của bạn.
  • Theo dõi Log: Luôn bật WP_DEBUG trên trang staging để phát hiện các lỗi này trước khi đưa lên môi trường thực tế (production).

Related Error Notes