wp_headers vs send_headers. ¿Cuándo usar cada uno?

10

Lo he visto wp_headersy lo he send_headersusado antes para lo mismo y me pregunto cómo se supone que debes saber cuál usar y cuándo ...

En la send_headerspágina del códice hay un ejemplo de agregar la X-UA-Compatible: IE=edge,chrome=1compatibilidad con versiones anteriores de Internet Explorer ya que la metaetiqueta a menudo falla en los sitios de la intranet si se carga demasiado tarde .

Así es send_headerscomo se ve el ejemplo:

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

Sin embargo wp_headers, también puede hacer esto:

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;
}

Actualización: De hecho, me di cuenta de que una conversación sobre esto comenzó más o menos con una pregunta similar hace un par de años ...

Además, ¿send_headers tiene que ver solo con el front-end? He visto a wp_headers hacer verificaciones como esta:

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

y

if (!is_admin()) 

así que estoy pensando que tal vez send_headersno tenga que hacer esos controles ...

Bryan Willis
fuente
1
Hablando genéricamente, uno es una acción y el otro es un filtro. Las acciones son para hacer algo cuando ocurre un evento, y un filtro es para modificar algo antes de que se use.
Milo

Respuestas:

9

Ok, entonces creo que lo descubrí ...

Ambos funcionan en su mayor parte como es de esperar al enviar encabezados http / php al navegador. wp_headersen realidad es un filtro dentro de las send_headers()funciones. Puede usar esto para modificar los encabezados antes de enviarlos al navegador con alguna excepción. wp_headersno podrá hacer nada si se trata de una página estática en caché ...

Aquí es donde send_headersentra en juego el gancho. Después del wp_headersfiltro, la send_headers()función comprueba si Last-Modifiedse ha enviado con nos dirá si la página se ha almacenado en caché o no y luego nos permite conectarlo después de que se haya enviado el almacenamiento en caché, el tipo de contenido, etc.

Entonces, para mi ejemplo usando X-UA-Compatible, mientras ambos funcionan, me inclino a usar send_headers. ¿Por qué? Por un lado, si tuviera que agregar ambos, send_headersganaría cada vez y se aseguraría de que se cargara incluso si se agrega después de que la página se haya almacenado en caché.

Si bien el uso de una <meta>etiqueta como el uso de muchos frameworks populares también funcionaría para x-ua-compatible, no funcionará en muchos navegadores a menos que se cargue casi inmediatamente después de la etiqueta principal de apertura. Esto se debe a varias razones, como si la configuración de "intranet" está establecida en toda la red . Por esta razón, usar el método php es más seguro. Sin embargo, si tuviera que agregar ambos, la metaetiqueta ganaría (suponiendo que se incluyera lo suficientemente temprano).

Con respecto a la X-UA-Compatiblecompatibilidad, ¡espero que esto sea irrelevante pronto ya que Microsoft dejará de admitir versiones anteriores de IE la próxima semana!


Además, probé el wp_headersfiltro sin usar la is_admin()verificación y no modificará admin_headers, por lo que esa verificación es innecesaria.

Si necesita modificar los encabezados de administración por alguna razón, sé que puede hacerlo así, pero no estoy seguro de si funcionaría todo el tiempo ...

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

Respuesta actualizada basada en la sugerencia de Toscho de buscar administrador:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
Bryan Willis
fuente
2
Aún debe usarlo is_admin() || add_action( … ), ya que no es necesario contaminar la lista de devoluciones de llamada registradas si no lo necesita.
fuxia
Punto interesante toscho ... He estado haciendo sitios de wordpress durante unos diez años y nunca había visto ese formato antes de usar el símbolo o. Realmente hice una pregunta sobre cómo formatear correctamente las condiciones hace un par de años si tiene ganas de agregar ese enfoque.
Bryan Willis
Toscho He actualizado mi respuesta en función de su sugerencia. ¿Es eso lo que querías decir?
Bryan Willis
Sí, se ve bien. :)
fuxia
" send_headersGanaría cada vez y se aseguraría de que se cargara incluso si se agrega después de que la página se almacenó en caché" - Solo para tener en cuenta que send_headersno funciona para vencer el almacenamiento en caché de páginas utilizado por complementos como W3 Total Cache en mis pruebas, o cualquier almacenamiento en caché estático que efectivamente pasa por alto WordPress a nivel de servidor.
Nick