wp_headers vs send_headers. Quando usarli?


10

Ho visto wp_headersed send_headersusato entrambi prima per la stessa cosa e mi chiedo come si supponga di sapere quale usare e quando ...

Nella send_headerspagina del codice c'è un esempio di aggiunta della X-UA-Compatible: IE=edge,chrome=1compatibilità con le versioni precedenti di Internet Explorer poiché il meta tag spesso non riesce sui siti Intranet se caricato troppo tardi .

Ecco send_headerscome appare l' esempio:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
    header( 'X-UA-Compatible: IE=edge,chrome=1' );
}

Tuttavia wp_headerspuò anche fare questo:

apply_filters ( 'wp_headers', array $headers, WP $this )

add_filter( 'wp_headers', 'wpieeam_headers' );
function wpieeam_headers($headers) {
    if (!is_admin()) {
        $headers['X-UA-Compatible'] = 'IE=edge,chrome=1';    
    }
    return $headers;
}

Aggiornamento: In realtà ho appena notato che una conversazione su questo più o meno è iniziata su una domanda simile un paio di anni fa ...

Inoltre, send_headers ha a che fare solo con il front-end? Ho visto wp_headers fare controlli in questo modo:

if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )

e

if (!is_admin()) 

quindi sto pensando che forse send_headersnon è necessario effettuare quei controlli ...


1
In generale, uno è un'azione e l'altro è un filtro. Le azioni sono per fare qualcosa quando si verifica un evento e un filtro serve a modificare qualcosa prima che venga usato.
Milo,

Risposte:


9

Ok, quindi penso di averlo capito ...

Entrambi funzionano per la maggior parte come ci si aspetterebbe inviando le intestazioni http / php al browser. wp_headersè in realtà un filtro all'interno delle send_headers()funzioni. Puoi usarlo per modificare le intestazioni prima che vengano inviate al browser con qualche eccezione. wp_headersnon sarà in grado di fare nulla se si tratta di una pagina cache statica che ha a che fare con ...

Qui send_headersentra in gioco l' amo. Dopo il wp_headersfiltro, la send_headers()funzione controlla se Last-Modifiedè stata inviata con un messaggio ci dice se la pagina è stata memorizzata nella cache o meno e quindi ci consente di agganciarci dopo che sono stati inviati cache, tipo di contenuto, ecc.

Quindi, per il mio esempio usando X-UA-Compatible, mentre entrambi funzionano, sono propenso a usare send_headers. Perché? Per uno, se dovessi aggiungere entrambi, send_headersvinceresti ogni volta e assicureresti che fosse caricato anche se aggiunto dopo che la pagina era stata memorizzata nella cache.

Sebbene l'utilizzo di un <meta>tag come molti framework popolari utilizzino funzionerebbe anche con x-ua compatibile, non funzionerà in molti browser a meno che non venga caricato quasi immediatamente dopo il tag head di apertura. Ciò è causato da vari motivi, ad esempio se l' impostazione "Intranet" è impostata su tutta la rete . Per questo motivo l'uso del metodo php è più sicuro. Tuttavia, se dovessi aggiungere entrambi, il meta tag vincerebbe (supponendo che includesse abbastanza presto.

Per quanto riguarda la X-UA-Compatiblecompatibilità, spero che questo sarà irrilevante presto poiché Microsoft sta abbandonando il supporto per le versioni precedenti di IE la prossima settimana!


Inoltre, ho testato il wp_headersfiltro senza utilizzare il is_admin()controllo e non modificherà le intestazioni admin quindi non è necessario il controllo.

Se per qualche motivo hai dovuto modificare le intestazioni dell'amministratore, so che puoi farlo in questo modo, ma non sono sicuro che funzionerebbe tutto il tempo ...

function admin_add_my_header() {
    header('X-UA-Compatible: IE=edge,chrome=1');    
}
add_action( 'admin_init', 'admin_add_my_header', 1 );

Risposta aggiornata in base al suggerimento di Toscho di controllare l'amministratore:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);

2
Dovresti comunque usare is_admin() || add_action( … ), perché non è necessario inquinare l'elenco dei callback registrati se non ne hai bisogno.
fuxia

Interessante punto di vista ... Sto realizzando siti wordpress da circa dieci anni e non ho mai visto quel formato prima di usare il simbolo o. In realtà ho fatto una domanda su come formattare correttamente le condizioni un paio di anni fa se hai voglia di aggiungere questo approccio.
Bryan Willis,

Toscho Ho aggiornato la mia risposta in base al tuo suggerimento. È quello che volevi dire?
Bryan Willis,

Sì, sembra giusto. :)
fuxia

" send_headersVincerebbe ogni volta e si assicurerebbe che sia stato caricato anche se aggiunto dopo che la pagina è stata memorizzata nella cache" - Solo per notare che send_headersnon funziona per battere il caching delle pagine utilizzato dai plugin come W3 Total Cache nei miei test o qualsiasi cache statica che aggira efficacemente WordPress a livello di server.
Nick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.