问题描述
我正在处理一个 SSL 问题,我想从所有脚本和样式中删除域,通过 wp_enqueue_scripts 输出。这将导致所有脚本和样式都显示与域根的相对路径。
我想象有一个钩子,我可以用来诋毁这个,但是,我不知道哪一个,也不知道该怎么做。
最佳解决思路
与 Wyck 的答案相似,但使用 str_replace 而不是正则表达式。
script_loader_src
和 style_loader_src
是你想要的钩子。
<?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 );
}
您也可以使用双斜线//
(「network path reference」) 启动脚本/样式 URL 。哪个可能更安全 (?):仍然有完整的路径,但使用当前页面的方案/协议。
<?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 );
}
次佳解决思路
是的,我认为它的可能。见过滤钩 script_loader_src
; 有字符串,您可以根据您的要求过滤。
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];
}
-
写在头上,没有测试
样式表也是如此,通过带有过滤器 style_loader_src
的 wp_enqueue_style
进行加载。
第三种解决思路
另一种方式,我认为从根主题,可能有点贫民窟,但有一些聪明的处理,何时使用相对的 urls(只测试在开发网站) 。它的好处是可以用作 WordPress 使用的许多其他内置 URL 的过滤器。此示例仅显示样式和脚本入队过滤器。
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');
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。