通常,在 WordPress 的 Plugin 编写中,如果涉及到静态文件的引用,我通常会这样写
echo '<link rel="stylesheet" href="'.WP_PLUGIN_URL.'/myplugin/somecss.css" type="text/css" media="screen">'."\n";
如果你在 General Settings 中的 WordPress Address (URL) 里设置的是一个 HTTP 地址,如 https://bingu.net
而别人用 HTTPS 地址 https://bingu.net 来访问的时候,插件里的静态文件引用仍旧是以 HTTP 地址为基础,就不能很好地载入了。
问题出在 WP_PLUGIN_URL 这里,看看它的定义是怎样的 WP_PLUGIN_URL (WordPress Constant)
define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' );
再来看看 WP_CONTENT_URL 的定义是
define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' );
WP_PLUGIN_URL 的基础地址是 get_option( ‘siteurl’ ),也就是 General Settings 中的 WordPress Address (URL) 里设置的地址,这里是一个硬编码的一个地址,设置的是 HTTP 地址,get_option 出来就是 HTTP 地址,不会根据访问的情况自行更替 scheme。
因为浏览器在静态文件链接没有提供 scheme 时,会根据访问地址的 scheme 自行载入相应 scheme 的静态文件。这样解决就很容易了,只要将 WP_PLUGIN_URL 变成一个没有 scheme 的地址就可以了,所以上面的静态文件的引用变成了这样
echo '<link rel="stylesheet" href="'.str_replace(array("http:", "https:"), "", WP_PLUGIN_URL).'/myplugin/somecss.css" type="text/css" media="screen">'."\n";
WordPress的网址硬编码确实是一个坑。这种情况我的做法是直接设置 siteurl 直接设置https,然后让http地址自动跳转 https。
的确是这样的。但也变成了非彼即此,让人恼火。