wp_headers vs send_headers. Quando usar cada um?

10

Eu já vi wp_headerse send_headersusei antes para a mesma coisa e estou me perguntando como você deve saber qual usar e quando ...

Na send_headerspágina do codex, há um exemplo de adição X-UA-Compatible: IE=edge,chrome=1de compatibilidade com versões anteriores do Internet Explorer, pois a metatag frequentemente falha nos sites da intranet, se carregada tarde demais .

É assim que o send_headersexemplo se parece:

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

No entanto, wp_headerstambém pode fazer isso:

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

Atualização: Na verdade, acabei de perceber que uma conversa sobre isso começou mais ou menos sobre uma pergunta semelhante há alguns anos ...

Além disso, send_headers tem a ver apenas com o front end? Eu já vi wp_headers fazer verificações como esta:

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

e

if (!is_admin()) 

então estou pensando que talvez send_headersnão precise fazer essas verificações ...

Bryan Willis
fonte
11
Genericamente falando, um é uma ação e o outro é um filtro. Ações são para fazer algo quando um evento ocorre, e um filtro é para modificar algo antes de ser usado.
Milo

Respostas:

9

Ok, então eu acho que descobri ...

Ambos funcionam na maior parte do esperado, enviando cabeçalhos http / php para o navegador. wp_headersé na verdade um filtro dentro das send_headers()funções. Você pode usá-lo para modificar os cabeçalhos antes de serem enviados ao navegador, com alguma exceção. wp_headersnão poderá fazer nada se estiver lidando com uma página em cache estática ...

É aqui que o send_headersgancho entra em jogo. Após o wp_headersfiltro, a send_headers()função que verifica se Last-Modifiedfoi enviada nos informaria se a página estava em cache ou não e, em seguida, permite que ela seja conectada após o envio do cache, do tipo de conteúdo, etc.

Portanto, no meu exemplo X-UA-Compatible, enquanto ambos trabalham, estou inclinado a usar send_headers. Por quê? Por um lado, se você adicionasse os dois, send_headersvenceria todas as vezes e garantiria que ele fosse carregado mesmo se adicionado após o cache da página.

Embora o uso de uma <meta>tag como muitas estruturas populares também funcione para x-ua-compatible, ele não funcionará em muitos navegadores, a menos que seja carregado quase imediatamente após a tag de abertura. Isso é causado por vários motivos, como se a configuração "intranet" fosse definida em toda a rede . Por esse motivo, o uso do método php é mais seguro. No entanto, se você adicionar os dois, a meta tag vencerá (assumindo que foi incluída com antecedência suficiente).

Em relação aos X-UA-Compatiblecompatíveis, espero que isso seja irrelevante em breve, pois a Microsoft está deixando de lado o suporte para versões mais antigas do IE na próxima semana!


Além disso, testei o wp_headersfiltro sem usar a is_admin()verificação e ele não modificará os admin_headers, para que a verificação seja desnecessária.

Se você precisou modificar os cabeçalhos do administrador por algum motivo, sei que pode fazê-lo assim, mas não tenho certeza se funcionaria o tempo todo ...

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

Resposta atualizada com base na sugestão de Toscho de verificar o administrador:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
Bryan Willis
fonte
2
Você ainda deve usar is_admin() || add_action( … ), porque não há necessidade de poluir a lista de retornos de chamada registrados, se você não precisar.
fuxia
Interessante ponto ... Eu estou criando sites wordpress há cerca de dez anos e nunca vi esse formato antes de usar o símbolo ou. Na verdade, fiz uma pergunta sobre como formatar corretamente as condições há alguns anos, se você quiser adicionar essa abordagem.
11556 Bryan Willis
Toscho Atualizei minha resposta com base em sua sugestão. É isso que você quis dizer?
9788 Bryan Willis
Sim, parece certo. :)
fuxia
send_headersVenceria todas as vezes e garantiria que ele fosse carregado mesmo se adicionado depois que a página fosse armazenada em cache” - Apenas para observar que send_headersnão funciona para superar o cache de páginas usado por plugins como W3 Total Cache nos meus testes ou qualquer cache estático que efetivamente ignora o WordPress no nível do servidor.
Nick