在多站点网络中输出规范资源URL?

时间:2010-12-24 作者:Steve Clay

假设一个主题“foo”在整个网站网络上使用。在每个站点中,所有主题资源(.css, .js, 等)将具有不同的URL:

1 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@mrclay:

问得好。

WordPress Multisite有许多独立的站点,没有多少独立的站点。为了回答您的问题,WordPress Multisite是一个独立WordPress安装的集合,每个站点可能都有很大的不同,这与您的用例不同。因此,每个站点都有自己的主题,WordPress希望这些主题可以在单站点安装和多站点安装中使用。

WordPress开箱即用:决策,不是选项,而是随插件的变化而变化,而WordPress本可以选择做你想做的事情,WordPress的理念是为你做决定,而不是给你1000个你觉得需要理解的选项,然后让插件开发人员在需要时更改这些决策。

是的:中央资源=更好的加载时间

尽管如此,如果能够按照您的要求进行操作,那将是一件好事,因为它可以通过利用HTTP GET缓存来提高具有共同主题的多站点的平均加载时间。

无需“重写”URL开始,无需“重写”URL,只需确保样式表和其他您想要的资源是分配给主站点的主题的一部分,然后它们将位于您想要的URL。

为创建“挂钩”style.css

在WordPress中,您可以通过添加“挂钩”来更改开箱即用的决策;i、 e.对允许您修改值的函数的引用。一个这样的钩子是\'stylesheet_uri\' 它修改\'style.css\' 明确引用的文件。您可以将此代码复制到主题的functions.php 文件或您可以放入。您可能正在编写的WordPress插件的PHP文件。请注意,我将其编码为支持子域安装或子目录安装:

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))?$#",\'\\1\\3\',$url);
    }
  }
  return $url;
}
其他资源URL可能需要自己的挂钩,上面的代码只修改了主样式表URL;如果需要修改其他URL,则可能不需要使用其他挂钩。例如,您可能最终需要使用\'style_loader_src\' 和/或\'plugins_url\' 但我的测试系统没有设置足够的用例来验证是否需要:

add_filter(\'style_loader_src\',\'normalize_resource_url\');
add_filter(\'plugins_url\',\'normalize_resource_url\');
排队的脚本和样式使用base_url 属性,而排队的脚本和样式使用了一个名为base_url 全局变量的$wp_scripts$wp_styles, 如果开发人员未显式传递完整URL,则分别确定其位置。的属性base_url 对于脚本只设置一次,对于样式为空;前者是在实例化WP_Scripts 然后分配给全局变量的$wp_scripts.

设置base_url 早期的财产\'init\' 如果您在调用之前实例化并分配这些wp_enqueue_script()wp_enqueue_style() 然后可以设置base_url 属性,之后可以使用init 挂钩优先级为1 (1 优先级运行得很早,在大多数挂钩之前)。这是\'init\' 要实现这一点:

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;
}
或设置base_url 后期物业\'init\' 挂钩也可以使用非常高的数字作为\'init\' 钩子(例如100)
毕竟wp_enqueue_script()wp_enqueue_style() 已被调用(编号较高的优先级挂钩在编号较低的挂钩之后运行)。如果是这样,则不需要实例化全局变量,只需分配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;
}
可能需要调整\'init\' 如果插件冲突,则勾选优先级,无论您喜欢哪一个,我相信这两个(2)中的任何一个\'init\' 钩子对您很有用,但是如果您有使用冲突优先级的插件,那么您可能需要在第一种方法中将优先级降低到0或更低,或者在第二种方法中将优先级提高到100以上。同样,我没有足够的用例测试场景来100%验证,所以如果一些用例不适合您,请告诉我。

结束

相关推荐

导入到WordPress MultiSite时禁用HTML过滤

我正在迁移到WordPress多站点实例的许多站点都在帖子中嵌入了视频和iFrame。我宁愿禁用WordPress功能,在导入时去掉嵌入的内容,而不是将每篇文章转换为犹太教式的视频嵌入方式。编辑帖子时禁用剥离是as simple as disabling the kses filter. 不幸的是,我不知道导入帖子需要禁用什么。目前我怀疑wp\\u insert\\u post()方法,但没有缩小过滤器的范围。有什么想法吗?Update: 这是特定于WordPress Multisite的。导入到单个Wo