Wie kann ich die Site-URL aus in die Warteschlange gestellten Skripten und Stilen entfernen?

9

Ich habe es mit einem SSL-Problem zu tun und möchte die Domäne von allen Skripten und Stilen entfernen, die über wp_enqueue_scripts ausgegeben werden. Dies würde dazu führen, dass alle Skripte und Stile mit einem relativen Pfad vom Domänenstamm angezeigt werden.

Ich stelle mir vor, dass es einen Haken gibt, mit dem ich dies filtern kann. Ich bin mir jedoch nicht sicher, welcher und wie ich vorgehen soll.

Ben
quelle

Antworten:

17

Ähnlich wie Wycks Antwort, jedoch mit str_replace anstelle von Regex.

script_loader_srcund style_loader_srcsind die Haken, die Sie wollen.

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

Sie können die Skript- / Stil-URLs auch mit einem doppelten Schrägstrich //(einer " Netzwerkpfadreferenz ") starten . Was sicherer sein könnte (?): Hat immer noch den vollständigen Pfad, verwendet aber das Schema / Protokoll der aktuellen Seite.

<?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
quelle
Ausgezeichnet, nur die Haken, die ich gesucht habe.
Ben
Gibt es einen bestimmten Grund, warum Sie den Admin-Bereich hier ausschließen?
El Yobo
@ElYobo Wahrscheinlich, weil Sie HTML-Inhalte, die Sie bearbeiten und speichern möchten, nicht unerwartet ändern möchten. Beachten Sie auch, dass Sie wp-cli verwenden können, um in der Datenbank zu suchen und zu ersetzen, wie in:wp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds
@surfbuds Das Problem bezieht sich nicht auf den Inhalt, sondern auf die im Code geladenen Skripte / Stile. Der Inhalt, den Sie bearbeiten und speichern möchten, wird nicht beeinflusst. Wenn Sie in der Datenbank suchen und ersetzen, wird das Problem ebenfalls nicht gelöst.
El Yobo
3

Ja, ich denke es ist möglich. Siehe am Filterhaken script_loader_src; Dort erhalten Sie die Zeichenfolge und Sie können diese nach Ihren Anforderungen filtern.

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];
}
  • Schreiben Sie von Grund auf neu, nicht getestet

Gleiches gilt für Stylesheets, die über wp_enqueue_styleFilter geladen werden style_loader_src.

bueltge
quelle
3

Ein anderer Weg, von dem ich glaube, dass ich ihn vom Roots- Thema erhalten habe, vielleicht ein bisschen Ghetto, aber eine kluge Handhabung, wann relative URLs verwendet werden sollen (nur auf der Dev-Site getestet). Der Vorteil ist, dass es als Filter für viele andere integrierte URLs verwendet werden kann, die WordPress verwendet. Dieses Beispiel zeigt nur den Filter für Stil und Skript-Warteschlange.

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
quelle