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 ...


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.