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.
pixeline
Hmm, interesant. Poți verifica filtrul wp_headers aici.
Dominic P
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.
pixeline
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.
Dominic P
păi...dacă faptul că doar send_headers are o pagină în codex este vreun indiciu despre care să folosești...
drzaus
Ține minte totuși că echipa WordPress încearcă să facă tranziția de la codex către noua referință de cod
Dominic P
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 Willis
@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ă?
Dominic P
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ă.
Bryan Willis
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.
Bryan Willis
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.
Dominic P
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)
mikkelbreum
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
Otto
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ă.