Función/filtro de WordPress para modificar cabeceras HTTP
¿Existe alguna función, acción o filtro dedicado en WordPress para agregar o modificar las cabeceras HTTP?
Actualmente estoy enganchando una llamada PHP header() al hook 'init' de WP de esta manera:
add_action('init', 'add_header_xua');
function add_header_xua(){
if(!is_admin()){
header('X-UA-Compatible: IE=edge,chrome=1');
}
}
Pero, ¿es esta la forma correcta de hacerlo?

Aquí está el código que he utilizado, basado en la pregunta original y en la respuesta de Dominic P...
/*
* Modificar encabezado HTTP
*/
function add_header_xua($headers) {
// var_dump($headers); #=> si quieres ver los encabezados actuales...
if (!is_admin()) {
$headers['X-UA-Compatible'] = 'IE=edge,chrome=1';
}
return $headers;
}
add_filter('wp_headers', 'add_header_xua');
Una vez que hayas añadido ese código a tu archivo functions.php, puedes comprobar que funciona realizando una prueba en http://web-sniffer.net/ para asegurarte de que los encabezados HTTP han cambiado correctamente.

Hace tiempo que no lo actualizo, pero si alguien más se topa con esto, encontré un hook de WordPress específico para modificar cabeceras HTTP. El hook es wp_headers
y se llama en la clase wp.
El primer argumento que recibe es un array de cabeceras donde el nombre de la cabecera es la clave. El segundo argumento es una referencia al objeto de la clase wp.

Hay otro hook: send_headers
. No veo ningún "wp_headers" en la lista de hooks.

Hmm, eso es interesante. Puedes revisar el filtro wp_headers aquí.

Creo (pero no estoy seguro) que hay hooks "internos" (como wp_headers) y hooks "públicos" (como "send_headers"). Los hooks "internos" son más propensos a cambiar en futuras versiones. Los hooks "públicos" se consideran más "estables". Pero puedo estar equivocado aquí, no encuentro ninguna fuente que respalde esta sensación que tengo de varias investigaciones que he hecho sobre hooks.

Eso es muy posible, pero en este caso parece que los dos hooks simplemente realizan funciones diferentes. send_headers
es una acción que se ejecuta después de enviar las cabeceras, mientras que wp_headers
es un filtro sobre las cabeceras que se aplica antes de enviarlas.

bueno... si el hecho de que solo send_headers
tenga una página en el codex es algún indicio de cuál usar...

Ten en cuenta que el equipo de WordPress está intentando hacer la transición alejándose del codex hacia la nueva referencia de código

wp_headers
es un filtro dentro de la función send_headers(). Para este caso particular, querrás usar el filtro send_headers
ya que tendrá prioridad sobre wp_headers
. Es importante notar que send_headers
se ejecuta después de verificar el encabezado "Last-Modified". Al usar send_headers
en lugar de wp_headers
nos aseguramos que nuestra etiqueta X-UA-Compatible
se enviará incluso si la página ha sido almacenada en caché estática, donde wp_headers
no podría hacerlo.

@Bryan, esa es una explicación interesante. Sin embargo, tengo curiosidad: si una página está almacenada en caché estática y se sirve antes de que wp_headers
se ejecute, ¿cómo podría funcionar send_headers
si se ejecuta después de wp_headers
? ¿No se saltaría la ejecución de toda la función send_headers()
, junto con el resto de WordPress?

Hola Dominic, si revisas dentro de la función send_headers() en este punto puedes ver dónde se introduce wp_headers
y después cómo la función continúa verificando "Last-Modified" y luego la acción send_headers do_action_ref_array( 'send_headers', array( &$this ) );. Así que al usar la acción nos estamos enganchando después de verificar si la página estaba en caché.

Dominic, en realidad aprendí todo esto hoy después de hacer una pregunta casi idéntica. send_headers
es en realidad la forma en que también lo hace el codex en su demostración.

Creo que podrías estar malinterpretando lo que hace la función send_headers()
en la parte de Last-Modified
. Todo lo que hace ese bloque de código es determinar si se debe eliminar el encabezado Last-Modified
y, de ser así, lo elimina. Si se está usando caché de página completa, la función nunca se ejecutará y ningún hook hará nada. Supongo que al final no importa realmente. Ambos hooks te permitirán establecer un encabezado. Como comentó Milo en tu pregunta enlazada, uno es un filtro y el otro una acción. Simplemente es cuestión de cómo prefieras codificar.

buen punto respecto al hook, pero aparte de eso, ¿llamar a la función 'raw' header() (usando el hook correcto) es la forma correcta, o hay un wrapper de wp que debería usarse para esto? Llamar a header directamente solo permite agregar a los encabezados, no modificarlos, como sería posible con un filtro (como cuando quieres manipular la clase del body)

header() es la única forma. Sin embargo, tiene un segundo parámetro que te permitirá reemplazar encabezados existentes en lugar de agregarlos. Ver http://php.net/manual/en/function.header.php

send_headers
es el método preferido sobre wp_headers
para esta situación como se demuestra en el codex.
is_admin() || add_action('send_headers', function(){
header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);
Aquí está mi explicación del porqué en una pregunta similar.
