wp_headers vs send_headers. Quand utiliser chacun?

9

J'ai vu wp_headers et send_headers déjà utilisés auparavant pour la même chose et je me demande comment vous supposez savoir lequel utiliser et quand ...

Sur la send_headers page du codex , vous trouverez un exemple d'ajout de X-UA-Compatible: IE=edge,chrome=1 pour la compatibilité descendante d'Internet Explorer. Dans la mesure où la balise META échoue souvent sur les sites intranet si elle est chargée trop tard .

Voici à quoi ressemble l'exemple de send_headers :

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

Cependant, wp_headers peut également le faire:

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

Mise à jour: je viens tout juste de remarquer que une conversation à ce sujet plus ou moins commencé sur une question similaire il y a quelques années ...

De plus, send_headers concerne-t-il uniquement le front-end? J'ai vu wp_headers faire des vérifications comme celle-ci:

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

et

if (!is_admin()) 

donc je pense que peut-être que send_headers n'aura pas à faire ces vérifications ...

    
posée Bryan Willis 07.01.2016 - 19:32

1 réponse

8

D'accord, je pense donc avoir compris ...

Ces deux solutions fonctionnent généralement comme vous le souhaiteriez en envoyant des en-têtes http / php au navigateur. wp_headers est en fait un filtre à l'intérieur des fonctions send_headers() . Vous pouvez l'utiliser pour modifier les en-têtes avant qu'ils ne soient envoyés au navigateur, à quelques exceptions près. wp_headers ne pourra rien faire s’il s’agit d’une page en cache statique qui traite de ...

C’est là que le send_headers hook entre en jeu. Après le filtre wp_headers , la fonction send_headers() vérifie si Last-Modified a été envoyé, nous dira si la page a été mise en cache ou non, puis nous permet de nous y accrocher après la mise en cache, le type de contenu, etc.

Donc, pour mon exemple utilisant X-UA-Compatible , alors qu'ils travaillent tous les deux, j'ai tendance à utiliser send_headers . Pourquoi? Si vous deviez ajouter ces deux éléments, send_headers l'emporterait à chaque fois et garantirait son chargement même s'il était ajouté après la mise en cache de la page.

L'utilisation d'une balise <meta> telle que de nombreux frameworks populaires utilisés fonctionne également pour x-ua-compatible, cela ne fonctionnera pas dans beaucoup de navigateurs à moins d'être chargé presque immédiatement après la balise head d'ouverture. Cela est dû à diverses raisons, par exemple si le paramètre "intranet" est défini sur l'ensemble du réseau . Pour cette raison, utiliser la méthode php est plus sûr. Toutefois, si vous deviez ajouter les deux, la balise méta gagnerait (en supposant qu’elle inclue suffisamment tôt.

En ce qui concerne X-UA-Compatible compatible, j'espère que cela ne sera bientôt plus pertinent car Microsoft abandonne le support pour les anciennes versions d'IE la semaine prochaine!

De plus, j'ai testé le filtre wp_headers sans utiliser la vérification is_admin() et il ne modifiera pas les admin_headers, de sorte que cette vérification est inutile.

Si vous aviez besoin de modifier les en-têtes de l'administrateur pour une raison quelconque, je sais que vous pouvez le faire comme ceci, mais je ne suis pas sûr que cela fonctionnerait tout le temps ...

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

Réponse mise à jour sur la base de la suggestion de Toscho de vérifier la présence d'administrateur:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
    
réponse donnée Bryan Willis 08.01.2016 - 05:57

Lire d'autres questions sur les étiquettes