Funzione/filtro WP per modificare gli header HTTP?
Esiste una funzione, azione o filtro dedicato di WP da utilizzare per aggiungere/modificare gli header HTTP?
Per ora ho semplicemente collegato una chiamata PHP header() all'hook 'init' di WP in questo modo:
add_action('init', 'add_header_xua');
function add_header_xua(){
if(!is_admin()){
header('X-UA-Compatible: IE=edge,chrome=1');
}
}
Ma è questo il modo corretto per farlo?

Ecco il codice che ho utilizzato, basato sulla domanda originale e sulla risposta di Dominic P...
/*
* Modifica l'header HTTP
*/
function add_header_xua($headers) {
// var_dump($headers); #=> se vuoi vedere gli header correnti...
if (!is_admin()) {
$headers['X-UA-Compatible'] = 'IE=edge,chrome=1';
}
return $headers;
}
add_filter('wp_headers', 'add_header_xua');
Dopo aver aggiunto questo codice al tuo file functions.php, puoi verificare che funzioni eseguendo un test su http://web-sniffer.net/ per assicurarti che gli header HTTP siano effettivamente cambiati.

So che è passato un po' di tempo, ma se qualcun altro dovesse imbattersi in questo, ho trovato un hook di WordPress specifico per modificare gli header HTTP. L'hook è wp_headers
e viene chiamato nella classe wp.
Il primo argomento passato è un array di header con il nome dell'header come chiave. Il secondo argomento è un riferimento all'oggetto della classe wp.

C'è un altro hook: send_headers
. Non vedo nessun "wp_headers" nella lista degli hook.

Hmm, interessante. Puoi vedere il filtro wp_headers qui.

Penso (ma non ne sono sicuro) che ci siano hook "interni" (come wp_headers) e hook "pubblici" (come "send_headers"). Gli hook "interni" sono più soggetti a cambiamenti nelle versioni future. Gli hook "pubblici" sono considerati più "stabili". Ma potrei sbagliarmi, non trovo alcuna fonte che supporti questa sensazione che ho avuto da varie ricerche sugli hook.

È molto possibile, ma in questo caso sembra che i due hook svolgano semplicemente funzioni diverse. send_headers
è un'azione che viene attivata dopo l'invio degli header, mentre wp_headers
è un filtro sugli header che viene applicato prima che vengano inviati.

beh...se il fatto che solo send_headers
abbia una pagina sul codex è un'indicazione su quale usare...

Tieni presente però che il team di WordPress sta cercando di abbandonare il codex a favore del nuovo code reference

wp_headers
è un filtro all'interno della funzione send_headers(). Per questa specifica domanda ti consiglio di usare il filtro send_headers
poiché avrà la precedenza su wp_headers
. È importante notare che send_headers
viene eseguito dopo aver verificato l'intestazione "Last-Modified". Utilizzando send_headers
invece di wp_headers
possiamo assicurarci che il nostro tag X-UA-Compatible
venga inviato anche se la pagina è stata memorizzata nella cache staticamente, cosa che wp_headers
non sarebbe in grado di fare.

@Bryan, è una spiegazione interessante. Però sono curioso: se una pagina è memorizzata staticamente nella cache e viene servita prima che wp_headers
venga eseguito, come potrebbe funzionare send_headers
se viene eseguito dopo wp_headers
? L'esecuzione dell'intera funzione send_headers()
, insieme al resto di WordPress, non verrebbe saltata?

Ciao Dominic, se guardi all'interno della funzione send_headers() a questo punto puoi vedere dove viene introdotto wp_headers
e come la funzione prosegue controllando "Last-Modified" e poi l'azione send_headers do_action_ref_array( 'send_headers', array( &$this ) );. Quindi utilizzando l'azione ci stiamo agganciando dopo il controllo se la pagina era stata memorizzata nella cache.

Dominic, in realtà ho imparato tutto questo solo oggi dopo aver fatto una domanda quasi identica. send_headers
è in realtà il modo dimostrato anche nel codex.

Penso che potresti fraintendere cosa sta facendo la funzione send_headers()
nella parte del Last-Modified
. Tutto quel blocco di codice fa solo determinare se l'intestazione Last-Modified
debba essere rimossa e, in tal caso, la rimuove. Se viene utilizzata la cache completa della pagina, la funzione non verrà mai eseguita e nessun hook farà nulla. Immagino che alla fine non abbia molta importanza. Entrambi gli hook ti permetteranno di impostare un'intestazione. Come ha commentato Milo nella tua domanda collegata, uno è un filtro, l'altro è un'azione. È solo una questione di come preferisci programmare.

buon punto riguardo all'hook, ma a parte quello, chiamare la funzione 'raw' header() (usando l'hook corretto) è il modo giusto, o c'è un wrapper di wp che dovrebbe essere usato per questo? Chiamare header direttamente permette solo di aggiungere agli header, non di modificarli, come sarebbe possibile con un filter (ad esempio quando vuoi manipolare la classe del body)

header() è l'unico modo. Tuttavia, ha un secondo parametro che ti permette di sostituire gli header esistenti invece di aggiungerli. Vedi http://php.net/manual/en/function.header.php

send_headers
è il metodo preferito rispetto a wp_headers
per questa situazione, come dimostrato nel codex.
is_admin() || add_action('send_headers', function(){
header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);
Ecco la mia spiegazione del perché in una domanda simile.
