以前、WordpressサイトをSSL化する手順を紹介しました。
この中の工程で一番作業が面倒くさくて危険なのが「内部リンク(URL)をSSL対応のものにする」という作業です。
先程の記事の手順では、「Search Regexプラグインを用いて投稿本文内を一括置換する」という手法を用いています。
この置換作業が、以下のような内容の置換を何度もする必要があって、地味に面倒くさいです。
- 自サイトのURLをSSL化
- 非SSLのAmazon商品画像URLの置換
- 非SSLのアフィリエイトリンク画像URLの置換(古いコードを利用中のASPの数だけ)
- その他の非SSLの画像URL
- その他の非SSLのiframeURL
しかも、誤って置換に失敗してしまうと、正常リンクされなくなります。そして、大失敗すると元に戻せないなんて可能性もあります(なので事前にデータベースバックアップを推奨しています)。
ですので、今回は「ちょっと面倒でリスキーなデータベース置換を行わないで内部リンクURLのSSL化をやってしまおう」という提案です。
目次
WordPressサイトSSL化の主な4手順
事前に、WordpressサイトでSSL化するのに主に必要となる手順を紹介しておきます。
その、主な手順とは以下の4手順です。
- サーバー側でSSL化設定をする(mixhostサーバ利用の場合は不要)
- WordPressの設定からURLを変更する
- 内部リンク等のURLをSSL対応のものに全て置換する
- .htaccessにリダイレクト用のコードを追記する
上記の1、2、4の手順は以下に詳しく書いてあるので参照してください。
今回は、3の「内部リンク等のURLをSSL対応のものに全て置換する」の手間を軽減するWordpressカスタマイズ方法です。
内部リンク等のURLを表示前にPHPで置換する
以前の手順では、「Search Regexプラグインを用いてデータベースを置換」していました。これを、「PHP側で投稿を表示する前に置換処理で変更する」コードを書いてみました。
基本的にやることといったら、functions.phpにコードを貼り付けるだけです。
functions.phpの編集
「内部リンク等のURLを表示前にPHPで置換する」には、functions.phpに以下のコードを貼り付けます。
//コンテンツ内の非SSL URLを表示前にSSL化する function chagne_site_url_html_to_https_ex($the_content){ //httpとhttpsURLの取得 if (strpos(site_url(), 'https://') !== false) { $http_url = str_replace('https://', 'http://', site_url()); $https_url = site_url(); } else { $http_url = site_url(); $https_url = str_replace('http://', 'https://', site_url()); } //投稿本文の内部リンクを置換 $the_content = str_replace($http_url, $https_url, $the_content); //AmazonアソシエイトのSSL化 $search = 'https://images-fe.ssl-images-amazon.com'; $replace = 'https://images-fe.ssl-images-amazon.com'; $the_content = str_replace($search, $replace, $the_content); //バリューコマースのSSL化 $search = 'https://ck.jp.ap.valuecommerce.com'; $replace = '//ck.jp.ap.valuecommerce.com'; $the_content = str_replace($search, $replace, $the_content); $search = 'https://ad.jp.ap.valuecommerce.com'; $replace = '//ad.jp.ap.valuecommerce.com'; $the_content = str_replace($search, $replace, $the_content); //もしもアフィリエイトのSSL化 $search = 'https://af.moshimo.com'; $replace = '//af.moshimo.com'; $the_content = str_replace($search, $replace, $the_content); $search = 'https://i.moshimo.com'; $replace = '//i.moshimo.com'; $the_content = str_replace($search, $replace, $the_content); $search = 'https://image.moshimo.com'; $replace = '//image.moshimo.com'; $the_content = str_replace($search, $replace, $the_content); //A8.netのSSL化 $search = 'https://px.a8.net'; $replace = 'https://px.a8.net'; $the_content = str_replace($search, $replace, $the_content); //アクセストレードのSSL化 $search = 'https://h.accesstrade.net'; $replace = 'https://h.accesstrade.net'; $the_content = str_replace($search, $replace, $the_content); //はてなブログカードのSSL化 $search = 'https://hatenablog-parts.com/embed?url='; $replace = 'https://hatenablog-parts.com/embed?url='; $the_content = str_replace($search, $replace, $the_content); //ここに新しい置換条件を追加していく // //のSSL化 // $search = ''; // $replace = ''; // $the_content = str_replace($search, $replace, $the_content); return $the_content; } add_filter('the_content', 'chagne_site_url_html_to_https_ex', 1);
上記のコードでは、コンテンツ表示前に以下のような処理を行っています。
- 内部リンクURLのSSL化
- Amazonアソシエイト画像のSSL化
- バリューコマース画像(インプレッション画像)のSSL化
- もしもアフィリエイト画像(インプレッション画像)のSSL化
- A8.net画像(インプレッション画像)のSSL化
- アクセストレード画像(インプレッション画像)のSSL化
- 古いはてなブログカードの iframe URLのSSL化
とりあえず、これだけはデータベースの置換作業を行わなくてもSSL化表示されるようにしてみました。
条件を追加する場合
上記以外にも条件を追加する場合は、以下のようなコメントが書かれた部分の下に
//ここに新しい置換条件を追加していく
以下のような条件をどんどん追加していってください。
//〇〇のSSL化 $search = '非SSLのURL'; $replace = 'SSL対応のURL'; $the_content = str_replace($search, $replace, $the_content);
PHP編集に慣れていない場合は、functions.phpを編集する前は、必ずバックアップしておいてください。
今回の方法の利点と難点
今回のコードを利用することによって生じる利点と難点は以下のようになります。
利点
思いつく利点は以下。
- プラグインを用いて何回もデータベース内のテキストを置換する必要がない
- データベースの内容を変更することがない
- データベースへの変更がないので比較的安全
- データベースへの変更がないので追加したコードを削除するだけで元に戻せる
かなり、SSL化手順を短縮することができます。
また、データベースを誤って書き換えてしまう心配がないので、安心して行うことができます。もし、エラーが出たのなら追記分のコードを削除してしまえば元に戻すことができます。
難点
SSL化手順を安全に短縮する代わりに、以下のような難点があります。
- 表示前に毎回PHPで置換するので多少の処理時間がかかる
- 表示の都度置換処理を行うのでサーバーに多少の負担がかかる
- ウィジェットなどの画像は自前でURLをhttpsにする必要がある
- 追記:置換対象URLを普通に投稿本文に書いてしまうと置換されてしまう
(これはプラグインを使用しても置換されます。ただ、プラグインを利用して置換した場合は後から修正して再投稿すればOK)
今回の方法は、データベースの内容を変更しているわけではないので、Wordpressの本文表示前に、毎回「非SSL URL」を「SSL対応URL」に置換して表示しています。
そのために、表示前に多少の処理時間はかかると思います。ただ、処理にかかる時間といっても0.0XXX秒程度の違いとは思いますが。
また、多少処理に時間がかかっていたとしても、ページキャッシュプラグイン等を利用する事で、表示時間的には全く変わらなくなると思われます。
まとめ
ということで、当サイトは今回の方法を使って、内部リンク及び、非SSLの画像URLを置換することで(ほぼ)完全にSSL対応できました。
やっぱり、「ツールを使ってデータベース内のテキストを一括置換する」というのは、個人的には結構ビビってしまう作業です。もちろん、置換対象文字列と変更文字列に十分注意を払っていれば、大丈夫ではありますが、人間、ミスをしてしまう可能性は0ではありません。
そんな、コンテンツのSSL対応作業なんですが、今回の方法であれば、たとえミスをしてもコードを削除することで直ぐに挽回できるのは大きな魅力かと思います。
ということで、「やっぱりデータベースを書き換えてしまうのは怖い」という方や、「PHPを用いたテキストで手軽にSSL化条件を追加していきたい」なんて方には良いかと思います。
こんにちわ
いつも楽しく読ませて頂いてます。
そこで質問したい事があるのですが、
例えば個人の外部サイトへのリンクが複数ある(例えばurlが違うサイトがそれぞれ10個とか)場合は、手動で書き換えるしかないのでしょうか??
それとSSL化したサイトを見ていると、wwwがない場合が多いのですが、wwwは無しにした方がいいのでしょうか??