¿Generando URL de recursos canónicos a través de una red de sitios múltiples?

4

Say a theme "foo" se usa en una red de sitios. En cada sitio, todos los recursos de temas ( .css , .js , etc.) tendrán URL distintas:

Quiero que estos sean todos:

¿Cuál es la mejor manera de hacer esto? Puedo corregir las URL directamente en el tema, pero ¿cómo normalizo las URL en secuencias de estilo / hojas de estilo en cola?

  

Aparte : ¿Cuál es la ventaja de tener expresiones como get_bloginfo('template_url') que crean URL que difieren entre los sitios?

    
pregunta Steve Clay 24.12.2010 - 16:33

1 respuesta

4

Hola @mrclay:

Buenas preguntas.

WordPress Multisite es muchos sitios independientes , no muchos sitios dependientes

Para responder a tu comentario, WordPress multisite se diseñó para que fuera una colección de instalaciones independientes de WordPress recopiladas en uno en el que es probable que cada sitio sea muy diferente, a diferencia de tu caso de uso. Por lo tanto, cada sitio tiene su propio tema y WordPress quiere que esos temas funcionen tanto en instalaciones individuales como en sitios en una instalación de varios sitios.

WordPress Out-of-the-box: Decisiones, no opciones, pero cambio con complementos

Si bien WordPress podría haber tenido una opción para hacer lo que usted desea en la filosofía de WordPress es tomar decisiones por usted en lugar de darle mil opciones que sentirá que necesita comprender y luego dejar que los desarrolladores de complementos las cambien. decisiones si es necesario.

Sí: Recursos centrales = Mejores tiempos de carga

Aún así, sería bueno poder hacer lo que estás pidiendo, ya que mejoraría los tiempos de carga promedio al aprovechar el almacenamiento en caché HTTP GET para varios sitios con temas comunes.

No es necesario "reescribir" las URL

Para comenzar, no es necesario "reescribir" las URL, solo asegúrese de que la hoja de estilo y otros recursos que desee sean parte del tema asignado al sitio principal y luego se ubicarán en las URL que desee.

Creando el "Hook" para style.css

En WordPress cambias las decisiones listas para usar agregando "ganchos" ; es decir, referencias a funciones que te permitirán modificar valores. Uno de estos enlaces es 'stylesheet_uri' , que modifica la URL del archivo 'style.css' al que hizo referencia explícitamente. Puede copiar este código en el archivo functions.php de su tema o puede colocarlo en el archivo .PHP de un complemento de WordPress que podría estar escribiendo. Tenga en cuenta que codifiqué esto para admitir las instalaciones de subdominios o las instalaciones de subdirectorios:

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

Otras URL de recursos pueden necesitar sus propios enlaces

El código anterior solo modifica la URL principal de la hoja de estilo; Si necesita modificar otras URL, puede que no use otros ganchos. Por ejemplo, puedes terminar necesitando usar 'style_loader_src' y / o 'plugins_url' también, pero no tuve mi sistema de prueba configurado con suficientes casos de uso para verificar si es necesario o no:

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

Los estilos y secuencias de comandos en cola utilizan una propiedad base_url

Y resulta que las secuencias de comandos y los estilos en cola utilizan una propiedad llamada base_url de las variables globales $wp_scripts y $wp_styles , respectivamente, para determinar su ubicación si el desarrollador no pasa una URL completa explícitamente. La propiedad de base_url solo se establece una vez para los scripts y se deja en blanco para los estilos; el primero se establece en la instanciación de un objeto WP_Scripts que luego se asigna a la variable global $wp_scripts .

Establezca la propiedad base_url en un principio 'init' Hook

Si crea una instancia y los asigna antes de cualquier llamada a wp_enqueue_script() o wp_enqueue_style() , puede establecer la propiedad base_url inmediatamente después de lo cual puede hacer con un gancho init con una prioridad de 1 < em> (las prioridades 1 se ejecutan muy temprano, antes de la mayoría de los ganchos) . Aquí está el gancho 'init' para lograr esto:

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

O establezca la propiedad base_url en un 'init' gancho tardío

También es posible usar un número muy alto para la prioridad para 'init' hook (como 100) después de que todos los elementos wp_enqueue_script() o wp_enqueue_style() hayan sido llamados por ( los enganches de prioridad numerados más altos se ejecutan después de aquellos con números más bajos) . Si no es así, no necesita crear una instancia de las variables globales, simplemente asigne la propiedad 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;
}

Es posible que deba ajustar 'init' enganche las prioridades si hay complementos en conflicto

Cualquiera que sea su preferencia, creo que cualquiera de esos dos (2) 'init' ganchos funcionarán para usted, pero si tiene complementos que usan prioridades en conflicto, es posible que deba reducir el número de prioridad a 0 o menos con el primer enfoque. , o elevar la prioridad por encima de 100 para el segundo enfoque. Nuevamente, no tuve suficientes escenarios de prueba de casos de uso para verificar al 100%, así que avíseme si algunos casos de uso no están funcionando para usted.

    
respondido por el MikeSchinkel 25.12.2010 - 02:13

Lea otras preguntas en las etiquetas