ウィジェット移行作業
WordPressサイト移行時にウィジェットが移行できなかった時の対処法。
移行準備
ウィジェット移行用プラグインのインストール
「テスト環境」と「本番環境」にウィジェット移行用プラグイン「Widget Importer & Exporter」をインストールします。
- 管理画面左メニュー「プラグイン」>「新規追加」をクリックします。
- 右上の検索窓に「Widget Importer & Exporter」を入力して検索します。
「Widget Importer & Exporter」を「今すぐインストール」>「有効化」します。
テスト環境のウィジェット情報をエクスポート
- 管理画面左メニュー「ツール」>「Widget Importer & Exporter」をクリックします。
- 「ウィジェットのエクスポート」ボタンをクリックします。
ウィジェットの情報が拡張子「.wie」ファイルとして生成されます。
以上でウィジェット情報のエクスポート完了です。
エクスポートしたウィジェット情報のURLを検索置換
エクスポートしたウィジェット情報に画像などが含まれる場合、テスト環境URLが記載されています。
ウィジェット情報内のテスト環境URLを本番環境URLに変換します。
VS Code等のテキストエディタを使って検索置換してもよいのですが、ファイル内のURLは「/」がエスケープされています。
ウィジェットファイル内のURLの例
<img src=\"http:\/\/localhost\/wordpress\/wp-content\/uploads\/car-1024x682.jpg\" alt=\"\" class=\"wp-image-48\"\/>
エスケープされたURLを考慮して本番環境のURLに置換します。
面倒な場合は以下の変換スクリプトを使用してください。
ウィジェット情報内のテスト環境URLを本番環境URLに変換
- URLを置換するウィジェットファイル
- 検索:テスト環境URL ※最後の「/」を入れないこと
- 置換:本番環境URL ※最後の「/」を入れないこと
本番環境にウィジェット情報をインポート
- 管理画面左メニュー「ツール」>「Widget Importer & Exporter」をクリックします。
- 「ファイルを選択」をクリックしてエクスポートした拡張子「.wie」ファイル(本番環境URL置換済み)を選択します。
- 「ウィジェットのインポートポート」ボタンをクリックします。
インポート結果が表示されます。
インポート実行時にエラーがでた場合の対処法
- 「copy and paste」をクリックします。
- テスト環境からエクスポートした拡張子「.wie」ファイルの内容を貼り付けます。
- 「ウィジェットをインポート」をクリックします。
ウィジェットが本番環境に移行されました。
なぜウィジェットが移行できないのか
移行手順
- テスト環境のphpMyAdminからSQLをエクスポートする
- テキストエディタでエクスポートしたSQLのテスト環境URLを本番環境URLに置換する
- 本番環境のphpMyAdminからSQLをインポートする
ウィジェットの値がデータベースにどのように保存されているか
ウィジェットで設定した内容はシリアライズされてデータベースに保存されます。
その際、データのバイト数も一緒に保存している為、移行時URL変換などでバイト数が一致しないと値が使えず移行先で反映されないようです。
シリアライズとは
serialize関数でシリアライズ後の値を確認できます。
https://www.php.net/manual/ja/function.serialize.php
<?php
echo serialize(100);
// 結果: i:100;
echo serialize(100.5);
// 結果: d:100.5;
echo serialize('abc');
// 結果: s:3:"abc";
echo serialize(true);
// 結果: b:1;
echo serialize(false);
// 結果: b:0;
echo serialize(null);
// 結果: N;
echo serialize([10, 20, 30]);
// 結果: a:3:{i:0;i:10;i:1;i:20;i:2;i:30;}
echo serialize([
'name' => '佐藤',
'age' => 20,
]);
// 結果: a:2:{s:4:"name";s:6:"佐藤";s:3:"age";i:20;}
?>
シリアル化された文字列を元の値に戻すには、unserialize関数を使用します。
https://www.php.net/manual/ja/function.unserialize.php
注意
第三者が入力した値(信頼できない値)をunserialize関数で元の値に戻す場合、悪意ある値による脆弱性をもっています。
徳丸先生のブログ:https://blog.tokumaru.org/2015/07/phpunserialize.html
通常は「serialize/unserialize」の代わりに、「implode/explode」や「json_encode/json_decode」の利用が望ましいです。