web-dev-qa-db-fra.com

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

Je traite d'un problème SSL et je souhaite 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 ceci, cependant, je ne sais pas lequel, ni comment s'y prendre.

9
Ben

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

script_loader_src et style_loader_src sont les crochets que vous souhaitez.

<?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 // (" référence du chemin 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 );
}
17
chrisguitarguy

Oui, je pense que c'est possible. Voir sur le crochet de 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 scratch, non testé

La même chose est possible pour les feuilles de style, la charge via wp_enqueue_style avec filterstyle_loader_src.

3
bueltge

Une autre façon, que je pense avoir tirée de roots theme, est peut-être un peu ghetto mais présente une gestion intelligente du moment où utiliser des URL relatives (testé uniquement sur le site de développement). L'avantage est qu'il peut être utilisé en tant que filtre sur de nombreuses autres URL intégrées à WordPress. Cet exemple montre uniquement le filtre de style et de file d'attente 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');
 }
3
Wyck