Funzione/filtro WP per modificare gli header HTTP?

16 giu 2011, 18:40:21
Visualizzazioni: 18K
Voti: 19

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?

0
Tutte le risposte alla domanda 4
0
15

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.

13 feb 2014 16:56:29
11
11

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.

28 mar 2013 00:10:27
Commenti

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

pixeline pixeline
1 nov 2014 20:26:31

Hmm, interessante. Puoi vedere il filtro wp_headers qui.

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

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.

pixeline pixeline
1 nov 2014 20:43:48

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

Dominic P Dominic P
2 nov 2014 20:22:06

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

drzaus drzaus
11 dic 2015 22:14:42

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

Dominic P Dominic P
12 dic 2015 21:48:57

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 Willis Bryan Willis
8 gen 2016 07:11:28

@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?

Dominic P Dominic P
8 gen 2016 09:08:34

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.

Bryan Willis Bryan Willis
8 gen 2016 09:41:54

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.

Bryan Willis Bryan Willis
8 gen 2016 09:44:41

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.

Dominic P Dominic P
8 gen 2016 11:56:18
Mostra i restanti 6 commenti
2

L'azione init non è il posto giusto per farlo. Un punto migliore sarebbe template_redirect, in modo da influenzare solo la visualizzazione front-end del sito e non le aree di amministrazione.

16 giu 2011 18:54:03
Commenti

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)

mikkelbreum mikkelbreum
16 giu 2011 19:04:44

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

Otto Otto
17 giu 2011 21:49:11
0

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.

8 gen 2016 09:51:17