WordPressサイトの内部リンクSSL対応(HTTPS化)をコードコピペでちょっと楽にする方法

以前、WordpressサイトをSSL化する手順を紹介しました。

エックスサーバーが独自SSLを無料かつ無制限で利用できるようになりました。この、エックスサーバーの「ユーザーにどんどん利便性...

この中の工程で一番作業が面倒くさくて危険なのが「内部リンク(URL)をSSL対応のものにする」という作業です。

先程の記事の手順では、「Search Regexプラグインを用いて投稿本文内を一括置換する」という手法を用いています。

Search Regexプラグイン
Wordpressデータベース内の文章を一括で検索したり、置換したりすることができるプラグイン。
Search-Regex

この置換作業が、以下のような内容の置換を何度もする必要があって、地味に面倒くさいです。

  • 自サイトのURLをSSL化
  • 非SSLのAmazon商品画像URLの置換
  • 非SSLのアフィリエイトリンク画像URLの置換(古いコードを利用中のASPの数だけ)
  • その他の非SSLの画像URL
  • その他の非SSLのiframeURL

しかも、誤って置換に失敗してしまうと、正常リンクされなくなります。そして、大失敗すると元に戻せないなんて可能性もあります(なので事前にデータベースバックアップを推奨しています)。

ですので、今回は「ちょっと面倒でリスキーなデータベース置換を行わないで内部リンクURLのSSL化をやってしまおう」という提案です。

スポンサーリンク
レクタングル(大)広告

WordPressサイトSSL化の主な4手順

事前に、WordpressサイトでSSL化するのに主に必要となる手順を紹介しておきます。

その、主な手順とは以下の4手順です。

  1. サーバー側でSSL化設定をする(mixhostサーバ利用の場合は不要)
  2. WordPressの設定からURLを変更する
  3. 内部リンク等のURLをSSL対応のものに全て置換する
  4. .htaccessにリダイレクト用のコードを追記する

上記の1、2、4の手順は以下に詳しく書いてあるので参照してください。

エックスサーバーが独自SSLを無料かつ無制限で利用できるようになりました。この、エックスサーバーの「ユーザーにどんどん利便性...

今回は、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 URL」を置換するものです。全てのサービスのものに対応しているわけではないので、「混在コンテンツ」となる場合は、個々の環境に合わせた置換コードを追加する必要があります。

条件を追加する場合

上記以外にも条件を追加する場合は、以下のようなコメントが書かれた部分の下に

//ここに新しい置換条件を追加していく

以下のような条件をどんどん追加していってください。

//〇〇の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対応できました。

Chromeで保護された通信(寝ログ)

やっぱり、「ツールを使ってデータベース内のテキストを一括置換する」というのは、個人的には結構ビビってしまう作業です。もちろん、置換対象文字列と変更文字列に十分注意を払っていれば、大丈夫ではありますが、人間、ミスをしてしまう可能性は0ではありません。

そんな、コンテンツのSSL対応作業なんですが、今回の方法であれば、たとえミスをしてもコードを削除することで直ぐに挽回できるのは大きな魅力かと思います。

ということで、「やっぱりデータベースを書き換えてしまうのは怖い」という方や、「PHPを用いたテキストで手軽にSSL化条件を追加していきたい」なんて方には良いかと思います。

