Hàm JavaScript wp_attempt_focus
đang gây ra sự cố này. Chức năng kích hoạt ngay sau khi tải trang, xóa biểu mẫu và tập trung vào nó, buộc người dùng phải nhập thủ công thông tin đăng nhập của họ.
Chrome sẽ tự động điền tên người dùng và mật khẩu, chỉ một phần nghìn giây trước khi chức năng JS xóa trường. Chrome không nhận đúng các thay đổi, hiển thị các trường được tô màu vàng ngay cả khi các trường thực sự trống.
Mặc dù tôi đánh giá cao chức năng tự động lấy nét, tôi không thể nghĩ ra một lý do chính đáng để bất kỳ ai cũng muốn biểu mẫu tự động xóa.
Nguồn
Đáng buồn thay, chức năng này đã được mã hóa cứng wp-login.php
trong các dòng 913-930 (WordPress 4.0). Thay đổiwp-login.php
tập tin hoàn toàn là một ý tưởng tồi, vì nó có thể bị ghi đè trong bất kỳ bản cập nhật WordPress sắp tới nào. Vì vậy, chúng tôi sẽ phải dùng đến một chút 'hack'.
Cách khắc phục dễ dàng
Các wp_attempt_focus
hàm được gọi nếu hình thức không có lỗi. Chúng tôi rất may mắn - việc kiểm tra lỗi được thực hiện thông qua PHP. Điều này có nghĩa là chúng ta có thể đơn giản ngăn chức năng bắn bằng cách giả mạo lỗi biểu mẫu vào đúng thời điểm bằng cách sử dụng các hành động WP. Tôi đã chọn login_form
hành động vì hành động luôn kích hoạt sau khi xử lý lỗi, ngay trước lệnh gọi JS. Thêm mã sau vào chủ đề của bạn functions.php
(hoặc tệp plugin):
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
Bản sửa lỗi
Cách khắc phục ở trên ngăn chức năng bắn hoàn toàn, nghĩa là bạn cũng sẽ không lấy nét tự động thích hợp. Có một cách khác xung quanh nó: đệm đầu ra HTML và sửa đổi nó thông qua ob_start
, như được truyền cảm hứng bởi Geeklab . Bộ đệm cho phép chúng tôi loại bỏ các phần mã cụ thể - trong trường hợp này là phần tự động d.value = ''
. Đừng quên xả đệm mặc dù.
add_action("login_form", "kill_wp_attempt_focus_start");
function kill_wp_attempt_focus_start() {
ob_start("kill_wp_attempt_focus_replace");
}
function kill_wp_attempt_focus_replace($html) {
return preg_replace("/d.value = '';/", "", $html);
}
add_action("login_footer", "kill_wp_attempt_focus_end");
function kill_wp_attempt_focus_end() {
ob_end_flush();
}