こんにちは、カフーブログのタカフです。
お仕事お疲れ様です。
もしあなたがググっていて本記事にたどり着いているのなら、きっとWordPressのデータ移行でお困りなのでしょう。
WordPressの動的データを移行するのって正直しんどいですよね。
WordPressを運営していくと動的データとしてはuploadsディレクトリとDBデータが日々変わっていきますが、これを他の環境に移行したりするのって色々考えたりするので結構大変です。
でも、あなたがそんな内容でお困りなら朗報です。
本記事ではそのWordPress動的データをzipファイルでエクスポートして、他の環境にそのzipファイルをインポートするスクリプトを公開します。
さらにはオプション引数でドメイン置換も出来るようにしました。なので本番環境データを他の環境データにワンコマンドで移行やコピーが出来ます。
主な使い方としては本番環境をプレビュー環境やローカル開発環境にデータコピーする事です。もちろん本番環境の移行にも使えます。
僕はこれを使って本番環境データから数分で他の環境にデータ同期させて開発を楽にしています。
それでは参りましょう。
※本記事はIT技術者の方を対象とした記事となっています。WordPress初心者の方でWordPressを他のサーバーに移行したい場合は業者に頼んだ方が安全です。最安なら29,800円です。安心を買うようなものですね。
日本初!WordPress専門のサーバー移転代行『サイト引越し屋さん』
目次
何故、このスクリプトを作ったの?
僕はWebエンジニアということもあり、このWordPressブログを色々カスタマイズしているのですが、その時地味に困るのが本番環境からプレビュー環境・ローカル環境へのデータの同期なんですよね。
本番環境でしか起こらない問題や、本番環境と同じデータを持っていないと開発に支障が出るという事があるため、こういったデータ同期が必要なのです。
しかし、上述の通りWordPressのデータって若干扱いが面倒なのでこういう事をするときにいつもしんどかったので、それをほぼ自動化出来るPHPスクリプトを作りました。
僕はこのPHPスクリプトを使って数分で本番環境データをプレビュー環境・ローカル環境にデータを反映させているので、WordPress周りの開発がめちゃくちゃ楽になりました。
同じような悩みを抱えている人にも使ってもらえればと思って、大抵のWordPressでも動くよう汎用的に作ってみました。
WordPressのどのデータを移行出来るの?
WordPressのuploadsディレクトリとDBのデータ全てを移行出来ます。
僕の場合それ以外のソースコードは全てローカル環境→プレビュー環境→本番環境とアップロードしていってます。
そして本番環境でサイト運営していくにつれて増えていくuploadsディレクトリとDBデータをたまにプレビュー環境やローカル開発環境にダウンロードするようにしています。
つまりイメージ図にするとこんな感じになります。
後々気付いたけどローカル環境にuploads/DBデータのDLはプレビュー環境からのみ持ってきているわけではないですね。。
僕は環境毎にテーマカラーを色分けしてわかりやすくしたりしています。
アップロードの流れもWordPressソースコードをGitHubに入れてGitHub Actionsを使って自動デプロイ出来るようにしています。
【便利】GitHub Actionsを使ってレンタルサーバーにSSHでデプロイする方法
何故こうしているかというと、WordPressやプラグイン等が本番環境で勝手にアップデートされると動かなくなる事があったので、個人ブログといえどローカル環境やプレビュー環境で一応動きを確かめてから本番適用するようにしているからです。
個人ブログなのでさくらサーバーをレンタルしてそこにプレビュー環境も作っています。サブドメインを作ってやればわりと簡単に用意できます。
WordPressデータをエクスポートするPHPスクリプト
それではまずWordPressデータをエクスポートするスクリプトの紹介です。
100行ちょっとの簡単なスクリプトです。(本記事下部のまとめにダウンロードするリンクも用意しています。)
PHPスクリプト
<?php
/**
* export_wp_data.php
* WordPressの記事や写真のデータをまるごとエクスポートするPHPスクリプトです。
*
* ■使い方
* 本スクリプトをwordpressディレクトリ直下に置くか、ドキュメントルート外に置いて引数でwp-load.phpのパスを指定して実行します。
*
* ■引数
* -w(オプション) : wp-load.phpのパス。ない場合は同ディレクトリにwp-load.phpがあるかをさがしにいきます。
* -e(オプション) : エクスポート先ディレクトリ。ない場合は同ディレクトリに出力します。
*
*/
if (php_sapi_name() != 'cli') {
die("only cli." . PHP_EOL);
}
echo_msg("start export_wp_data");
/**
* パラメータの取得と各種エラーチェック
*/
$options = getopt("w::e::");
$wp_load_path = (isset($options["w"])) ? $options["w"] : false; // 指定ない場合はこのディレクトリの想定
$export_dir = (isset($options["e"])) ? $options["e"] : false; // 指定ない場合はこのディレクトリ
// wp-load.phpファイルチェック
if ($wp_load_path) { // 指定があった時はパスチェック
$wp_load_path = realpath($wp_load_path); // 相対パスの場合は実行時の位置をもとに絶対パスにする
if (!$wp_load_path) {
die("パラメータ指定のwp-load.phpが存在しません" . PHP_EOL);
}
} else {
$wp_load_path = realpath(__DIR__ . "/wp-load.php"); // 指定ない場合このスクリプトのディレクトリを探す
if (!$wp_load_path) {
die("wp-load.phpが存在するディレクトリではありません" . PHP_EOL);
}
}
// wp-load.phpを読み込めばDBの接続情報も読み込める
define('WP_DEBUG', false); // エクスポート時にちょっとしたWPデバッグ情報は不要なのでfalseにする
require_once $wp_load_path;
// WPはUTC標準なのでここでは日本時間とする
date_default_timezone_set('Asia/Tokyo');
/* 定数を文字列内で扱いやすいように変数化する */
$host = DB_HOST;
$user = DB_USER;
$pass = DB_PASSWORD;
$db = DB_NAME;
// DB接続確認
try {
new PDO('mysql:host=' . $host . ';dbname=' . $db, $user, $pass);
} catch (PDOException $e) {
die("MySQLに接続出来ません" . PHP_EOL);
}
// 引数でエクスポートディレクトリの指定がある場合はそこに出力する
if ($export_dir) { // 指定があった時はパスチェック
$export_dir = realpath($export_dir); // 絶対パスにする
if (!$export_dir) {
die("指定のエクスポートディレクトリが存在しません" . PHP_EOL);
}
} else {
// 引数でエクスポートディレクトリの指定がない場合は本スクリプトと同ディレクトリにする
$export_dir = __DIR__;
}
// uploads存在チェック
if (!file_exists(WP_CONTENT_DIR . "/uploads")) {
die("wp-contentディレクトリ直下にuploadsディレクトリが存在しません" . PHP_EOL);
}
// このサイトドメイン持ってきてzipファイル名にする
$wp_host = parse_url(get_site_url(), PHP_URL_HOST);
/* uploadsディレクトリをzip化する */
// zipコマンドは絶対パスでやるとそこまでのパスが入っちゃうのでそのディレクトリに移動する
// wp-loads.phpを読み込むとWP_CONTENT_DIRが定義されているのでそれを使う
echo_msg("> cd " . WP_CONTENT_DIR);
chdir(WP_CONTENT_DIR);
// -r サブディレクトリも再帰的にzip化する
// -q 動作中のメッセージを表示しない
$zippath = "{$export_dir}/wp_data-{$wp_host}-" . date("YmdHis") . ".zip"; // データディレクトリに生成するzipパス
exec_cmd("zip -rq {$zippath} ./uploads"); // wp-content直下のuploadsディレクトリをzipに突っ込む
if (!file_exists($zippath)) {
die("uploadsディレクトリをzip出来ません" . PHP_EOL);
}
/* mysqldumpで指定DBのデータを出力する */
echo_msg("> cd {$export_dir}");
chdir($export_dir); // uploads手前から移動
$sql_file = "wordpress_db.sql";
// --single-transaction サーバーからデータをダンプする前に BEGIN SQL ステートメントを発行(DBロックしない)
// --no-tablespaces CREATE LOGFILE GROUP ステートメントおよび CREATE TABLESPACE ステートメントを出力に書き出さない(これがないとWARNING出る)
exec_cmd("mysqldump -h {$host} -u {$user} -p{$pass} --single-transaction --no-tablespaces {$db} > {$sql_file}");
if (!file_exists($sql_file)) {
die("SQLファイルをダンプ出来ません" . PHP_EOL);
}
/* sqlファイルをzipに追加する */
exec_cmd("zip -q {$zippath} {$sql_file}");
/* sqlファイルはzipしたら不要なので消去 */
exec_cmd("rm {$sql_file}");
echo_msg("success : export {$zippath}");
// 最後に改行つけるだけのecho
function echo_msg($msg) {
echo $msg . PHP_EOL;
}
// コマンド実行関数
function exec_cmd($cmd) {
echo_msg("> {$cmd}");
system($cmd, $return); // exec()ではなくsystem()を使っているのは実行結果を出力してくれるから
return $return;
}
使い方
一番簡単な使い方は、wp-load.phpと同ディレクトリに置いてコマンドラインでphpとして実行するだけです。
$ php export_wp_data.php
これで同ディレクトリにあるwp-load.php
を読み込んで、そのディレクトリにuploads
ディレクトリとこのWordPressで使っているDBデータを詰めたものをzipファイルにして生成します。
一応コマンドラインからしか実行出来ないこととzipファイル名に日付を入れてるので、wordpressディレクトリ配下に置いてもWebから勝手に実行されたりzipファイルをダウンロードしにくいようになっています。
でももっと安全に使いたい場合は、-w
オプションでwp-load.php
のパス、-e
オプションでエクスポート先を指定します。こんな感じです↓。
$ php export_wp_data.php -w='/path/to/your/wordpress/wp-load.php' -z='/path/to/your/data/'
これでドキュメントルート外にこのスクリプトを置いてzipファイルもドキュメントルート外にエクスポートした方がより安全です。
エクスポートしたzipファイルの中身は単純にuploadsディレクトリとwordpress_db.sqlというファイルの2つが存在するのみとなっています。
僕のブログでもこれで1.2GBくらいになってます。
そしてこのzipファイルをインポート先の環境にダウンロードします。
uploadsにはたくさんの画像ファイルがありますが、それを1ファイルで持ってこれるのはいいですよね。
WordPressデータをインポートするPHPスクリプト
次にWordPressデータをインポートするスクリプトです。
(本記事下部のまとめにダウンロードするリンクを用意しています。)
PHPスクリプト
<?php
/**
* import_wp_data.php
* export_wp_data.phpでWordPressの記事や写真のデータをインポートするPHPスクリプトです。
* このスクリプトは「Search-Replace-DB」を使ってDB内のドメイン文字列を置換し、そのドメインでアクセス出来るようになります。
* https://interconnectit.com/search-and-replace-for-wordpress-databases/
*
* ■使い方
* 本スクリプトをwp-load.phpと同ディレクトリに置くか、又は引数でwp-load.phpのパスを指定して実行します。
* インポートするzipファイルのパス指定は必須です。
*
* ■引数
* -z(必須) : export_wp_data.phpでエクスポートして、uploadsディレクトリに配置したzipのファイル名。
* -w(オプション) : wp-load.phpのパス。ない場合は同ディレクトリにwp-load.phpがあるかをさがしにいきます。
* -s(オプション) : コピー元のWordPressドメイン。
* -r(オプション) : コピー先のWordPressドメイン。
* -b(オプション) : バックアップフラグ。フラグがある場合はインポート前にデータをエクスポートする(要export_wp_data.php)
* -e(オプション) : バックアップフラグがあった時のエクスポート先ディレクトリ。ない場合は同ディレクトリに出力します。
*/
if (php_sapi_name() != 'cli') {
die("only cli." . PHP_EOL);
}
echo_msg("start import_wp_data");
/**
* パラメータの取得
*/
$options = getopt("z:w::s::r::b::e::");
$zip_path = (isset($options["z"])) ? $options["z"] : die("インポートzipファイル名指定は必須です。" . PHP_EOL);
$wp_load_path = (isset($options["w"])) ? $options["w"] : false; // 指定ない場合はこのディレクトリの想定
$source_str = (isset($options["s"])) ? $options["s"] : false; // 置換元文字列
$replace_str = (isset($options["r"])) ? $options["r"] : false; // 置換先文字列
$is_backup = (array_key_exists("b", $options)) ? true : false; // バックアップフラグはキーがあるかどうか
$export_dir = (isset($options["e"])) ? $options["e"] : false; // 指定ない場合はこのディレクトリ
$zip_path = realpath($zip_path);
if (!file_exists($zip_path)) {
die("インポートzipファイルが存在しません" . PHP_EOL);
}
// wp-load.phpファイルチェック
if ($wp_load_path) { // 指定があった時はパスチェック
$wp_load_path = realpath($wp_load_path); // 相対パスの場合は実行時の位置をもとに絶対パスにする
if (!$wp_load_path) {
die("パラメータ指定のwp-load.phpが存在しません" . PHP_EOL);
}
} else {
$wp_load_path = realpath(__DIR__ . "/wp-load.php"); // 指定ない場合このスクリプトのディレクトリを探す
if (!$wp_load_path) {
die("wp-load.phpが存在するディレクトリではありません" . PHP_EOL);
}
}
// wp-load.phpを読み込めばDBの接続情報も読み込める
define('WP_DEBUG', false); // エクスポート時にちょっとしたWPデバッグ情報は不要なのでfalseにする
require_once $wp_load_path;
// WPはUTC標準なのでここでは日本時間とする
date_default_timezone_set('Asia/Tokyo');
/* 定数を文字列内で扱いやすいように変数化する */
$host = DB_HOST;
$user = DB_USER;
$pass = DB_PASSWORD;
$db = DB_NAME;
// DB接続確認
try {
new PDO('mysql:host=' . $host . ';dbname=' . $db, $user, $pass);
} catch (PDOException $e) {
die("MySQLに接続出来ません" . PHP_EOL);
}
/* バックアップ指定がある時はインポート前に現状のデータをバックアップする */
if ($is_backup) {
// バックアップ有の時で引数でエクスポートディレクトリの指定がある場合はそこにzipを出力する
if ($export_dir) { // 指定があった時はパスチェック
$export_dir = realpath($export_dir); // 絶対パスにする
if (!$export_dir) {
die("指定のエクスポートディレクトリが存在しません" . PHP_EOL);
}
} else {
// 引数でエクスポートディレクトリの指定がない場合は本スクリプトと同ディレクトリにする
$export_dir = __DIR__;
}
if (!file_exists(__DIR__ . "/export_wp_data.php")) {
die("バックアップオプションには同ディレクトリにexport_wp_data.phpが必要です" . PHP_EOL);
}
chdir(__DIR__);
// インポート時のバックアップでは現在のディレクトリに置く。バックアップ先を指定するなら-eパラメータで可能
exec_cmd("php export_wp_data.php -w=\"{$wp_load_path}\" -e=\"{$export_dir}\"");
}
/* 解凍先をwp-content直下にしたいので移動する */
echo_msg("> cd " . WP_CONTENT_DIR);
chdir(WP_CONTENT_DIR);
/* 旧uploadsディレクトリの削除する */
$old_uploads_dir = WP_CONTENT_DIR . "/uploads"; // 一応絶対パス
if (file_exists($old_uploads_dir)) { // 旧uploadsがある場合は削除する
exec_cmd("rm -rf {$old_uploads_dir}");
}
/* 新uploadsディレクトリを解凍する */
exec_cmd("unzip -q {$zip_path}");
/* 新uploadsディレクトリはこの実行ユーザーで解凍されるのでアクセス権は変えておく(これは要検討) */
exec_cmd("chmod -R 777 uploads");
/* DBデータのインポート */
exec_cmd("mysql -u {$user} -h {$host} -p{$pass} {$db} < wordpress_db.sql");
/* 解凍したsqlファイルは削除する */
exec_cmd("rm wordpress_db.sql");
/* スクリプトの位置に戻ってSRDBがある場合のみDB内の置換処理をする */
echo_msg("> cd " . __DIR__);
chdir(__DIR__);
$srdb_path = __DIR__ . "/Search-Replace-DB/srdb.cli.php";
if (file_exists($srdb_path) && $source_str && $replace_str) {
echo_msg("replace database string.");
exec_cmd("php {$srdb_path} -h='{$host}' -u='{$user}' -p='{$pass}' -n='{$db}' -s='{$source_str}' -r='{$replace_str}'");
} else {
echo_msg("DB内の文字列置換は実行しません");
}
echo_msg("success : import {$zip_path}");
// 最後に改行つけるだけのecho
function echo_msg($msg) {
echo $msg . PHP_EOL;
}
// コマンド実行関数
function exec_cmd($cmd) {
echo_msg("> {$cmd}");
system($cmd, $return); // exec()ではなくsystem()を使っているのは実行結果を出力してくれるから
return $return;
}
使い方
こちらも一番簡単な使い方としてはインポート先の環境のwp-load.phpと同ディレクトリにファイルを置いて、上記エクスポートで出力したzipファイルのパスを-z
で指定してphpコマンドライン実行するだけです。(※wp-load.phpにはDB接続先が記述してある必要があります。)
$ php import_wp_data.php -z='/path/to/your/wp_data-[hostname]-20201228082532.zip'
これにより、zipファイルの中身を取り出してuploadsディレクトリにwp-content直下に配置してDBデータを取り込みます。簡単ですね。
あえてzipファイル名を必須パラメータとしているのは、インポートするデータを明示的に指定している為です。
今から自分がインポートしようとしているデータを意識的に書くようにしています。
因みに旧データは消去してしまうのですが、この時-b
オプションで旧データをバックアップzipを作ることも出来ます。そしてその時-e
オプションでバックアップ先ディレクトリを指定出来ます。
PHPスクリプトの内容を見ればすぐにわかりますが、このバックアップに関してはexport_wp_data.phpを呼び出して再利用しているんですね。💪
ドメイン置換する方法
さて、本番環境のデータをそのままインポートしたままだとそのDBデータには本番環境ドメイン文字列が入ったレコードが多数あり、プレビュー環境やローカル環境でうまく動きません。
なのでDBデータ内の本番環境ドメイン文字列をその環境に合わせて置換することが必要なのですが、それを一括置換してくれるツールを紹介します。
『Search-Replace-DB』です。
WordPressのDBデータ内の一括置換ではわりと知る人ぞ知る有名なツールですね。
WordPressのDBデータ内では本番環境ドメイン文字列はシリアライズされたりしているので一般的なSQLコマンドでの置換というのはは難しいのですが、これを使えばシリアライズされたデータにも対応しているので安全にそのプレビュー環境・ローカル環境のドメインに置換することが出来ます。
全文英語となっていますがChromeでページ翻訳すれば大体何言っているかは理解出来る内容となっています。
このツールはダウンロードするのにリスク同意チェックとPayPal寄付が求められますが、まぁ同意はいいとして寄付は0円でも大丈夫です(すみません大変感謝はしています🙇♂️)
ダウンロードリンクはメールで送られてきます。
そしてダウンロード出来たらimport_wp_data.php
と同ディレクトリに設置すれば連携出来るようになります。
(※もちろんDB置換だけSearch-Replace-DB単体でも実行してもOKです。Search-Replace-DBはGUIからでも実行可能です。)
Search-Replace-DBを連携する使い方
先程はzipファイル名を指定するだけでしたが、-s
と-r
で置換元と置換先の文字列を指定します。
僕のブログを例とします。
$ php import_wp_data.php -z='/path/to/your/wp_data-kahoo.blog-20201228082532.zip' -s='kahoo.blog' -r='preview.kahoo.blog'
import_wp_data.php
と同ディレクトリにこのSearch-Replace-DB
ディレクトリを配置して、-s
と-r
でパラメータ指定した時だけDB内文字列置換も一緒に実行してくれるようになっています。
本番ではhttpsとなっていてコピー先でhttpの場合はする場合は、以下のようにhttpからの指定をすればよいでしょう。
$ php import_wp_data.php -z='/path/to/your/wp_data-kahoo.blog-20201228082532.zip' -s='https://kahoo.blog' -r='http://preview.kahoo.blog'
これでphpコマンドライン実行をすると、WordPress本番環境データから他のWordPress環境データにワンコマンドでコピーして、すぐにその環境のドメインでアクセス出来るというわけです。
Tips. 本番環境以外では特定のプラグインを動作させない方法
さて、本番環境以外にプレビュー環境やローカル環境を作る時、本番環境以外では動かしたくないプラグインってありますよね。
一例を挙げるとアクセス解析しているjetpack
とか、自動バックアップしているupdraftplus
とかですね。
そしてそして本番環境以外はメインカラーや管理画面カラー、さらにはfaviconをも変えて本番とそれ以外であることが一発でわかるようにしたいところです。
そういう環境毎の設定変更もコード化してしまうと楽です。
それは上記のexport_wp_data.php
とimport_wp_data.php
を呼び出すスクリプトを作ってそこに環境毎の設定変更するコードを書いてしまうことです。
それをここでは紹介します。
エクスポートを実行する関数
例えば僕の場合ですとエクスポートは以下のように関数として組み込んでいつでも実行出来るようにしています。
function export() {
$php = "/path/to/your/scripts/export_wp_data.php";
$w = "/path/to/your/wordpress/wp-load.php";
$e = "/path/to/your/export_data/";
$cmd = "php {$php} -w='{$w}' -e='{$e}'";
system($cmd);
}
インポートと環境設定変更を実行する関数
インポートする処理も関数化してzipファイルだけ引数で渡すようにしています。
function import($zip_file) {
// 本番環境へのインポートは基本不可とする
if (ENVIRONMENT == "master") {
die("本番にはインポート出来ません" . PHP_EOL);
}
$php = "/path/to/your/scripts/import_wp_data.php";
$z = "/path/to/your/export_data/{$zip_file}";
$w = "/path/to/your/wordpress/wp-load.php";
$s = "kahoo.blog"; // 本番からこの環境のホスト名に置換する
$r = "preview.kahoo.blog";
$cmd = "php {$php} -z='{$z}' -w='{$w}' -s='{$s}' -r='{$r}'";
system($cmd);
/* ここから本番データを適用後、環境ごとの設定変更 */
// WP関数を使いたい為まずwp-load.phpを読み込む
require_once $w;
// WPの公開関数を使って管理画面の配色変更
wp_update_user([
'ID' => 1, // メインユーザーなら1だが、それ以外の設定検討する必要がある
'admin_color' => "blue" // プロフィールで用意されている配色文字列
]);
// サイトアイコン(favicon)の変更(予め本番で画像をアップロードしている。)
update_option("site_icon", SITE_ICON_ID); // 画像の投稿ID
// 本番以外不必要なプラグインの無効化
$plugins = get_option('active_plugins');
$deactive_plugins = [ // 無効化するプラグイン名の列挙
"jetpack",
"updraftplus",
];
foreach ($plugins as $idx => $plugin) {
$plugin_dirname = explode("/", $plugin)[0]; // 最初のプラグインのディレクトリ名だけに合わせる
if (in_array($plugin_dirname, $deactive_plugins)) {
unset($plugins[$idx]); // 発見したら削除
}
}
$plugins = array_values($plugins); // 配列の添え字が崩れるので直す
update_option("active_plugins", $plugins); // 更新(WP関数の中でシリアライズされている)
// メインカラーの変更
$theme_setting = get_option('theme_mods_sango-theme-child');
if (isset($theme_setting["header_bc"])) {
$theme_setting["header_bc"] = ACCENT_COLOR;
}
if (isset($theme_setting["main_color"])) {
$theme_setting["main_color"] = ACCENT_COLOR;
}
if (isset($theme_setting["wid_title_bc"])) {
$theme_setting["wid_title_bc"] = ACCENT_COLOR;
}
update_option("theme_mods_sango-theme-child", $theme_setting); // 更新(WP関数の中でシリアライズされている)
}
ご覧のようにimport_wp_data.php
を実行後、ここでもwp-load.php
を読み込んでWordPressの用意された関数を使って諸々変更していくのです。
WordPress管理画面の配色変更・favicon変更・特定プラグインの無効化・メインカラーの変更 等ですね。
これらをコード化することで本当に1回のコマンドで全て整うというわけなのです。
僕の本番サイトは以下のようになっていますが、
1コマンドで以下のようなわかりやすいプレビュー環境が出来上がります(シャキーン)
faviconとメインカラーが変わっています。フロント表示時の管理画面バーの色は他に変える方法が他にあるみたいです。
そして管理画面です。
管理画面も配色が変わるので今どの環境を見ているのかが一目でわかりやすいです。
因みにjetpack
やupdraftplus
等の特定プラグインもバッチリ無効化出来ています。
ここには書いてないですがGoogle AnalyticsのID変更なども入れてもいいかもですね。
これで本番環境からのデータコピーがめちゃくちゃ楽になりました👌
Tips. 本番環境の移行にも使う方法
上記までは本番環境データを他環境データにコピーする方法の紹介でしたが、もちろん本番環境のサーバー移行にも使えるのでその手順を紹介します。
この場合は新規でDBにインポートするので上記スクリプトのwp-load.phpを読み込む方法が使えない為、直接DB接続情報をパラメータで渡す方法のスクリプトも用意しました。
最後のまとめからダウンロード出来るzipの中にimport_wp_data_direct.php
というファイルが入っているのでそちらをお使いください。
1. 旧サーバーから新サーバーにファイルのコピー
現状の本番環境のWordPressのファイル・ディレクトリをまるっと新サーバーにコピーします。
2. 新サーバーでDB接続情報を変更する
wp-config.php
には旧サーバーのDB接続情報となっているのでそれを新サーバーのDB接続情報に変更します。
3. 旧サーバーでエクスポートを実行
export_wp_data.php
を使ってzipファイルをエクスポートします。
1.でuploadsディクレトリもコピーしちゃってますが、まぁ下手に除外するよりは良いでしょう。
4. 新サーバーでインポートを実行
import_wp_data_direct.php
を使ってzipファイルをインポートします。
5. ドメインの向き先を変更
お名前.com等のDNSサービスの管理画面にログインして、本番ドメインの向き先を旧サーバーから新サーバーに変更します。
基本の流れはこれでOKです👌
まとめ
export_wp_data.php
とimport_wp_data.php
はzipでダウンロード出来るようにしたのでどうぞご自由にお使いください。
WordPressデータの移行スクリプトのzipファイル
※このスクリプトで発生するいかなる損害も一切の責任は負いかねますのでご了承ください。
ソースコードはもちろん改変してOKなのでどうぞご自由にお使いください。
簡単なコードなので例えばpluginsディレクトリもzipに含めたいという程度ならちょっとPHPを知っている人なら簡単に改変出来るかと思います。
このスクリプトを使っていつでもWordPressの本番環境のデータを他環境に同期出来るようにしておけば、WordPressサイトの開発スピードを加速させることが出来ます。
現場からは以上です!