wp_headers vs send_headers. Khi nào nên sử dụng mỗi?


10

Tôi đã thấy wp_headerssend_headerscả hai được sử dụng trước đây cho cùng một thứ và tôi tự hỏi làm thế nào bạn có thể biết nên sử dụng cái nào và khi nào ...

Trên send_headerstrang codex có một ví dụ về việc thêm X-UA-Compatible: IE=edge,chrome=1khả năng tương thích ngược cho Internet Explorer vì thẻ meta thường không thành công trên các trang web mạng nội bộ nếu được tải quá muộn .

Đây là những gì send_headersví dụ trông như:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
    header( 'X-UA-Compatible: IE=edge,chrome=1' );
}

Tuy nhiên wp_headerscũng có thể làm điều này:

apply_filters ( 'wp_headers', array $headers, WP $this )

add_filter( 'wp_headers', 'wpieeam_headers' );
function wpieeam_headers($headers) {
    if (!is_admin()) {
        $headers['X-UA-Compatible'] = 'IE=edge,chrome=1';    
    }
    return $headers;
}

Cập nhật: Tôi thực sự chỉ nhận thấy rằng một cuộc trò chuyện về vấn đề này ít nhiều đã bắt đầu với một câu hỏi tương tự vài năm trước ...

Ngoài ra, send_headers có phải làm gì chỉ với giao diện người dùng không? Tôi đã thấy wp_headers thực hiện kiểm tra như thế này:

if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )

if (!is_admin()) 

Vì vậy, tôi nghĩ rằng có lẽ send_headerskhông cần phải thực hiện những kiểm tra đó ...


1
Nói chung, một là một hành động và một là một bộ lọc. Các hành động là để làm một cái gì đó khi một sự kiện xảy ra và một bộ lọc là để sửa đổi một cái gì đó trước khi nó được sử dụng.
Milo

Câu trả lời:


9

Ok vì vậy tôi nghĩ rằng tôi đã tìm ra nó ...

Cả hai phần này đều hoạt động với hầu hết các phần như bạn mong đợi bằng cách gửi các tiêu đề http / php đến trình duyệt. wp_headersthực sự là một bộ lọc bên trong các send_headers()chức năng. Bạn có thể sử dụng điều này để sửa đổi các tiêu đề trước khi chúng được gửi tới trình duyệt với một số ngoại lệ. wp_headerssẽ không thể làm gì nếu đó là một trang được lưu trong bộ nhớ cache đang xử lý ...

Đây là nơi mà send_headershook đi vào chơi. Sau wp_headersbộ lọc, send_headers()chức năng kiểm tra nếu Last-Modifiedđã được gửi cùng sẽ cho chúng tôi biết liệu trang có được lưu trong bộ nhớ cache hay không và sau đó cho phép chúng tôi nối vào nó sau khi bộ đệm, loại nội dung, v.v.

Vì vậy, ví dụ của tôi sử dụng X-UA-Compatible, trong khi cả hai đều hoạt động, tôi có xu hướng sử dụng send_headers. Tại sao? Đối với một nếu bạn thêm cả hai thứ này, send_headerssẽ giành chiến thắng mọi lúc và sẽ đảm bảo rằng nó đã được tải ngay cả khi được thêm sau khi trang được lưu trữ.

Mặc dù sử dụng <meta>thẻ như nhiều khung phổ biến sử dụng cũng sẽ hoạt động tương thích với x-ua, nó sẽ không hoạt động trong nhiều trình duyệt trừ khi được tải gần như ngay lập tức sau thẻ mở đầu. Điều này được gây ra bởi nhiều lý do như nếu cài đặt "mạng nội bộ" được đặt rộng mạng . Vì lý do này, sử dụng phương thức php là an toàn hơn. Tuy nhiên, nếu bạn thêm cả hai, thẻ meta sẽ giành chiến thắng (giả sử nó đã bao gồm đủ sớm.

Liên quan đến X-UA-Compatiblekhả năng tương thích, tôi hy vọng điều này sẽ sớm không liên quan vì Microsoft sẽ ngừng hỗ trợ cho các phiên bản IE cũ hơn vào tuần tới!


Ngoài ra, tôi đã kiểm tra wp_headersbộ lọc mà không sử dụng is_admin()kiểm tra và nó sẽ không sửa đổi admin_headers để kiểm tra là không cần thiết.

Nếu bạn cần phải sửa đổi các tiêu đề quản trị viên vì một số lý do, tôi biết bạn có thể làm điều đó như thế này, nhưng tôi không chắc liệu nó có hoạt động được không ...

function admin_add_my_header() {
    header('X-UA-Compatible: IE=edge,chrome=1');    
}
add_action( 'admin_init', 'admin_add_my_header', 1 );

Câu trả lời được cập nhật dựa trên đề xuất của Toscho để kiểm tra quản trị viên:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);

2
Bạn vẫn nên sử dụng is_admin() || add_action( … ), vì không cần phải làm ô nhiễm danh sách các cuộc gọi lại đã đăng ký nếu bạn không cần nó.
fuxia

Điểm thú vị là ... Tôi đã tạo các trang web wordpress khoảng mười năm nay và tôi chưa bao giờ thấy định dạng đó trước khi sử dụng biểu tượng hoặc. Tôi thực sự đã hỏi một câu hỏi về cách định dạng đúng các điều kiện một vài năm trước nếu bạn muốn thêm phương pháp đó.
Bryan Willis

Toscho Tôi đã cập nhật câu trả lời của tôi dựa trên đề nghị của bạn. Đó có phải ý của bạn?
Bryan Willis

Đúng, có vẻ đúng. :)
fuxia

send_headersSẽ giành chiến thắng trong tất cả các thời gian và sẽ đảm bảo rằng nó đã được nạp ngay cả khi thêm vào sau khi trang được lưu trữ” - Chỉ cần lưu ý rằng send_headerskhông làm việc để trang nhịp bộ nhớ đệm được sử dụng bởi các plugin như W3 Total Cache trong các thử nghiệm của tôi, hoặc bất kỳ bộ nhớ đệm tĩnh mà hiệu quả bỏ qua WordPress ở cấp độ máy chủ.
Nick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.