Sửa lỗi 'Fatal error: Cannot redeclare class WC_Cart' và Xung đột Plugin WordPress

intermediate📝 WordPress2026-06-17| WordPress 5.0+, PHP 7.4/8.x, môi trường WooCommerce, máy chủ Linux/Unix hoặc Windows.

Error Message

Fatal error: Cannot redeclare class WC_Cart (previously declared in /wp-content/plugins/woocommerce/includes/class-wc-cart.php) in /wp-content/plugins/woocommerce/includes/class-wc-cart.php on line 1
#xung-dot-plugin#loi-fatal-error#php#wordpress#khai-bao-lai-class

Ngữ cảnhGặp lỗi 'Cannot redeclare' thường có nghĩa là trang web của bạn vừa rơi vào tình trạng 'Màn hình trắng chết chóc' (WSOD). Điều này xảy ra vì PHP gặp giới hạn. Nó cố gắng tải một class hoặc hàm đã tồn tại trong bộ nhớ hệ thống, và PHP không cho phép trùng lặp.

Thông báo lỗi chính xác thường trông như sau:

Fatal error: Cannot redeclare class WC_Cart (previously declared in /wp-content/plugins/woocommerce/includes/class-wc-cart.php) in /wp-content/plugins/woocommerce/includes/class-wc-cart.php on line 1

Khi lỗi chỉ vào cùng một tệp hai lần, như ví dụ WC_Cart ở trên, nó giống như một câu đố. Điều này thường có nghĩa là tệp được tải thông qua hai đường dẫn khác nhau—thường là do liên kết tượng trưng (symbolic link). Nó cũng có thể có nghĩa là một plugin không tốt đang cố gắng 'giả lập' hoặc ghi đè một class lõi của WooCommerce một cách không đúng đắn.

Quy trình gỡ lỗiVì bạn có thể đã bị khóa khỏi bảng điều khiển WordPress, hãy chuẩn bị thông tin đăng nhập FTP hoặc mở Trình quản lý tệp của hosting. Bạn sẽ cần đi sâu vào các tệp trực tiếp để xem điều gì đang xảy ra.

1. Bật gỡ lỗi WordPressMở tệp wp-config.php trong thư mục gốc. Tìm dòng define( 'WP_DEBUG', false ); và thay thế bằng ba dòng sau:

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

Điều này giúp tiết lộ đầy đủ các đường dẫn tệp gây ra xung đột. Thông thường, bạn sẽ thấy hai plugin khác nhau cùng cố gắng sử dụng một thư viện chung, chẳng hạn như một phiên bản cũ của class-tgm-plugin-activation.php.

2. Xác định "thủ phạm"Kiểm tra các đường dẫn trong thông báo lỗi. Nếu các đường dẫn khác nhau, đường dẫn thứ hai được đề cập thường là plugin bạn vừa cài đặt hoặc cập nhật. Đó chính là "thủ phạm". Nếu các đường dẫn giống hệt nhau, mã nguồn có thể đang sử dụng require thay vì require_once.

Giải pháp từng bước### Cách 1: Đường tắt 'Đổi tên'Nếu sự cố xảy ra ngay sau khi cập nhật plugin, hãy sử dụng FTP để điều hướng đến /wp-content/plugins/. Đổi tên thư mục của plugin bị nghi ngờ—ví dụ: đổi jetpack thành jetpack-off. Việc này sẽ vô hiệu hóa plugin ngay lập tức. Nếu trang web của bạn hoạt động trở lại, bạn đã tìm thấy nguồn cơn.

Cách 2: Chuyển sang require_onceMã tùy chỉnh thường gây ra lỗi này nếu bạn tải cùng một tệp nhiều lần. Sử dụng require hoặc include là rủi ro trong các vòng lặp hoặc giao diện (theme) phức tạp. Tốt hơn là sử dụng các biến thể 'once' để yêu cầu PHP bỏ qua tệp nếu nó đã được tải.

Tránh làm điều này:

require( plugin_dir_path( __FILE__ ) . 'includes/helpers.php' );

Thay vào đó hãy dùng:

require_once( plugin_dir_path( __FILE__ ) . 'includes/helpers.php' );

Cách 3: Sử dụng kiểm tra bao bọc phòng vệCác nhà phát triển chuyên nghiệp luôn kiểm tra xem một tên đã được sử dụng hay chưa trước khi dùng nó. Câu lệnh 'if' đơn giản này ngăn chặn 99% lỗi khai báo lại trong hệ sinh thái WordPress.

Đối với Hàm:

if ( ! function_exists( 'my_unique_prefix_utility' ) ) {
    function my_unique_prefix_utility() {
        // Mã nguồn viết tại đây
    }
}

Đối với Class:

if ( ! class_exists( 'My_Plugin_Handler' ) ) {
    class My_Plugin_Handler {
        // Mã nguồn viết tại đây
    }
}

Cách 4: Sửa xung đột riêng biệt với WC_CartLỗi WC_Cart rất phổ biến trên các trang web sử dụng 'Must Use' plugins hoặc các tập lệnh tối ưu hóa nặng. Hãy kiểm tra bên trong /wp-content/mu-plugins/. Nếu bạn tìm thấy một tập lệnh đang cố gắng bắt đầu session hoặc gọi giỏ hàng trước khi WooCommerce sẵn sàng hoàn toàn, nó sẽ gây ra lỗi nghiêm trọng này. Hãy xóa hoặc cập nhật các tập lệnh cũ này để khắc phục vòng lặp.

Kiểm tra lại- Tải lại trang chủ và /wp-admin/. Mọi thứ sẽ hoạt động bình thường mà không bị màn hình trắng.- Mở /wp-content/debug.log. Kiểm tra xem có thông báo 'Notice' hoặc 'Deprecated' nào gợi ý về các xung đột trong tương lai không.- Bật lại từng plugin một. Nếu lỗi xuất hiện lại khi bạn kích hoạt một cái cụ thể, plugin đó có một xung đột được viết cứng (hardcoded) cần lập trình viên sửa lỗi.## Bài học kinh nghiệm- Sử dụng tiền tố cho mọi thứ: Đừng bao giờ đặt tên hàm là get_data(). Hãy sử dụng một tiền tố duy nhất như acme_get_data() để đảm bảo an toàn.- Áp dụng Namespaces: Các nhà phát triển PHP hiện đại sử dụng namespace MyPlugin\Utilities;. Điều này tạo ra một ngăn chứa riêng cho mã của bạn, khiến lỗi 'Cannot redeclare' gần như không thể xảy ra.- Chú ý các Symlink: Một số nhà cung cấp hosting sử dụng liên kết tượng trưng cho các thư viện dùng chung. PHP thỉnh thoảng coi đây là các đường dẫn tuyệt đối duy nhất, dẫn đến việc tải cùng một tệp hai lần. Hãy luôn sử dụng __FILE__dirname() một cách cẩn thận.

Related Error Notes