冰古blog » wordpress » 2021 » 08 » 21 » 在 Plugin 中使用 WP_PLUGIN_URL 的问题

在 Plugin 中使用 WP_PLUGIN_URL 的问题

通常,在 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";

2 Responses to “在 Plugin 中使用 WP_PLUGIN_URL 的问题”

  1. Amos says:

    WordPress的网址硬编码确实是一个坑。这种情况我的做法是直接设置 siteurl 直接设置https,然后让http地址自动跳转 https。

Leave a Reply