Comment supprimer l'URL du site des scripts et styles mis en file d'attente?

9

Je suis confronté à un problème SSL et je voudrais supprimer le domaine de tous les scripts et styles générés via wp_enqueue_scripts. Cela entraînerait l'affichage de tous les scripts et styles avec un chemin relatif depuis la racine du domaine.

J'imagine qu'il y a un crochet que je peux utiliser pour filtrer cela, cependant, je ne sais pas lequel, ni comment s'y prendre.

Ben
la source

Réponses:

17

Similaire à la réponse de Wyck, mais en utilisant str_replace au lieu de regex.

script_loader_srcet style_loader_srcsont les crochets que vous voulez.

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

Vous pouvez également démarrer les URL de script / style avec une double barre oblique //(une " référence de chemin d'accès réseau "). Ce qui pourrait être plus sûr (?): A toujours le chemin complet, mais utilise le schéma / protocole de la page actuelle.

<?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
la source
Excellent, juste les crochets que je cherchais.
Ben
Une raison particulière pour laquelle vous excluez la section admin ici?
El Yobo
@ElYobo Probablement parce que vous ne voulez pas modifier de manière inattendue le contenu HTML que vous êtes sur le point de modifier et d'enregistrer. Notez également que vous pouvez utiliser wp-cli pour rechercher et remplacer dans la base de données comme dans:wp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds
@surfbuds Le problème n'est pas lié au contenu, il est lié aux scripts / styles chargés dans le code. Cela n'affectera pas le contenu que vous êtes sur le point de modifier et d'enregistrer et faire une recherche et remplacer dans la base de données ne résoudra pas non plus le problème.
El Yobo
3

Oui, je pense que c'est possible. Voir sur le crochet du filtre script_loader_src; obtenez la chaîne et vous pouvez la filtrer en fonction de vos besoins.

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];
}
  • écrire sur zéro, non testé

La même chose est possible pour les feuilles de style, ther charge via wp_enqueue_stylefiltre style_loader_src.

bueltge
la source
3

Une autre façon, que je pense avoir tirée du thème des racines , peut-être un peu ghetto mais a une gestion intelligente sur le moment d'utiliser les URL relatives (testé uniquement sur le site de développement). L'avantage est qu'il peut être utilisé comme filtre sur de nombreuses autres URL intégrées que WordPress utilise. Cet exemple montre uniquement le filtre de mise en file d'attente de style et de script.

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
la source