Cách sửa lỗi WordPress "Warning: count(): Parameter must be an array or an object that implements" (PHP 7.2+)

intermediate📝 WordPress2026-06-18| PHP 7.2, 7.3, 7.4, 8.x; WordPress 4.9+; Linux/Nginx/Apache

Error Message

Warning: count(): Parameter must be an array or an object that implements
#wordpress#php#troubleshooting#debugging

TL;DR: Cách sửa nhanh

Việc xử lý lỗi Warning: count() thường tóm gọn trong một việc: đảm bảo biến bạn đang đếm thực sự có thể đếm được ("countable"). Nếu bạn là lập trình viên, hãy bọc mã của mình trong một trình kiểm tra để xử lý các giá trị null hoặc vô hướng một cách mượt mà:

// Cách cũ, đầy rủi ro:
$count = count($maybe_null_variable);

// Cách mới, an toàn hơn:
$count = (is_array($maybe_null_variable) || $maybe_null_variable instanceof Countable) ? count($maybe_null_variable) : 0;

Nếu bạn là chủ sở hữu trang web, cách khắc phục còn đơn giản hơn. Hãy cập nhật các plugin và theme của bạn ngay lập tức. Cảnh báo này hầu như luôn bắt nguồn từ mã nguồn cũ chưa sẵn sàng cho các quy tắc nghiêm ngặt hơn được giới thiệu trong PHP 7.2.

Tại sao lỗi này lại xảy ra?

Trước phiên bản PHP 7.2 (phát hành cuối năm 2017), hàm count() không quan tâm nhiều đến những gì bạn truyền vào. Nếu bạn truyền một chuỗi đơn hoặc null, nó sẽ trả về 1 hoặc 0 mà không hề phàn nàn. Điều này dẫn đến thói quen lập trình cẩu thả vì hàm này đã che giấu các lỗi về kiểu dữ liệu một cách hiệu quả.

PHP 7.2 đã thay đổi các quy tắc để cải thiện chất lượng mã nguồn. Giờ đây, count() yêu cầu nghiêm ngặt một array hoặc một đối tượng triển khai interface Countable. Nếu bạn cung cấp bất kỳ thứ gì khác, PHP sẽ kích hoạt một cảnh báo. Trong môi trường WordPress, điều này thường xảy ra khi một plugin truy vấn cơ sở dữ liệu để lấy metadata nhưng lại nhận về giá trị false thay vì danh sách kết quả như mong đợi.

Xác định "thủ phạm"

Bạn cần tìm tệp và số dòng cụ thể gây ra sự phiền toái này. Nếu lỗi không hiển thị ở giao diện người dùng, bạn sẽ cần kiểm tra các bản ghi (log) của WordPress.

  • Mở tệp wp-config.php của bạn qua FTP hoặc Trình quản lý tệp.
  • Tìm dòng define('WP_DEBUG', false); và chuyển nó thành true.
  • Dán các dòng sau ngay bên dưới để ghi lỗi vào một tệp thay vì hiển thị lên màn hình:

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

  
  - Tải lại trang web. Mở tệp `/wp-content/debug.log`.

Tìm một dòng có dạng: `/wp-content/plugins/outdated-plugin/functions.php on line 145`. Bây giờ bạn đã biết chính xác vấn đề nằm ở đâu.

## Ba cách để sửa mã nguồn

### Cách 1: Kiểm tra bằng is_countable (Tốt nhất cho PHP 7.3+)
Nếu máy chủ của bạn chạy PHP 7.3 hoặc mới hơn, hãy sử dụng hàm chuyên dụng `is_countable()`. Đây là giải pháp sạch sẽ và dễ đọc nhất.

if (is_countable($variable)) { $total = count($variable); } else { $total = 0; }


### Cách 2: Khởi tạo biến chính xác
Lỗi thường xảy ra vì một biến chưa bao giờ được thiết lập dưới dạng mảng. Hãy sửa lỗi ngay tại nguồn trước khi lệnh gọi `count()` diễn ra. Ví dụ, khi lấy post meta:

$results = get_post_meta($post_id, 'user_preferences', true);

// Nếu meta không tồn tại, ép nó thành một mảng rỗng if (!$results) { $results = []; }

echo count($results);


### Cách 3: Phím tắt ép kiểu (Typecasting)
Bạn cần một cách sửa nhanh cho một biến đơn giản? Hãy ép biến đó vào định dạng mảng bằng cách sử dụng typecasting. Đây là một cách viết "một dòng" đáng tin cậy để ngăn chặn cảnh báo.

$count = count((array)$variable);


## Chi tiết về môi trường
Nơi bạn lưu trữ trang web sẽ thay đổi cách bạn nhìn thấy các lỗi này. Các môi trường cục bộ như Docker hoặc XAMPP thường được thiết lập để hiển thị mọi cảnh báo nhỏ nhất. Trên shared hosting, những lỗi này có thể bị ẩn trong tệp `error_log` chung. Các dịch vụ Managed Hosting như Kinsta hoặc WP Engine thường chặn các cảnh báo trên màn hình, nhưng nếu tệp log của bạn tăng lên 500MB hoặc 1GB, việc ghi đĩa liên tục thực sự có thể làm giảm hiệu suất trang web của bạn.

## Xác nhận bản sửa lỗi
Đừng chỉ giả định rằng nó đã được sửa vì trang web trông có vẻ ổn. Hãy làm theo các bước sau để chắc chắn:

  - Xóa bộ nhớ đệm đối tượng (như Redis hoặc Memcached) và bất kỳ plugin tạo bộ nhớ đệm trang nào.
  - Theo dõi tệp log của bạn trong thời gian thực. Nếu bạn có quyền truy cập SSH, hãy chạy lệnh:
    ```
tail -f wp-content/debug.log
  • Truy cập trang cụ thể hoặc kích hoạt hành động đã gây ra lỗi. Nếu không có dòng mới nào xuất hiện trong log, bạn đã vá lỗi thành công.

Đọc thêm

Related Error Notes