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.
pixeline
Hmm, eso es interesante. Puedes revisar el filtro wp_headers aquí.
Dominic P
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.
pixeline
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.
Dominic P
bueno... si el hecho de que solo send_headers tenga una página en el codex es algún indicio de cuál usar...
drzaus
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
Dominic P
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 Willis
@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?
Dominic P
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é.
Bryan Willis
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.
Bryan Willis
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.
Dominic P
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)
mikkelbreum
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
Otto
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.