Funcție/filtru WP pentru modificarea headerelor HTTP?

16 iun. 2011, 18:40:21
Vizualizări: 18K
Voturi: 19

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?

0
Toate răspunsurile la întrebare 4
0
15

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.

13 feb. 2014 16:56:29
11
11

Ș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.

28 mar. 2013 00:10:27
Comentarii

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

pixeline pixeline
1 nov. 2014 20:26:31

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

Dominic P Dominic P
1 nov. 2014 20:39:22

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 pixeline
1 nov. 2014 20:43:48

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 Dominic P
2 nov. 2014 20:22:06

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

drzaus drzaus
11 dec. 2015 22:14:42

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

Dominic P Dominic P
12 dec. 2015 21:48:57

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 Willis
8 ian. 2016 07:11:28

@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 Dominic P
8 ian. 2016 09:08:34

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 Bryan Willis
8 ian. 2016 09:41:54

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 Bryan Willis
8 ian. 2016 09:44:41

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 Dominic P
8 ian. 2016 11:56:18
Arată celelalte 6 comentarii
2

Acțiunea init nu este locul potrivit pentru a face acest lucru. Un loc mai bun ar fi template_redirect, astfel încât să afectați doar vizualizarea publică a site-ului și nu zonele de administrare.

16 iun. 2011 18:54:03
Comentarii

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 mikkelbreum
16 iun. 2011 19:04:44

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 Otto
17 iun. 2011 21:49:11
0

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ă.

8 ian. 2016 09:51:17