Como posso remover o URL do site dos scripts e estilos enfileirados?

9

Estou lidando com um problema de SSL e gostaria de remover o domínio de todos os scripts e estilos que estão sendo enviados por meio de wp_enqueue_scripts. Isso resultaria em todos os scripts e estilos sendo exibidos com um caminho relativo da raiz do domínio.

Eu imagino que existe um gancho que eu possa usar para fileter isso, no entanto, eu não tenho certeza de qual deles, nem como fazê-lo.

    
por bhays 29.03.2012 / 06:51

3 respostas

15

Semelhante à resposta de Wyck, mas usando str_replace em vez de regex.

script_loader_src e style_loader_src são os ganchos que você deseja.

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

Você também pode iniciar as URLs de script / estilo com uma barra dupla // (a " referência de caminho da rede "). O que pode ser mais seguro (?): Ainda tem o caminho completo, mas usa o esquema / protocolo da página atual.

<?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 );
}
    
por chrisguitarguy 29.03.2012 / 19:22
3

Sim, acho que é possível. Veja no gancho do filtro script_loader_src ; lá pegue a string e você pode filtrar isso para suas necessidades.

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];
}
  • escrever no zero, não testado

O mesmo é possível para folhas de estilo, carga adicional via wp_enqueue_style com filtro style_loader_src .

    
por bueltge 29.03.2012 / 08:28
3

Outra maneira, que eu acho que recebi do tema roots , talvez um pouco ghetto, mas tenha algum tratamento inteligente sobre quando usar URLs relativas (testado apenas no site dev). O benefício é que ele pode ser usado como um filtro em muitos outros URLs embutidos que o WordPress usa. Este exemplo mostra apenas o estilo e o filtro de enfileiramento 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');
 }
    
por Wyck 29.03.2012 / 08:44