Giải mã lỗi "0"
Bạn đã viết mã JavaScript, thiết lập trình xử lý PHP và gửi yêu cầu. Thay vì nhận được dữ liệu mong muốn, bảng điều khiển trình duyệt lại hiển thị một ký tự duy nhất và cô độc: 0. Đây là một trong những trở ngại thường gặp nhất mà các lập trình viên đối mặt khi làm việc với WordPress AJAX API.
Đừng lo lắng, đây không phải là lỗi trong mã nguồn WordPress. Đó là phản hồi mặc định từ admin-ajax.php. Nếu script kết thúc quá trình thực thi mà không tìm thấy hook phù hợp, hoặc nếu nó kết thúc hàm mà không được yêu cầu dừng lại, WordPress sẽ xuất ra 0 và chấm dứt tiến trình.
Tại sao WordPress mặc định trả về 0
Tệp admin-ajax.php đóng vai trò như một bộ định tuyến trung tâm. Ở cuối tệp đó, WordPress thực thi lệnh wp_die('0'). Đây là một cơ chế bắt lỗi chung. Nếu yêu cầu của bạn không kích hoạt được một action đã đăng ký, hoặc nếu hàm của bạn thực thi nhưng không "die" một cách rõ ràng, script sẽ chạm đến dòng cuối cùng đó và trả về 0 cho hàm callback success trong JavaScript của bạn.
Bước 1: Kiểm tra việc đăng ký Hook
Nguyên nhân phổ biến nhất là thiếu hoặc gõ sai action hook. WordPress yêu cầu hai hook cụ thể để một action AJAX hoạt động trên toàn bộ trang web. Nếu bạn chỉ đăng ký một cái, mã của bạn sẽ không hoạt động với một nửa số người dùng.
Mở tệp functions.php hoặc tệp plugin của bạn và kiểm tra hai dòng sau:
// Xử lý người dùng đã đăng nhập
add_action('wp_ajax_get_user_stats', 'my_ajax_handler_function');
// Xử lý khách và người dùng chưa đăng nhập
add_action('wp_ajax_nopriv_get_user_stats', 'my_ajax_handler_function');
Các sai lầm thường gặp cần tránh:
- Bỏ sót "Nopriv": Bạn đã kiểm tra khi đăng nhập với tư cách quản trị viên, nhưng tính năng này lại lỗi với khách truy cập thông thường vì bạn quên hook
wp_ajax_nopriv_. - Phân biệt chữ hoa chữ thường: Nếu JS gửi
action: 'GetUserStats'nhưng PHP hook của bạn sử dụngwp_ajax_get_user_stats, việc khớp lệnh sẽ thất bại.
Bước 2: Đồng bộ hóa Action Key trong JavaScript
JavaScript của bạn phải bao gồm một key action trong đối tượng dữ liệu. Chuỗi này là "ID" mà WordPress sử dụng để tìm đúng hàm PHP. Nó phải khớp hoàn toàn với phần hậu tố trong lệnh gọi add_action của bạn.
// Ví dụ JavaScript sử dụng jQuery
$.ajax({
url: ajax_vars.url,
type: 'POST',
data: {
action: 'get_user_stats', // Phần này phải khớp hoàn toàn với hậu tố của PHP hook
user_id: 101
},
success: function(response) {
console.log('Server says:', response);
}
});
Nếu bạn gửi một tên action chung chung hoặc bỏ trống hoàn toàn, WordPress sẽ không biết nên chạy hàm nào, dẫn trực tiếp đến phản hồi 0 đó.
Bước 3: Gỡ lỗi Nonce và các lỗi bảo mật
Kiểm tra bảo mật thường là nguyên nhân gây ra các lỗi không có thông báo. Nếu bạn sử dụng nonce—và bạn nên làm vậy—các lỗi xác thực có thể làm dừng script trước khi nó chạm tới logic của bạn. Khi check_ajax_referer() thất bại, nó thường trả về -1, nhưng tùy thuộc vào thiết lập của bạn, nó cũng có thể dẫn đến kết quả 0.
Đầu tiên, hãy truyền nonce từ PHP sang script của bạn bằng wp_localize_script:
wp_localize_script('my-app-js', 'ajax_vars', [
'url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('stats_nonce')
]);
Sau đó, hãy xác thực nó ở ngay đầu trình xử lý PHP của bạn:
function my_ajax_handler_function() {
// Nếu nonce không hợp lệ, script sẽ dừng tại đây
check_ajax_referer('stats_nonce', 'security');
// Xử lý dữ liệu của bạn
$stats = ['views' => 1250, 'likes' => 42];
wp_send_json_success($stats);
}
Bước 4: Bắt buộc kết thúc tiến trình một cách sạch sẽ
Ngay cả khi logic của bạn hoạt động hoàn hảo, WordPress vẫn có thể đính kèm thêm số 0 vào kết quả đầu ra. Điều này xảy ra nếu bạn echo dữ liệu nhưng không dừng script. Kết quả là chuỗi JSON bị sai định dạng, ví dụ như {"success":true}0, gây ra lỗi JavaScript.
Luôn kết thúc các hàm AJAX của bạn bằng một lệnh chấm dứt. Cách dễ nhất là sử dụng các hàm hỗ trợ JSON có sẵn của WordPress, chúng sẽ xử lý việc thoát (exit) cho bạn:
function my_ajax_handler_function() {
// Thực hiện logic của bạn...
// Khuyên dùng: Lệnh này gửi JSON header, xuất dữ liệu và gọi die()
wp_send_json_success($data);
// Lựa chọn thay thế cho phản hồi HTML:
// echo "<p>Update complete!</p>";
// wp_die();
}
Cách kiểm tra việc khắc phục lỗi
-
Kiểm tra tab Network: Mở DevTools (F12) và theo dõi tab "Network". Lọc theo "XHR".
-
Kiểm tra Status Code: Một yêu cầu thành công sẽ trả về trạng thái
200 OK. -
Đọc phản hồi thô:
Phản hồi là 0: Hook chưa bao giờ được kích hoạt. Hãy kiểm tra lại tên action của bạn.
- Phản hồi là -1: Đây là lỗi bảo mật. Nonce của bạn có thể bị thiếu hoặc hết hạn.
- Phản hồi chứa dữ liệu của bạn + 0: Bạn đã quên gọi
wp_die()hoặcwp_send_json().
Mẹo chuyên nghiệp để gỡ lỗi nhanh hơn
- Khoảng cách Front-End: Trong WP Admin, biến
ajaxurlluôn có sẵn. Ở giao diện người dùng (front-end), nó không có sẵn. Bạn phải định nghĩa nó thủ công thông quawp_localize_script. - Lỗi PHP ẩn: Nếu mã của bạn có lỗi cú pháp, lệnh gọi AJAX có thể trả về phản hồi trống hoặc lỗi 500. Hãy kiểm tra
wp-content/debug.logđể phát hiện các lỗi PHP bị ẩn. - Tránh khoảng trắng thừa: Đảm bảo không có dòng trống sau thẻ đóng
?>trong các tệp PHP của bạn. Những khoảng trắng vô hình này có thể bị chèn vào phản hồi AJAX và làm hỏng chuỗi JSON của bạn.

