Learning site for website creation

外観カスタマイズ移行作業

公開日:2021年10月10日

WordPressサイト移行時に外観のカスタマイズで設定した内容が移行できなかった時の対処法。

外観カスタマイズとは

管理画面左メニュー「外観」>「カスタマイズ」をクリックします。

外観カスタマイズではロゴ画像やトップページのアイキャッチ画像やヒーロー画像等を設定できます。
※テーマが外観カスタマイズ項目を用意している場合のみ

移行準備

外観カスタマイズ移行用プラグインのインストール

「テスト環境」と「本番環境」に外観カスタマイズ移行用プラグイン「Customizer Export/Import」をインストールします。

  1. 管理画面左メニュー「プラグイン」>「新規追加」をクリックします。
  2. 右上の検索窓に「Customizer Export/Import」を入力して検索します。

「Customizer Export/Import」を「今すぐインストール」>「有効化」します。

テスト環境の外観カスタマイズ情報をエクスポート

  1. 管理画面左メニュー「外観」>「カスタマイズ」をクリック
  2. 左メニューの一番下に追加された「エクスポート / インポート」をクリック

左メニュー「書き出し」をクリックして、外観カスタマイズの内容をエクスポートします。

外観カスタマイズ情報が拡張子「.dat」ファイルとして生成されます。

以上で外観カスタマイズ情報のエクスポート完了です。

本番環境に外観カスタマイズ情報をインポート

  1. 管理画面左メニュー「外観」>「カスタマイズ」をクリック
  2. 左メニューの一番下に追加された「エクスポート / インポート」をクリック

「ファイルを選択」をクリックしてエクスポートした拡張子「.dat」ファイルを選択します。

「画像ファイルをダウンロードしてインポートしますか?」にチェックを入れます。

このチェックを入れることでテスト環境にある画像URLを本番環境URLに変換して設定してくれます。

上記設定後「インポート」をクリックします。

インポートしたのに設定した画像が表示されない時

画像のアップロードに失敗しています。

テスト環境の「WordPressフォルダ」>「wp-content」>「uploads」フォルダを本番環境にアップロードします。

以上で外観カスタマイズの移行完了です。

なぜ外観カスタマイズが移行できないのか

移行手順

  1. テスト環境のphpMyAdminからSQLをエクスポートする
  2. テキストエディタでエクスポートしたSQLのテスト環境URLを本番環境URLに置換する
  3. 本番環境の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」の利用が望ましいです。