Como gerar URLs de recursos canônicos em uma rede multisite?

4

Digamos que um tema "foo" seja usado em uma rede de sites. Em cada site, todos os recursos do tema ( .css , .js , etc.) terão URLs distintos:

Eu quero que todos sejam:

Qual é a melhor maneira de fazer isso? Posso corrigir os URLs diretamente no tema, mas como faço para normalizar os URLs em scripts / folhas de estilo enfileirados?

  

> Como : Qual é o benefício de ter expressões como get_bloginfo('template_url') que criam URLs que diferem entre sites?

    
por Steve Clay 24.12.2010 / 16:33

1 resposta

4

Oi @mrclay:

Boas perguntas.

O WordPress Multisite é em muitos Sites Independentes , não em muitos Dependentes Sites

Para responder a sua pergunta, o multisite do WordPress foi projetado para ser uma coleção de instalações independentes do WordPress coletadas em uma, onde cada site provavelmente será muito diferente, ao contrário do seu caso de uso. Assim, cada site tem seu próprio tema e o WordPress deseja que esses temas funcionem em instalações de sites únicos e sites em uma instalação multisite.

WordPress Out-of-the-Box: Decisões, não opções, mas altere com plug-ins

Embora o WordPress possa ter tido a opção de fazer o que você quer construir, a filosofia do WordPress é tomar decisões para você, em vez de dar a você milhares de opções que você precisa entender e deixar que os desenvolvedores de plugins mudem decisões, se necessário.

Sim: Recursos centrais = melhores tempos de carga

Ainda assim, seria bom poder fazer o que você está perguntando, pois isso aumentaria o tempo médio de carregamento, aproveitando o cache HTTP GET para multisites com temas comuns.

Não é necessário "reescrever" URLs

Para começar, não há necessidade de "reescrever" os URLs, apenas certifique-se de que a folha de estilo e outros recursos desejados façam parte do tema atribuído ao site principal e, em seguida, eles estarão localizados nos URLs desejados.

Criando o "Gancho" para style.css

No WordPress, você altera as decisões prontas adicionando "ganchos" ; isto é, referências a funções que permitem modificar valores. Um desses ganchos é 'stylesheet_uri' , que modifica a URL para o arquivo 'style.css' que você referenciou explicitamente. Você pode copiar este código para o arquivo functions.php do seu tema ou pode colocar no arquivo .PHP de um plug-in do WordPress que possa estar escrevendo. Observe que codifiquei isso para suportar instalações de subdomínio ou instalações de subdiretório:

function normalize_resource_url($url) {
  if (MULTISITE) {
    $site_url = get_site_url(BLOG_ID_CURRENT_SITE); 
    if (SUBDOMAIN_INSTALL) {
      $url = preg_replace("#^(https?://[^/]+)(/wp-.*\.(css|js))?$#","{$site_url}\2",$url);
    } else {
      $url = preg_replace("#^({$site_url})(/[^/]+)(/wp-.*\.(css|js))?$#",'',$url);
    }
  }
  return $url;
}

Outros URLs de recursos podem precisar de seus próprios ganchos

O código acima modifica apenas o URL da folha de estilo principal; Se você precisar de outros URLs modificados, você não pode usar outros ganchos. Por exemplo, você pode acabar precisando usar 'style_loader_src' e / ou 'plugins_url' também, mas não tive meu sistema de teste configurado com casos de uso suficientes para verificar se é necessário ou não:

add_filter('style_loader_src','normalize_resource_url');
add_filter('plugins_url','normalize_resource_url');

Scripts e estilos de enfileiramento usam uma base_url Property

E os scripts e estilos enfileirados usam uma propriedade chamada base_url das variáveis globais $wp_scripts e $wp_styles , respectivamente, para determinar sua localização se uma URL completa não for passada explicitamente pelo desenvolvedor. A propriedade de base_url é definida apenas uma vez para scripts e deixada em branco para estilos; o primeiro é definido na instanciação de um objeto WP_Scripts que é então atribuído à variável global $wp_scripts .

Defina a propriedade base_url em um início de 'init' Hook

Se você instanciar e atribuir essas informações antes de qualquer chamada para wp_enqueue_script() ou wp_enqueue_style() , poderá definir a propriedade base_url imediatamente após a qual você pode fazer com um gancho init com prioridade de 1 < em>> ( 1 prioridades são executadas muito cedo, antes da maioria dos ganchos) . Aqui está o gancho 'init' para realizar isso:

add_filter('init','normalize_base_urls',1);
function normalize_base_urls() {
  $GLOBALS['wp_scripts'] = new WP_Scripts();
  $GLOBALS['wp_styles'] = new WP_Styles();

  $base_url = normalize_resource_url(get_site_url(BLOG_ID_CURRENT_SITE));

  $GLOBALS['wp_scripts']->base_url = $base_url;
  $GLOBALS['wp_styles']->base_url = $base_url;
}

Ou defina a propriedade base_url em um% atrasado de'init' Hook

Também é possível usar um número muito alto para a prioridade do 'init' hook (como 100) depois que wp_enqueue_script() ou wp_enqueue_style() foram chamados por ( ganchos de prioridade numerados mais altos são executados depois daqueles com números menores) . Nesse caso, você não precisa instanciar os globais, apenas atribua a propriedade base_url :

add_filter('init','normalize_base_urls',100);
function normalize_base_urls() {
  $base_url = normalize_resource_url(get_site_url(BLOG_ID_CURRENT_SITE));
  $GLOBALS['wp_scripts']->base_url = $base_url;
  $GLOBALS['wp_styles']->base_url = $base_url;
}

Pode ser necessário ajustar as prioridades de% de 'init' se os plug-ins conflitantes

Seja qual for sua preferência, acredito que um desses dois (2) 'init' hooks funcionará para você, mas se você tiver plug-ins que usam prioridades conflitantes, talvez seja necessário reduzir o número de prioridade para 0 ou menos com a primeira abordagem ou aumente a prioridade acima de 100 para a segunda abordagem. Novamente, não tive cenários de teste de caso de uso suficientes para 100% de verificação, portanto, deixe-me saber se alguns casos de uso não estão funcionando para você.

    
por MikeSchinkel 25.12.2010 / 02:13