Как удалить URL сайта из сценариев и стилей, поставленных в очередь?


9

Я имею дело с проблемой SSL, и я хотел бы удалить домен из всех сценариев и стилей, выводимых через wp_enqueue_scripts. Это приведет к тому, что все сценарии и стили будут отображаться с относительным путем от корня домена.

Я предполагаю, что есть ловушка, которую я могу использовать, чтобы фильтровать это, однако я не уверен, какой из них, и как это сделать.

Ответы:


17

Аналогично ответу Вика, но вместо регулярного выражения используется 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 );
}

Отлично, только крючки, которые я искал.
Бен

По какой-то конкретной причине вы исключаете раздел администратора здесь?
Эль Йобо

@ElYobo Возможно, потому что вы не хотите неожиданно изменять HTML-контент, который собираетесь редактировать и сохранять. Также обратите внимание, что вы можете использовать wp-cli для поиска и замены в базе данных, как в:wp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds

@surfbuds Проблема не связана с контентом, она связана со скриптами / стилями, загруженными в код. Это не повлияет на контент, который вы собираетесь редактировать и сохранить, а поиск и замена в базе данных также не решат проблему.
Эль Йобо

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 (тестировался только на Дев сайте). Преимущество заключается в том, что его можно использовать в качестве фильтра для многих других встроенных URL-адресов, используемых WordPress. В этом примере показаны только фильтр стиля и сценария постановки в очередь.

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');
 }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.