Jak mogę usunąć adres URL witryny z kolejkowanych skryptów i stylów?

9

Mam do czynienia z problemem SSL i chciałbym usunąć domenę ze wszystkich skryptów i stylów wyprowadzanych za pośrednictwem wp_enqueue_scripts. Spowodowałoby to wyświetlenie wszystkich skryptów i stylów ze ścieżką względną z katalogu głównego domeny.

Wyobrażam sobie, że istnieje haczyk, którego mogę użyć do filtrowania tego, jednak nie jestem pewien, który z nich, ani jak to zrobić.

Ben
źródło

Odpowiedzi:

17

Podobne do odpowiedzi Wycka, ale używając str_replace zamiast wyrażenia regularnego.

script_loader_srci style_loader_srcsą haki, które chcesz.

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

Możesz także uruchomić adres URL skryptu / stylu podwójnym ukośnikiem //(„ odniesienie do ścieżki sieciowej ”). Co może być bezpieczniejsze (?): Nadal ma pełną ścieżkę, ale używa schematu / protokołu bieżącej strony.

<?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 );
}
chrisguitarguy
źródło
Doskonale, tylko te haki, których szukałem.
Ben
Czy jest jakiś konkretny powód, dla którego wykluczasz tutaj sekcję administratora?
El Yobo,
@ElYobo Prawdopodobnie dlatego, że nie chcesz nieoczekiwanie zmieniać treści HTML, którą zamierzasz edytować i zapisywać. Pamiętaj też, że możesz użyć wp-cli, aby znaleźć i zamienić w bazie danych, jak w:wp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds
@surfbuds Problem nie jest związany z treścią, jest związany ze skryptami / stylami załadowanymi w kodzie. Nie wpłynie to na zawartość, którą zamierzasz edytować i zapisać, a wyszukiwanie i zamiana w bazie danych również nie rozwiąże problemu.
El Yobo
3

Tak, myślę, że to możliwe. Zobacz na haku filtra script_loader_src; tam ciąg i można go filtrować według własnych wymagań.

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];
}
  • pisz od zera, nie testowałem

To samo jest możliwe w przypadku arkuszy stylów, które można załadować za wp_enqueue_stylepomocą filtra style_loader_src.

bueltge
źródło
3

Innym sposobem, który myślę, że dostaliśmy od korzeni tematu, może trochę getta, ale ma pewne inteligentne prowadzenie na kiedy używać względnych adresów URL (testowane tylko na miejscu dev). Zaletą jest to, że można go używać jako filtru do wielu innych wbudowanych adresów URL używanych przez WordPress. Ten przykład pokazuje tylko filtr kolejki stylów i skryptów.

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');
 }
Wyck
źródło