🐡

古いWordpressサイトを、Docker環境に移行する際のいくつかのこと

2023/05/29に公開

※BackWPupなどでバックアップしたアーカイブが存在すること前提とします。
※Docker、docker-composeのインストールも済ませていることも前提です。

docker-compose.ymlの準備

docker-compose.ymlの中身は、environment項目を除いてほぼこちらから拝借(→あとlatestを嫌って、wordpress:php8.1-apacheイメージを選択)。
https://qiita.com/tomokei5634/items/75d2501cfb968d0cfab5

phpmyadminは、後々楽なので入れといたほうがいいです。
(何かあったときの復旧のため、起動直後のDBはエクスポートしておくのが無難)

①mysqli、apache2エラー対処のためのDockerfile

ビルド後、volumesに指定したホストに、WordPressのお馴染みのディレクトリ構造ができ上っているはずです。
続いて、バックアップアーカイブからwp_config.php、素材となるwp_content/uploadsを移しておきます。wp_config.phpは、docker-compose.ymlのenviromentに合わせておいて下さい。

この段階でdockerを起動したところ、mysqliとapache2にエラーが発生するので、Dockerfileに以下を記述します。

Dockerfile
FROM wordpress:php8.1-apache

RUN docker-php-ext-install mysqli
RUN echo "ServerName localhost" | tee /etc/apache2/conf-available/fqdn.conf
RUN a2enconf fqdn

docker-compose.ymlのbuild項目にDockerfileのパスを設定します。
docker-composeをbuild、upします。これでログインができます!が、アーカイブからsqlファイルをインポートした途端、ログインできなくなります。

②データベースを書き換える

再度ログインさせるため、wp_usersテーブルを変更します。phpmyadminを使うと楽です。wp_usersテーブルから、編集を選択します。
useu_login、user_passをwp_config.phpに合わせた内容に変更。user_passには、関数をMD5にします。

データベースの変更
これで、再びログインできるはずですが、以下のテーブルのドメインも書き換えておきます。以下をphpmyadminのコンソールで、環境に合わせた内容に置き換えて下さい。

UPDATE wp_options SET option_value=REPLACE(option_value, "旧ドメイン", "新ドメイン");
UPDATE wp_posts SET post_content=REPLACE(post_content, "旧ドメイン", "新ドメイン");
UPDATE wp_posts SET guid=REPLACE(guid, "旧ドメイン", "新ドメイン");
UPDATE wp_postmeta SET meta_value=REPLACE(meta_value, "旧ドメイン", "新ドメイン");

③PHPが古かった

過去の投稿記事、固定ページをインポートするため、WordPress「設定」より、アーカイブからxmlファイルをインポートします。

過去古いPHPで運用していた場合、エラーが発生するケースがあるので、wp-config.phpファイル内の「/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */」の前に以下を追加して、wp-content/debug.logを出力するようにします。

wp_config.php
// Enable WP_DEBUG mode
define( 'WP_DEBUG', true );

// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );

// Disable display of errors and warnings
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// Use dev versions of core JS and CSS files (only needed if you are modifying these core files)
define( 'SCRIPT_DEBUG', true );

私が経験した、ありがちと思われるのが、PHP8以降、配列のキー名をクオーテーションで囲わなくてはならなくなったところでしょうか。

// 正常なコード
$array['a'] = ' ';

// エラーが発生するコード
$array[a] = ' ';

あと、Passing null to parameter #1 ($string) of type string is deprecated も見受けられる場合、if構文で囲って、isset,is_nullなどで変数に値がセットされているかのチェックを入れておいてください。

私の例
- $squery = $wp_query->query['s'];

+ if ( isset($wp_query) ){
+    $squery = $wp_query->query['s'];

その後も、PHPに関するエラーに対処して下さい。
エラーが無くなったら、デバッグモードをオフにします。

④Docker特有のパーミッションの変更

この段階ではまだuploadsフォルダ以下のファイルの読み込むことができません[1]
Dockerで作成したWordPressは、全てwww-dataという所有者、所有グループでしたので、アーカイブからコピーさせたuploadsフォルダ内の所有権をすべてwww-dataに変更します。下記の方法で一気に変更できます。

find (uploadsフォルダまでの相対パス) -exec chown www-data:www-data {} \;

同様の方法で、pluginsフォルダ内のプラグイン群も使用可能にできるでしょう(古いまま更新が止まっているものには、注意しましょう)。


脚注
  1. 403 Forbiddenの原因と解決方法について│キーワードファインダー https://keywordfinder.jp/blog/seo/403-forbidden/ ↩︎

Discussion