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
}
}

