wp_postmetaのシリアライズ化されたデータを加工する(テーマオプション・ドメイン変更対応)


WPの移設の際、テーマオプションの引越しに手間取っていました。毎回手打ちで更新しなおすのが手間でした。

DBマイグレーションに近いプラグインも探しましたが中々できなかったので自分で変換コードを作ってしまいました。wp options importer と組み合わせて使います。

wp_postmeta に格納されるテーマオプションは、シリアライズ化されているので、それらを一度JSON→配列化→置換→JSON出力という流れで実装しました。

テーマオプションの場合について移設作業の一括移設ができましたので、記事にします。Builderという機能で記事内部のデータをwp_postmetaで管理するプラグインがあるようですが、そちらには対応しきれてないと思います。

手順1.  wp_options_importer プラグインを移設前と新しいドメインのサイトに入れておく。

手順2. WPをコピー、DBもコピーする(DBはエクスポートしてから、ドメイン名の一括置換をしてインポートする)

手順3. 手順2のファイルやエクスポートしたDBで新しいサイトを構築。

手順4. wp_options_importer をそれぞれのサイトで有効化。移設前の方でoptions のエクスポートを実施。JSONで出力されます。

手順5. 出力されたJSONはUTF8で保存しなおし、サーバへUPします。

手順6. 以下ソースをconvert.php ファイルとしてサーバに置きます。その後、$before/$after 変数を置換したい文字列へ変更します。また、”wp_options.20180127.json”のファイル名も適切なファイル名へ変更します。URLの場合はスラッシュのエスケープを忘れずに。


<?php
// ---------------------------------
// エスケープ文字を忘れずに!
// ---------------------------------
$before = "http:\/\/blog.zamuu.net\/before";
$after = "http:\/\/blog.zamuu.net\/after";

$json = file_get_contents("wp_options.20180127.json");
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$ary = json_decode($json, true);

//多次元配列を再帰的に処理して 'before' をすべて 'after' に置き換える。
array_walk_recursive($ary, function (&$val, $key) {
$val = str_replace($before, $after, $val);
});

$json_arry = json_encode($ary);
file_put_contents("out.json" , $json_arry);

?>

手順6.  サーバへ置いたphpへブラウザからアクセスして実行すると out.json ができます。これがURL返還後のjsonファイルになります。

手順7. 移設後のサイトの方で out.json をインポートします。

追加でこちら「wordrpessのpage builder(ページビルダー)機能をサイト引越し時に移植する」も記載したのでリンクしておきます。