Funcție/filtru WP pentru modificarea headerelor HTTP?
Există vreo funcție, acțiune sau filtru dedicat în WP pe care să-l folosesc pentru a adăuga/modifica headerele HTTP?
Momentan folosesc un apel PHP header() prin hook-ul WP 'init' astfel:
add_action('init', 'add_header_xua');
function add_header_xua(){
if(!is_admin()){
header('X-UA-Compatible: IE=edge,chrome=1');
}
}
Dar este aceasta metoda corectă de a face acest lucru?
Iată codul pe care l-am folosit, bazat pe întrebarea inițială și pe răspunsul lui Dominic P...
/*
* Modifică antetul HTTP
*/
function add_header_xua($headers) {
// var_dump($headers); #=> dacă dorești să vezi anteturile curente...
if (!is_admin()) {
$headers['X-UA-Compatible'] = 'IE=edge,chrome=1';
}
return $headers;
}
add_filter('wp_headers', 'add_header_xua');
După ce ai adăugat acest cod în fișierul functions.php, poți verifica dacă funcționează rulând un test pe http://web-sniffer.net/ pentru a te asigura că anteturile HTTP s-au modificat într-adevăr.

Știu că a trecut ceva timp, dar dacă mai ajunge cineva pe aici, am găsit un hook WordPress special pentru modificarea headerelor HTTP. Hook-ul se numește wp_headers
și este apelat în clasa wp.
Primul argument transmis este un array de headere, cu numele headerului drept cheie. Al doilea argument este o referință la obiectul clasei wp.

Există un alt hook: send_headers
. Nu văd niciun "wp_headers" în lista de hook-uri.

Hmm, interesant. Poți verifica filtrul wp_headers aici.

Cred (dar nu sunt sigur) că există hook-uri "interne" (cum ar fi wp_headers) și hook-uri "publice" (cum ar fi "send_headers"). Hook-urile "interne" sunt mai predispuse să fie modificate în versiunile viitoare. Hook-urile "publice" sunt considerate mai "stabile". Dar s-ar putea să greșesc aici, nu găsesc nicio sursă care să susțină această impresie pe care o am din diverse cercetări făcute despre hook-uri.

Este foarte posibil, dar în acest caz se pare că cele două hook-uri efectuează funcții diferite. send_headers
este un acțiune care se declanșează după ce antetele sunt trimise, în timp ce wp_headers
este un filtru aplicat antetelor înainte ca acestea să fie trimise.

păi...dacă faptul că doar send_headers
are o pagină în codex este vreun indiciu despre care să folosești...

Ține minte totuși că echipa WordPress încearcă să facă tranziția de la codex către noua referință de cod

wp_headers
este un filtru din interiorul funcției send_headers(). Pentru această întrebare specifică, vei dori să folosești filtrul send_headers
deoarece acesta va avea prioritate față de wp_headers
. Este important de menționat că send_headers
rulează după verificarea header-ului "Last-Modified". Prin utilizarea send_headers
în loc de wp_headers
, ne asigurăm că tag-ul nostru X-UA-Compatible
va fi trimis chiar și dacă pagina a fost cache-uită static, caz în care wp_headers
nu ar fi capabil să facă acest lucru.

@Bryan, asta e o explicație interesantă. Sunt curios totuși: dacă o pagină este cache-uită static și este servită înainte ca wp_headers
să ruleze, cum ar putea funcționa send_headers
dacă rulează după wp_headers
? Nu ar trebui ca execuția întregii funcții send_headers()
, împreună cu restul WordPress, să fie omisă?

Hei Dominic, dacă te uiți în interiorul funcției send_headers() în acest punct, poți vedea unde este introdus wp_headers
și apoi cum funcția continuă prin verificarea "Last-Modified" și apoi send_headers do_action_ref_array( 'send_headers', array( &$this ) );. Deci, prin utilizarea acțiunii, ne conectăm după verificarea dacă pagina a fost cache-uită.

Dominic, de fapt am învățat toate acestea abia astăzi după ce am pus o întrebare aproape identică. send_headers
este de fapt metoda demonstrată și în codex.

Cred că s-ar putea să înțelegi greșit ce face funcția send_headers()
în partea cu Last-Modified
. Tot ce face acel bloc de cod este să determine dacă header-ul Last-Modified
ar trebui eliminat și, dacă da, îl elimină. Dacă este folosită caching-ul complet al paginii, funcția nu va rula niciodată și niciunul dintre hook-uri nu va face nimic. Presupun că în final nu contează prea mult. Ambele hook-uri îți vor permite să setezi un header. Cum a comentat Milo la întrebarea ta legată, unul este un filter, celălalt este o acțiune. Depinde cum preferi să codezi.

bun punct legat de hook, dar în afară de asta, este apelarea funcției 'raw' header() (folosind hook-ul corect) modul corect, sau există un wrapper wp care ar trebui folosit pentru asta? Apelarea directă a header permite doar adăugarea la headere, nu și modificarea lor, așa cum ar fi posibil cu un filter (ca atunci când vrei să manipulezi clasa body)

header() este singura metodă. Totuși, are un al doilea parametru care îți permite să înlocuiești headerele existente în loc să le adaugi. Vezi http://php.net/manual/en/function.header.php

send_headers
este metoda preferată în loc de wp_headers
pentru această situație, așa cum este demonstrat în codex.
is_admin() || add_action('send_headers', function(){
header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);
Aici este explicația mea pentru motivul într-o întrebare similară.
