web-dev-qa-db-ja.com

WP スクリプトのバージョン管理はクロスサイトキャッシュを壊しますか?

次のコードを使用して、Google CDNからJQueryを読み込みます。

wp_deregister_script('jquery'); 
 wp_register_script(
    'jquery', // handle - WP uses this name to refer to script
    'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js',
     array(), // Array of handles representing scripts that this one depends on.
     false, // Version number - defaults to false.
     false // false = put script in header, true = put in footer
 );
wp_enqueue_script('jquery');

Firebugの中で私はwordpressがキャッシングを制御するためにURLに '?ver = 3.0.4'を追加するのを見ます。実際、WPがURLに何かを追加するのを止める方法はないようです - 私は自分自身で提供することができますwp_register_script()への呼び出しの文字列ですが、WPは、空白のままにするとデフォルトの 'ver = 3.0.4'が使用されます(または "false")。

追加されたバージョン文字列は、ユーザーのブラウザが別のWebサイトからダウンロードした可能性のあるファイルのキャッシュコピーを再利用するのを妨げると考えています。例えば。

  1. ユーザーがwww.example.comにアクセスしてajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.jsをロードすると、ブラウザのキャッシュに入ります。
  2. その後、ユーザーがajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js?ver=3.0.4をロードする私のサイトにアクセスします。
  3. URLが異なるため、ユーザーのブラウザはキャッシュコピーを使用しません。

クロスサイトキャッシングはGoogleのCDNを使用したい主な理由の1つなので、スクリプトを手動でロードする(理想的ではない)か、または[WP coreをハッキングする以外に解決策はありますか。

TIA

/ Eoin /

3
Eoin Kelly

$ verパラメータとしてnullを使用します。

wp_deregister_script( 'jquery' );
wp_register_script( 'jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, null);
wp_enqueue_script('jquery');

出力:

<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>
2
lemats

私はこのようなバージョンを削除し、複数のドメインに一致するように簡単に書き出すことができます

add_filter( 'script_loader_src', 'jquery_unversion' );

function jquery_unversion( $src ) {

    if( strpos( $src, 'ajax.googleapis.com' ) )
        $src = remove_query_arg( 'ver', $src );

    return $src;
}
7
Rarst

短い答え:いいえ.

私はwp-includes/scriptloader.phpのコードを調べましたが、バージョン番号の提供に関する「オプション」を示すものは何もありません。

ただし、これを明示的な<script>タグとしてフッター(またはヘッダー)に単純に入れることができます。もちろん、これはwp_register_script()の概念全体を完全に無効にしますが、それはWPのいくつかの「機能」にも当てはまります。 (正規表現を使ったショートコードの頭のおかしい/壊れた構文解析を始めないでください。)

1
Peter Rowell

あなたのテーマのfunctions.phpでこれを使ってください

function remove_wp_script_version( $src ){

    global $wp_version;

  $version_str = '?ver='.$wp_version;
  $version_str_offset = strlen( $src ) - strlen( $version_str );

  if( substr( $src, $version_str_offset ) == $version_str )
    return substr( $src, 0, $version_str_offset );
  else
    return $src;
}
add_filter( 'script_loader_src', 'remove_wp_script_version', 15, 1 ); 

必要に応じて、スタイルシートからバージョン管理を削除するために別のフィルタを追加することもできます。

add_filter( 'style_loader_src', 'remove_script_version', 15, 1 );

なぜ彼らがこれを核にしているのか理解できません。それは外部のスクリプトのキャッシュをめちゃくちゃにするだけでなく、それはまたそのサイトに関する不必要な情報を配ります。上記のフィルタを使用し、必要に応じて独自のバージョン番号をカスタムスクリプトに追加します。

1
user2737

ご回答ありがとうございました。最後に、これは私が使用したコードです(将来の検索者のためにここに投稿します):

function control_wp_url_versioning($src)
{
    // $src is the URL that WP has generated for the script or stlye you added 
    // with wp_enqueue_script() or wp_enqueue_style(). This function currently 
    // removes the version string off *all* scripts. If you need to do something 
    // different, then you should do it here.
    $src = remove_query_arg( 'ver', $src );
    return $src;
}

// The default script priority is 10. We load these filters with priority 15 to 
// ensure they are run *after* all the default filters have run. 
add_filter('script_loader_src', 'control_wp_url_versioning', 15); 
add_filter('style_loader_src', 'control_wp_url_versioning', 15); 
1
Eoin Kelly

GoogleのCDNからjQueryを含めるには、noConflictモードの問題を処理するための追加のコードも必要です。

自分でロールするのではなく、適切に処理するように設計されたプラグインを使用することをお勧めします。これはとてもうまくいきます: http://wordpress.org/extend/plugins/use-google-libraries/

簡単な面倒な設定ただ有効にするだけで、関連するすべてのライブラリがGoogleのCDNバージョンに置き換えられます。

1
Otto