Función/filtro de WordPress para modificar cabeceras HTTP

16 jun 2011, 18:40:21
Vistas: 18K
Votos: 19

¿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?

0
Todas las respuestas a la pregunta 4
0
15

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.

13 feb 2014 16:56:29
11
11

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.

28 mar 2013 00:10:27
Comentarios

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

pixeline pixeline
1 nov 2014 20:26:31

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

Dominic P Dominic P
1 nov 2014 20:39:22

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 pixeline
1 nov 2014 20:43:48

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 Dominic P
2 nov 2014 20:22:06

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 drzaus
11 dic 2015 22:14:42

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 Dominic P
12 dic 2015 21:48:57

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 Willis
8 ene 2016 07:11:28

@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 Dominic P
8 ene 2016 09:08:34

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 Bryan Willis
8 ene 2016 09:41:54

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 Bryan Willis
8 ene 2016 09:44:41

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 Dominic P
8 ene 2016 11:56:18
Mostrar los 6 comentarios restantes
2

La acción init no es el lugar adecuado para hacerlo. Un mejor lugar sería template_redirect, para que solo afectes la vista del frontend del sitio y no las áreas de administración.

16 jun 2011 18:54:03
Comentarios

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 mikkelbreum
16 jun 2011 19:04:44

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 Otto
17 jun 2011 21:49:11
0

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.

8 ene 2016 09:51:17