当ブログでは、 WordPress の Twenty Eleven テーマを使っている。
このテーマでば、なぜかシングルページの表示や個別記事のページでサイドバーが表示されない。
当ブログのアクセスのほとんどは、 検索からの個別記事のページへの流入なので、個別記事へのサイドバーの表示は行っておきたいところだ。
それを実現するのが、 Twenty Eleven Theme Extensions プラグインだ。
とても古いプラグインだが、 Twenty Eleven テーマの最新版でも問題なく動いている。
ところが、 このプラグインを有効にしたところ、 Google の Search Console で怒られるようになってしまった。
調べてみたところ、 /plugins/twenty-eleven-theme-extensions/moztheme2011.css
の配信が This request has been blocked; the content must be served over HTTPS.
でエラーになってしまっているようだ。
このブログは SSL化 され https:// で配信されているのに、プラグインの CSS が http:// で配信されているためだ。
これを修正してみよう。
http で配信されてしまう原因
プラグインのソースを覗いてみよう。
/plugins/twenty-eleven-theme-extensions/moztheme2011.php
をみると、 MozBaseClass_MozTheme2011::registerStyles($cssfiles)
で css が指定されていることがわかる。
twenty-eleven-theme-extensions/trunk/moztheme2011.php @427449
function __construct() {
parent::__construct();
$this->registerStyles('moztheme2011');
$this->registerFilter('body_class', 'filterSingular', 100);
if ($this->isOptionSet('enable-custom-colors') || $this->isOptionSet('embed-custom-css')) {
$this->registerAction('wp_head', 'embedStyles');
}
今度はその registerStyles
の実装が書かれている /plugins/twenty-eleven-theme-extensions/moztools/mozbase.php
をみると、 wp_register_style
によってヘッダに登録されているスタイルシートの URL は MozBaseClass_MozTheme2011::pluginDir
がベースになっていることがわかる。 更にその定義を辿っていくと、 WP_PLUGIN_URL
定数から作成されていることがわかるだろう。
twenty-eleven-theme-extensions/trunk/moztools/mozbase.php @427449
protected function __construct() {
$this->ajaxRequest = defined('DOING_AJAX');
$path = strtr(dirname(__FILE__), '\\', '/'); // Must convert for Windows platform
$path = substr($path, 0, strrpos($path, '/moztools')); // Must remove moztools subdirectory
$this->pluginDir = $path;
$dir = substr($path, strrpos($path, '/') + 1);
$this->pluginUrl = WP_PLUGIN_URL.'/'.$dir;
$this->pluginFile = $dir.'/'.$dir.'.php';
}
/**
* Register one or more CSS stylesheet files for the plugin
*
* @param string/array $cssfiles single or multiple css files
*/
protected function registerStyles($cssfiles) {
if (!empty($cssfiles)) {
$cssfiles = is_array($cssfiles) ? $cssfiles : array($cssfiles);
foreach ($cssfiles as $file) {
wp_register_style($file, $this->pluginUrl.'/'.$file.'.css');
wp_enqueue_style($file);
}
}
}
WP_PLUGIN_URL
から得られる URL が、常に http:// で始まるものであるというのが、問題の原因だ。
そもそも WordPress では、内部定数を直接使うことは推奨されておらず、 このような状況では plugins_url()
関数を使うべきだ。
プラグインの修正
上記の /mozbase.php
を以下のように書き換えてしまえば、 SSL化 した環境でもエラーなく css が配信されるようになる。
$this->pluginUrl = plugins_url().'/'.$dir;
プラグインの最終更新が 2011年 であるため、 不具合報告したところでプラグイン本体を修正してもらえる見込みはまずないだろう。
このため、プラグインをインストール後に、 「プラグインの編集」 機能などを使って、プラグインディレクトリ内の /plugins/twenty-eleven-theme-extensions/moztools/mozbase.php
のファイルを直接書き換えてしまうのが手っ取り早い対策だ。