Como posso remover o URL do site de 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 gerados por wp_enqueue_scripts. Isso resultaria em todos os scripts e estilos sendo exibidos com um caminho relativo da raiz do domínio.

Imagino que exista um gancho que eu possa usar para filtrar isso, no entanto, não tenho certeza de qual deles nem como fazê-lo.

Ben
fonte

Respostas:

17

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

script_loader_srce style_loader_srcsã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 os URLs de script / estilo com uma barra dupla //(uma " referência de caminho de rede "). O que pode ser mais seguro (?): Ainda possui 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 );
}
chrisguitarguy
fonte
Excelente, apenas os ganchos que eu estava procurando.
Ben
Algum motivo específico para você excluir a seção de administrador aqui?
El Yobo
@ElYobo Provavelmente porque você não deseja alterar inesperadamente o conteúdo HTML que está prestes a editar e salvar. Observe também que você pode usar wp-cli para se localizar e substituir no banco de dados como em:wp search-replace 'http://mydomain.tld' 'https://mydomain.tld'
surfbuds
@surfbuds O problema não está relacionado ao conteúdo, está relacionado aos scripts / estilos carregados no código. Isso não afetará o conteúdo que você está prestes a editar e salvar, e fazer uma pesquisa e substituir no banco de dados também não resolverá o problema.
El Yobo
3

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

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 as folhas de estilo, depois carregue wp_enqueue_stylecom o filtro style_loader_src.

bueltge
fonte
3

Outra maneira, que eu acho que aprendi com o tema das raízes , talvez seja um pouco gueto, mas tenha um pouco de inteligência sobre quando usar URLs relativos (testados apenas no site de desenvolvimento). O benefício é que ele pode ser usado como filtro em muitos outros URLs incorporados que o WordPress usa. Este exemplo mostra apenas o estilo e o filtro de enfileiramento de scripts.

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
fonte