エンキューされたスクリプトとスタイルからサイトURLを削除するにはどうすればよいですか?


9

私はSSLの問題を扱っており、wp_enqueue_scriptsを介して出力されているすべてのスクリプトとスタイルからドメインを削除したいと思います。これにより、すべてのスクリプトとスタイルがドメインルートからの相対パスで表示されます。

私はこれを提出するために使用できるフックがあると想像しますが、私はそれをどのように行うか、またどのようにそれを行うかわかりません。

回答:


17

Wyckの回答に似ていますが、正規表現の代わりにstr_replaceを使用します。

script_loader_srcそしてstyle_loader_srcあなたが望むフックです。

<?php
add_filter( 'script_loader_src', 'wpse47206_src' );
add_filter( 'style_loader_src', 'wpse47206_src' );
function wpse47206_src( $url )
{
    if( is_admin() ) return $url;
    return str_replace( site_url(), '', $url );
}

スクリプト/スタイルのURLをダブルスラッシュ//(「ネットワークパス参照」)で開始することもできます。どちらが安全かもしれません(?):完全なパスがまだありますが、現在のページのスキーム/プロトコルを使用します。

<?php
add_filter( 'script_loader_src', 'wpse47206_src' );
add_filter( 'style_loader_src', 'wpse47206_src' );
function wpse47206_src( $url )
{
    if( is_admin() ) return $url;
    // why pass by reference on count? last arg
    return str_replace( array( 'http:', 'https:' ), '', $url, $c=1 );
}

私が探していたフックだけです。
Ben

ここで管理セクションを除外している特別な理由はありますか?
El Yobo 2014

@ElYoboおそらく、編集して保存しようとしているHTMLコンテンツを予期せず変更したくないためです。また、あなたが見つけると同様に、データベースに置き換える行うには、WP-CLIを使用することができます注意してくださいwp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds

@surfbudsこの問題はコンテンツとは関係なく、コードに読み込まれたスクリプト/スタイルに関係しています。編集して保存しようとしているコンテンツには影響せず、データベースで検索と置換を行っても問題は解決しません。
El Yobo、2018年

3

はい、可能だと思います。フィルターフックを見てくださいscript_loader_src。そこで文字列を取得し、これを要件に応じてフィルタリングできます。

add_filter( 'script_loader_src', 'fb_filter_script_loader', 1 );
function fb_filter_script_loader( $src ) {

    // remove string-part "?ver="
    $src = explode( '?ver=', $src );

    return $src[0];
}
  • テストせずに書き込み

同じことがスタイルシートでも可能でありwp_enqueue_style、フィルタを介してロードされますstyle_loader_src


3

別の方法、私はルーツのテーマから得たと思います。多分少しゲットーですが、相対URLをいつ使用するかについていくつかのスマートな処理があります(開発サイトでのみテスト済み)。利点は、WordPressが使用する他の多くの組み込みURLのフィルターとして使用できることです。この例では、スタイルとスクリプトのエンキューフィルターのみを示しています。

function roots_root_relative_url($input) {
  $output = preg_replace_callback(
    '!(https?://[^/|"]+)([^"]+)?!',
    create_function(
      '$matches',
      // if full URL is site_url, return a slash for relative root
      'if (isset($matches[0]) && $matches[0] === site_url()) { return "/";' .
      // if domain is equal to site_url, then make URL relative
      '} elseif (isset($matches[0]) && strpos($matches[0], site_url()) !== false) { return $matches[2];' .
      // if domain is not equal to site_url, do not make external link relative
      '} else { return $matches[0]; };'
    ),
    $input
  );

  /**
   * Fixes an issue when the following is the case:
   * site_url() = http://yoursite.com/inc
   * home_url() = http://yoursite.com
   * WP_CONTENT_DIR = http://yoursite.com/content
   * http://codex.wordpress.org/Editing_wp-config.php#Moving_wp-content
   */
  $str = "/" . end(explode("/", content_url()));
  if (strpos($output, $str) !== false) {
    $arrResults = explode( $str, $output );
    $output = $str . $arrResults[1];
  }

  return $output;

if (!is_admin()) {
  add_filter('script_loader_src', 'roots_root_relative_url');
  add_filter('style_loader_src', 'roots_root_relative_url');
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.