WordPressをSSL化した時にやること

最初からWordPressをSSL化することはあっても、途中からWordPressをSSL化するっていうプロジェクトは案外やったことがなかった。今回自分のサイトだからやってみるかとSSL化してみたんですが、SSL化することによって、色々変更しなければならなかったので、情報共有します。

SSL化の動機

時間ができたので、Let's Encryptの検証もかねてサーバーのSSLの自動化をやろうと思い始めました。Let's Encryptについてはまた今度じっくり書きますが、凄く乱暴に一言で表現すると「サーバのSSL化を無償でできるお得な証明書」です。動機が分かったところで、変更したところを書いて行きます。そんな多くないです。

管理画面から一般設定を変更

まずはWordPress全体のアドレス (home_urlなど) を変更するためにWordPressの管理画面にログインして、「設定」→「一般」の順に進みます。

WordPressアドレスとサイトアドレスを変更します。

WordPressとサイトアドレスの違いですが、これは、サーバーに設定したドメインはここのディレクトリ(フォルダ)を指しますよと教えてあげる設定(DocumentRoot)より下層にWordPressを配置した場合に、意味を成します。複数のWebサイトを同じドメインでいくつも運用していたりする場合に必要かもしれません。もう少し詳細に説明させてください。

WordPressアドレスとサイトアドレスが別の入力値になる例

## サーバーのパス
/var/www/html/ <= hogepiyo.com がこの階層に紐づけてある場合WordPressは
/var/www/html/wp  <= WordPressは/var/www/html/より下の階層にインストールされます
## ブラウザに入力するURLは下記になります。
https://hogepiyo.com/wp

WordPressアドレスとサイトアドレスが同じ入力値になる例

## サーバーのパス
/var/www/html/wp <= hogepiyo.com がこの階層に紐づけてある場合WordPressは
## ブラウザに入力するURLは下記になります。
https://hogepiyo.com/
ポン太
なるほど。WordPressのインストール先が、DocumentRootより下層だとURLが冗長(ながったらしい)になるもんね。
ぴよコーチ
そうだね。/var/www/html/wpにhttps://hogepiyo.com/wpでアクセスしてきたときも、 https://hogepiyo.com/ に転送してあげるんだね。 冗長ではなくなったように見えるので、検索エンジンのサイトの評価アップに繋がるのかもね。

WordPressシングルページ内の画像タグ内src属性のurl変更

さっきの変更で、メディアのURLとか、テーマ内で利用しているhome_url、site_url関数のhttpがhttpsになり、直でURL記入していない限り、大抵のhttpがhttpsに置き換わりました…。が、すでに投稿した記事の画像タグ内src属性のurlは置き換わらないんですね。この為にプラグイン入れるのも面倒なので、ここからは、DB内のデータを置換していきましょう。

postsテーブルのpost_content項目を更新する

WordPressの**_postsテーブルのpost_content項目って何が入っているのかというと、記事の内容が入っています。この項目内のhttpをhttpsに変更するという作業を行っていきます。

作業前にDBのリレーションを確認しておくと良いかもしれません。DB設計資料はWikiでですが公開されているので、今後の為にも一旦見ておきましょう。で、この作業はちょっと危険なので、注意書きしておきます。バックアップは必ず取りましょう。私は「ツール」→「エクスポート」で行いました。

ご注意

この先DB内のデータ一括置換を行いますので、バックアップは必ず取得してください。私は成功し、この通り行えば再現は可能だと思われますが、更新したデータ件数は1000件程度と小数でした。状況が異なれば、リスクも異なりますので、自己の裁量の元、注意深く作業の実施をしてください。もし、DBやWordPressに関しての知見が浅い場合、外部に依頼するなどしてください。事故が起こった場合、当方で責任を負うことはできません。

SQL実行前に、mysqlのSAFE_UPDATESを解除します

WorkBenchを利用して、mysqlでデータ更新を一括で行おうとすると、主キーが含まれていない場合、下記のようなエラーが出ます。 phpmyadminでは出ないかもしれません。

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

From WorkBench

WorkBenchの画面を操作して、設定変更する方法もありますが、SQLで設定変更できます。phpmyadminで出るかどうかは謎です。下記を実行すれば、セーフモードの解除ができます。SQLでセーフモードを解除する場合は、接続が切れると、またONになりますが、画面操作でセーフモードを解除すると、接続がキレても戻らないので留意ください。

SET SQL_SAFE_UPDATES=0;   # セーフモードOFF

httpをhttpsに変更するためのSQLを実行する

update文を書くときは、不要なデータの更新を防ぐために、where句を必ず書くようにしましょう。とはいいつつ、自分のwhere句が良いのかどうか分からないので、条件足りないのではと感じたら、書き足すようにしてください。

# いったん変更分が正しいか結果を見て確認
SELECT 
    ID, post_title, post_content
FROM
    wordpress.wp_posts  #データベース名.接頭地_posts
WHERE
    post_content LIKE '%http%';

問題がなければ、更新していきましょう。

# さっき出たデータのpost_contentのhttpがhttpsに置き換わります。
# 投稿内のimgに限定していないので、投稿内のすべてのhttpがhttpsに置き換わります
# どうしてもhttpを投稿内に残さなければならない場合、違うwhere句を書く必要があります。

UPDATE wordpress.wp_posts #データベース名.接頭地_posts
SET 
    post_content = REPLACE(post_content,
        'http://',
        'https://')
WHERE
    post_content LIKE '%http%';

affected Rows matched: *** Changed: *** Warnings: 0 0.125 sec

成功すると、こんなログ出ます。Changedの数を確認して想定通りであれば、さっきのSELECTのSQLを確認して、変更されたかどうか確認してみると良いと思われます。

テーマのカスタマイズ

Widgetやテーマ固有設定で画像を利用するところがある場合、該当箇所のhttpをhttpsに変更したら自分は完了しました。何故完了と思ったのかというと、TOPページのURL(Chorome)鍵マークが出たからになります。

以上です。お疲れ様でした!


スポンサーリンク

この記事が気に入ったら
フォローしよう

最新情報をお届けします

おすすめの記事