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

9

He visto wp_headers y send_headers ambos usados antes para la misma cosa y me pregunto cómo se supone que debes saber cuál usar y cuándo ...

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

Así se ve el ejemplo de send_headers :

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: En realidad, me di cuenta de que una conversación sobre esto más o menos Comencé con una pregunta similar hace un par de años ...

Además, ¿send_headers tiene que ver solo con el extremo frontal? He visto a wp_headers hacer cheques como este:

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_headers no tenga que hacer esos cheques ...

    
pregunta Bryan Willis 07.01.2016 - 19:32

1 respuesta

8

Ok, creo que lo descubrí ...

Los dos funcionan en su mayor parte como cabría esperar al enviar encabezados http / php al navegador. wp_headers es en realidad un filtro dentro de las funciones send_headers() . Puede usar esto para modificar los encabezados antes de que se envíen al navegador con alguna excepción. wp_headers no podrá hacer nada si se trata de una página estática almacenada en caché ...

Aquí es donde el gancho send_headers entra en juego. Después del filtro wp_headers , la función send_headers() comprueba si se ha enviado Last-Modified con si nos diría si la página se almacenó en caché o no y luego nos permite enlazarla después del almacenamiento en caché, el tipo de contenido, etc., todos se han enviado.

Entonces, para mi ejemplo usando X-UA-Compatible , mientras ambos funcionan, estoy inclinado a usar send_headers . ¿Por qué? Por una parte, si agregara ambos, send_headers ganaría cada vez y se aseguraría de que se cargara incluso si se agrega después de que la página se almacena en la caché.

Al utilizar una etiqueta <meta> 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 de apertura. Esto se debe a varias razones, por ejemplo, si la configuración "intranet" se establece en toda la red . Por esta razón, usar el método php es más seguro. Sin embargo, si agregara ambos, la etiqueta meta ganaría (asumiendo que se incluyó con suficiente antelación.

En lo que respecta a X-UA-Compatible compatible, espero que esto sea irrelevante pronto, ya que ¡Microsoft está eliminando el soporte para versiones anteriores de IE la próxima semana!

También, probé el filtro wp_headers sin usar la verificación is_admin() y no modificará los encabezados_administradores, por lo que la comprobación es innecesaria.

Si tuvo que modificar los encabezados de administrador por algún motivo, sé que puede hacerlo de esta manera, pero no estoy seguro de si funcionará 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 para verificar la administración:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
    
respondido por el Bryan Willis 08.01.2016 - 05:57

Lea otras preguntas en las etiquetas