wp_headers vs send_headers. Kapan harus menggunakan masing-masing?

10

Saya telah melihat wp_headersdan send_headerskeduanya digunakan sebelumnya untuk hal yang sama dan saya bertanya-tanya bagaimana Anda bisa tahu mana yang harus digunakan dan kapan ...

Pada send_headershalaman codex ada contoh menambahkan X-UA-Compatible: IE=edge,chrome=1kompatibilitas mundur untuk Internet Explorer karena tag meta sering gagal di situs intranet jika dimuat terlambat .

Seperti inilah send_headerscontohnya:

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

Namun wp_headersdapat juga melakukan ini:

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

Pembaruan: Saya sebenarnya baru saja memperhatikan bahwa percakapan tentang ini kurang lebih dimulai dengan pertanyaan serupa beberapa tahun yang lalu ...

Juga, apakah send_headers hanya ada hubungannya dengan front end? Saya telah melihat wp_headers melakukan pemeriksaan seperti ini:

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

dan

if (!is_admin()) 

jadi saya berpikir bahwa mungkin send_headerstidak perlu melakukan pemeriksaan itu ...

Bryan Willis
sumber
1
Secara umum, satu adalah tindakan dan yang lainnya adalah filter. Tindakan adalah untuk melakukan sesuatu ketika suatu peristiwa terjadi, dan filter adalah untuk memodifikasi sesuatu sebelum digunakan.
Milo

Jawaban:

9

Ok jadi saya pikir saya menemukan jawabannya ...

Keduanya berfungsi sebagian besar seperti yang Anda harapkan dengan mengirim header http / php ke browser. wp_headerssebenarnya adalah filter di dalam send_headers()fungsi. Anda dapat menggunakan ini untuk memodifikasi header sebelum dikirim ke browser dengan beberapa pengecualian. wp_headerstidak akan dapat melakukan apa pun jika itu adalah halaman cache statis yang berurusan dengan ...

Di sinilah send_headerskait berperan. Setelah wp_headersfilter, send_headers()fungsi memeriksa apakah Last-Modifiedtelah dikirim dengan akan memberi tahu kami jika halaman itu di-cache atau tidak dan kemudian memungkinkan kami menghubungkannya setelah caching, tipe konten, dll semuanya telah dikirim.

Jadi untuk contoh saya menggunakan X-UA-Compatible, sementara keduanya bekerja, saya cenderung menggunakan send_headers. Mengapa? Untuk satu jika Anda menambahkan keduanya, send_headersakan menang setiap waktu dan akan memastikan bahwa itu dimuat bahkan jika ditambahkan setelah halaman di-cache.

Meskipun menggunakan <meta>tag seperti halnya banyak kerangka kerja populer yang digunakan juga akan berfungsi untuk kompatibel dengan x-ua, itu tidak akan berfungsi di banyak browser kecuali dimuat segera setelah tag head pembuka. Ini disebabkan oleh berbagai alasan seperti jika pengaturan "intranet" disetel ke jaringan yang luas . Untuk alasan ini menggunakan metode php lebih aman. Namun, jika Anda menambahkan keduanya, tag meta akan menang (dengan asumsi itu termasuk cukup awal.

Sehubungan dengan X-UA-Compatiblekompatibilitas, saya berharap ini tidak akan relevan segera karena Microsoft akan menjatuhkan dukungan untuk versi IE yang lebih lama minggu depan!


Juga, saya menguji wp_headersfilter tanpa menggunakan is_admin()cek dan itu tidak akan mengubah admin_headers sehingga pemeriksaan tidak perlu.

Jika Anda memang perlu memodifikasi header admin untuk beberapa alasan, saya tahu Anda bisa melakukannya seperti ini, tetapi saya tidak yakin apakah itu akan berhasil sepanjang waktu ...

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

Jawaban Diperbarui berdasarkan saran Toscho untuk memeriksa admin:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
Bryan Willis
sumber
2
Anda harus tetap menggunakan is_admin() || add_action( … ), karena tidak perlu mencemari daftar panggilan balik terdaftar jika Anda tidak membutuhkannya.
fuxia
Poin menarik toscho ... Saya telah membuat situs wordpress selama sekitar sepuluh tahun sekarang dan saya belum pernah melihat format itu sebelum menggunakan simbol atau. Saya benar-benar mengajukan pertanyaan tentang bagaimana memformat kondisi dengan benar beberapa tahun yang lalu jika Anda ingin menambahkan pendekatan itu.
Bryan Willis
Toscho Saya memperbarui jawaban saya berdasarkan saran Anda. Apakah itu yang kamu maksud?
Bryan Willis
Yap, terlihat benar. :)
fuxia
" send_headersAkan menang setiap waktu dan akan memastikan bahwa itu dimuat bahkan jika ditambahkan setelah halaman di-cache" - Hanya untuk dicatat bahwa send_headerstidak berfungsi untuk mengalahkan cache halaman yang digunakan oleh plugin seperti W3 Total Cache dalam pengujian saya, atau caching statis yang secara efektif mem-bypass WordPress di tingkat server.
Nick