『WordPressサイトの内部リンクSSL対応(HTTPS化)をコードコピペでちょっと楽にする方法』へのコメント

  1. 名前:なお 投稿日:2017/02/24(金) 13:55:05 ID:da1d44f68

    こんにちわ

    いつも楽しく読ませて頂いてます。

    そこで質問したい事があるのですが、
    例えば個人の外部サイトへのリンクが複数ある(例えばurlが違うサイトがそれぞれ10個とか)場合は、手動で書き換えるしかないのでしょうか??

    それとSSL化したサイトを見ていると、wwwがない場合が多いのですが、wwwは無しにした方がいいのでしょうか??

  2. アバター画像 名前:わいひら 投稿日:2017/02/24(金) 20:36:33 ID:d8b3f588d

    こんにちは。
    単にAタグを用いて、個人の外部サイトにリンクが貼ってある場合は、修正する必要はありません。
    修正する必要があるのは、imgでhttp画像へインクが貼ってある場合や、iframeでhttp外部サイトへsrc属性が設定してある場合とかだと思います。

    僕の場合は、短い方が良いので、サイト開設当初からwwwをなしにしています。
    他の方も、SSLだからwwwにしていないということではないのではないかと思っています。
    自身が親しみのあるURLで利用すればよいのではないかと思います。

  3. 名前:なお 投稿日:2017/02/25(土) 03:10:10 ID:c98076c00

    なるほどー
    個人の外部サイトの場合は修正の必要がないんですね、勘違いしてました。

    wwwも最近やけに見かけなくなったので、sslで付けると良くないのかなって思ってました。
    親しみのあるURLでやってみます。
    ありがとうございました!!

  4. アバター画像 名前:わいひら 投稿日:2017/02/25(土) 07:18:51 ID:952aa4950

    もちろん、相手先がhttp→httpsのURL変更を行っていて、繋がらない場合は変更が必要です。
    ただそういった場合、大抵はhttp→httpsへ飛ばすリダイレクト設定がされているので問題ないと思います。

    あと、Facebookとかは、wwwがついたままのSSL対応サイトです。
    https://www.facebook.com/
    wwwがついていないと、確かに何だか慣れなくて、気持ち悪い感じがします・笑
    https://facebook.com/
    収まりが悪いというか。

  5. 名前:松下昭一 投稿日:2018/08/26(日) 20:38:08 ID:bc3741c63

    表記が分かりやすくてスラスラと読ませていただきました。
    20年以上いろいろとやってきましたが、WordPress初心者です。
    トップページのみSSL対応しないのでいろいろ探しているうちにたどり着きました。
    PHPの書き換えは私には必要なかったですが、参考になりました。
    また、訪問させていただくと思います。ありがとうございました。

  6. アバター画像 名前:わいひら 投稿日:2018/08/28(火) 17:23:34 ID:befec8a58

    記事がお役に立てたようであれば良かったです。
    お書き込みありがとうございます。

  7. 名前:nao 投稿日:2018/08/29(水) 23:35:44 ID:b576defed

    わいひらさん、はじめまして。
    いつも寝ログを拝見しております。

    ご多忙でらっしゃると思うのですが、わからないことがありまして、初コメで申し訳ないのですが、質問をさせていただいてよろしいでしょうか。

    実は、ある古いブログをSSL化しました。

    新しい、コードコピペの記事のやり方ではなくて、(寝ログの結構、過去記事にある)エックスサーバーの、無料のSSL化の方の記事を下敷きに、SSL化を実行しました。

    エックスサーバーでSSL化の手順を、踏む。

    そして、ワードプレスのダッシュボードに入り、一般設定からSをつけた、新しい、URLを打ち込む作業をしました。

    (URLを打ちかえ)保存ボタンをばちんと押すと、ここで(デフォルトで)一端、勝手にログアウトするのは知っていたのですが、(同時に)いきなり500エラーがでてしまいました。

    500エラーは、CGIの負荷が大きい、CGIのパーミッション設定に誤りがある。
    .htaccess の記述に誤りがあるあたりが、問題のようなのですが、CGI関係より、その多くは.htaccessに、問題ありと書いてあるブログが多くありました。

    僕は以前、寝ログさまを参考に、当該ブログの.htaccessに、高速化のコードを打ち込んだ時があります。

    思えば、その.htaccessの編集作業で、(うろ覚えなのですが)メモ帳を、使ったような気がするのです。

    (今もブログはかなり素人でして)メモ帳でのフェイル編集作業は、恥ずかしながらだめだと最近知りました。

    ただ、その時はエラーになることもなく、その後もずっとブログは問題なく表示されておりました。

    メモ帳編集したことが、のちのち、何かのはずみ(今回のようなSSL化)で、エラーをひき起こす可能性(エラー覚醒のようなこと)はありますでしょうか?

    ーーーーーーー

    その他、ブログを参照しながら、PHPアドミンから、SSL化したURLを、Sのついていないものへ戻す、エックスサーバでSSL化を解除する。

    エックスサーバーのPHPバージョンをいくつかのバージョンに変えてみる。(古めのバージョンにも念のため、変えてみました)

    または、サーバーからプラグインを全部削除する、などやってみましたが、500エラーは頑強に解けておりません。

    もう、このブログはあきらめたのですが、もうひとつSSL化したいブログがありまして、同じ轍を踏まぬように、わいひらさまへ質問をさせていただきました。

    ご多忙とは思いますが、アドバイスをいただけると、幸いでございます。
    長文になりもうしわけありません。

  8. アバター画像 名前:わいひら 投稿日:2018/08/30(木) 18:59:33 ID:2b80758e0

    .htaccessについては、書き込まれた内容に沿って言えば、双方とも正常に書き込まれていれば、干渉するということはないと思います。

    ただ、.htaccessが原因かどうかを切り分けるためにも、.htaccessの初期化を行ってみてください。
    こちらの方法です。
    WordPressで500エラーが出たら.htaccessを初期化してみよう! | HPcode
    WordPress 500エラーが引越しや独自ドメイン設定のときに出た場合 | ワイワイWEB
    これで問題が解決するようであれば、.htaccessが原因。解決しないようであれば、他の原因(おそらくURL変更)の可能性があります。