web-dev-qa-db-ja.com

wp_headersとsend_headers。いつ使うの?

私はwp_headerssend_headersが同じもののために以前に使われたのを見ました、そして、あなたがどれをいつ使うべきかを知っているべきだと思っています...

send_headers codexページ には、メタタグが ロードが遅すぎるとイントラネットサイトで失敗します _のため、Internet Explorerの下位互換性のためにX-UA-Compatible: IE=Edge,chrome=1を追加する例があります。

これがsend_headersの例のようなものです。

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

しかしwp_headersでもこれを行うことができます。

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

更新: 実際には、2年前に これに関する会話 が似たような質問から始まったことに気づいたばかりです...

また、send_headersはフロントエンドのみと関係がありますか?私はwp_headersがこのようなチェックをするのを見ました:

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

そして

if (!is_admin()) 

だから私はおそらくsend_headersがそれらのチェックをする必要はないと思っています...

9
Bryan Willis

わかりましたので、私はそれを理解したと思います...

これらはどちらも、http/phpヘッダーをブラウザーに送信することで期待どおりに機能します。 wp_headersは実際にはsend_headers()関数内のフィルターです。これを使用して、いくつかの例外を除いてブラウザーに送信される前にヘッダーを変更できます。 wp_headersは、静的なキャッシュページが処理している場合は何もできません...

これは、send_headersフックが作用する場所です。 wp_headersフィルターの後、send_headers()関数は、Last-Modifiedが送信されたかどうかを確認して、ページがキャッシュされたかどうかを通知し、キャッシュ後にコンテンツタイプ、などがすべて送信されました。

したがって、X-UA-Compatibleを使用する私の例では、両方とも機能しますが、send_headersを使用する傾向があります。 理由これらの両方を追加する場合、send_headersは毎回勝ち、ページがキャッシュされた後に追加された場合でも確実にロードされる。

多くの一般的なフレームワークが使用する のような<meta>タグを使用してもx-ua互換で動作しますが、ほとんどのブラウザでは、headタグを開いた直後にロードしない限り動作しません。これは、 "intranet"設定がネットワーク全体に設定されている場合 などのさまざまな理由により発生します。このため、phpメソッドを使用する方が安全です。ただし、両方を追加する場合は、メタタグが優先されます(それが十分早く含まれていたと仮定します)。

X-UA-Compatible互換性に関しては、来週のIEの古いバージョンでは Microsoftはサポートを終了しています なので、これがすぐに無関係になることを望んでいます!


また、is_admin()チェックを使用せずにwp_headersフィルターをテストしましたが、admin_headersは変更されないため、チェックは不要です。

何らかの理由でadminヘッダーを変更する必要がある場合、このようにできることはわかっていますが、常に機能するかどうかはわかりません...

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

管理者を確認するためのToschoの提案に基づいて回答を更新しました:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=Edge,chrome=1'); 
}, 1);
8
Bryan Willis