プラグイン制作企画

all-in-one-migration を作ってみる | 止まらないバックアップリカバリープラグインの自作

この書き込みは、all-in-one-migration の真似をしてワードプレスを引っ越しさせるプラグインを作ろうという企画です。
出来上がったプラグインだけ欲しい方は
こちらから→wp_migration_yuzu

止まらない all-in-one-migrationもどきプグインの自作

ワードプレスの引っ越しといえば、all-in-one-migration の plugin を使います。
ごめん、この決めつけはマイブームwww

でも all-in-one-migration でバックアップ取ってたけどリカバリーできない!って、リカバリー中に止まりますというのはよく相談される。
バックアップの時に php のバージョンを合わせることと pluginを全部止めるってしておけば、大抵は問題なくリカバリーできます。

でも、よくわからない(多いのは独立したWEBデザイナーさん)方が
「なんかバックアップできるみたいだからいれてバックアップしてる。」
とか、
「やっぱバックアップは自動でやってほしい。このプラグインだと”できそうだから”」
とか、やっちゃってるんですよね。

いや、自分で使うツールなんだから最低でもリカバリーテストぐらいやりなさいよ。なんですけどね。

all-in-one-migration ならまだしも、ほかのバックアップツールの多くは有料にしないとリカバリーできないから。
all-in-one-migration は、まだ敷居が低いし無料でもなんとかできる(私は)

でも実際問題起っちゃうんですわ。
そうなったら今のところお手上げ。メタデータをバックアップしてきて復旧するしかない。
せめてプラグインの有効化フラグを倒せたら即メタでのリカバリーしなくていいんですけどね。
all-in-one-migration の中を探ってみたけど、単にDBリカバリーしてるだけでいちいち見てない。

ので、自作しようと。
折角なら、自作工程を書き残しておこうと。
all-in-one-migrationが、こうなればいいなぁと思ってるあなたの参考になれば。

ワードプレスのバックアップとリカバリーの方法

ワードプレスのバックアップ、リカバリーのプラグインを作るにあたって、ワードプレスのバックアップとリカバリーの方法を知らないとはじまりません。

ワードプレスの構成

ワードプレスは、ワードプレスのスクリプト(php,javascript,css)とデータベース(mysql)から成り立っています。
この二つを手元に保存するのがワードプレスのバックアップであり、その手元に保管したデータでワードプレスを再生するののがリカバリーです。

ワードプレスのバックアップ

ワードプレスは、前述のように、スクリプトとデータベースから成り立っています。

スクリプトはFTPでダウンロードします。
スクリプトには、ワードプレス本体と後から追加するデータ(メディア、テーマ、プラグイン)の2つがあります。

前者は、ワードプレスの公式サイトからもってくればいいので必ずしもバックアップする必要はありません。
後者の中のテーマ、プラグインもサイトから持ってくるなり、自身で保管しているでしょうからこれも必須ではありません。

ですが、メディア(画像、PDF 等)は、wp-content/upload/の保管されており、そのファイルはフォルダーとファイル名で、データベースのテーブルに結びつけられています。
そのためアップロード先のフォルダーとファイルの関係性が保たれていないといけないため、wp-content/uploads/ のフォルダーごとバックアップする必要があります。

まとめると、
  • phpmyadmin で、接頭辞の同じ(テーブル名の先頭の文字が同じもの)テーブルをテーブルごとに sql形式で保存
  • wpのフォルダー全部 (wpルート,wp-admin , wp-include , wp-content )をFTPでバックアップ

具体的なバックアップの方法は、こちらに記載してあります。
ワードプレスのバックアップを手動で行う方法(プラグインを使わないバックアップ)

ワードプレスのリカバリー

リカバリーは、簡単言うと
  • 各テーブルのsqlファイルをテキストエディタで開いて、前のURLを新しいURLに置き換える
  • 各テーブルのsqlファイルをテキストエディタで開いてテーブルプレフィックス(テーブル名接頭辞)を新しいテーブルプレフィックスに置き換える
  • phpmyadmin で各テーブルをデータベースに登録
  • wp-config.php のデータベース設定部分、テーブルプレフィックス部分を書き換えてアップロード
  • 普通にワードプレスの wp-login.php を呼びだす

具体的なリカバリーの方法は、こちらに記載してあります。
ワードプレスのリカバリーを手動で行う方法(プラグインを使わないリカバリー)


all-in-one-migration もどき制作工程(予定)

大まかな構造

バックアップ

1つのフォルダー内に
  • データベーステーブルフォルダー/SQLデータ
  • スクリプト
を保存。

保存したフォルダーを圧縮し、これをバックアップアップファイルとする。

リカバリー

  • 保存したバックアップファイルを解凍
  • データベーステーブルを順次データベースに保存
  • スクリプトを該当するフォルダーに上書きコピー
  • 解凍したフォルダーを削除


  1. 具体的なPHPでのバックアップ、リカバリーモジュールの作成
    以下の方法を確立します。

    • PHPでのデータベーステーブルのSQL保存方法
    • PHPでのフォルダーごと複写する方法
    • PHPでのフォルダーごと圧縮する方法
    • PHPでのフォルダーごと削除する方法

    • PHPでの圧縮ファイルの解凍方法
    • PHPでのフォルダーごと上書きコピーする方法
    • PHPでのSQLファイルのデータベーステーブルへの書き込み方法

    そして、これらを1回のプロセスで終わらせることは、サーバーのプロセスの実行時間にひっかかり不可能なため、JavaScriptで1作業づつ処理させる必要があります。
    よって、
    Javascriptで1プロセスづつPHPのプロセスを実行させる方法が必要になります。

    さらに、全体をプラグインとして、まとめるために「プラグインの作成方法」も必要です。

  2. プラグインの外回り制作
  3. データベーステーブルの出力
  4. テスト用サイトの設定
  5. データベーステーブルの入力
    データフォルダーの表示
    テスト用サイトでデータベーステーブルをリカバリーできるか?
  6. プラグイン/メディアの圧縮/解凍
    テスト用サイトで プラグイン/メディア リカバリー
  7. all-in-one にする
    止まらない all-in-one-migrationもどきのために javascriptでデータベーステーブルを分割保存
    止まらない all-in-one-migrationもどきのために javascriptでプラグインを保存
    止まらない all-in-one-migrationもどきのために javascriptでメディアを保存
  8. all-in-one ファイルの管理
    データファイルの表示
  9. 不要テーブル削除機能追加
  10. all-in-one-mirationモドキ機能追加

PHPでのデータベーステーブルのSQL保存方法

PHPでのデータベーステーブルのSQL保存方法は、いくつかあります。
でもデータ処理の柔軟性とサーバーの差異を吸収することを考えると mysqldump を使うのが一番楽なようです。
詳しくは、こちらから→PHPでのデータベーステーブルのSQL保存方法

PHPでのフォルダーごと複写する方法

PHPでのフォルダーごと複写する方法は、1コマンドで処理することができません。
再帰呼び出しをつかってフォルダーの中のフォルダーを追いかける形で処理します。
詳しくは、こちらから→PHPでのフォルダーごと複写する方法

PHPでのフォルダーごと圧縮する方法

PHPでのフォルダーごと圧縮する方法は、いくつか考えらますが、圧縮方法として ZipArchive のが標準的です。
ですが、ZipArchiveは、サーバーによってはインストールされていないことがあります。
そういうサーバーは、安いのですが、CMSを使えるサーバーとは呼べません。
CMS(ワードプレスなど)でサイトを運営するつもりんばラバ、サーバーを変えたほうがいいでしょう。

PHPでのフォルダーごと圧縮する方法、詳しくは、こちらから→PHPでのフォルダーごと圧縮する方法

PHPでのフォルダーごと削除する方法

PHPでのフォルダーごと削除する方法は、基本フォルダー内にフォルダーやファイルが存在していなければ rmdir で処理できます。
ただし、フォルダーの中にフォルダーやファイルがある場合には再帰呼び出して中にあるフォルダーやファイルを順次削除する必要があります。

PHPでのフォルダーごと削除する方法、詳しくは、こちらから→PHPでのフォルダーごと削除する方法

PHPでの圧縮ファイルの解凍方法

PHPでの圧縮ファイルの解凍方法は、1コマンドで処理できますが解凍場所をしてする必要があります。
解凍のオプションはたくさんあるので詳しく知りたい場合は、検索でオプションを調べるといいでしょう。

今回は、プラグインの一部となるので細かなオプションの説明は他の書き込みに譲ります。

PHPでの圧縮ファイルの解凍方法、詳しくは、こちらから→PHPでの圧縮ファイルの解凍方法

PHPでのフォルダーごと上書きコピーする方法

PHPでのフォルダーごと上書きコピーする方法は、再帰呼び出してフォルダー内を順番にコピーしていく必要があります。

具体的には、
PHPでのフォルダーごと上書きコピーする方法、詳しくは、こちらから→PHPでのフォルダーごと上書きコピーする方法

PHPでのSQLファイルのデータベーステーブルへの書き込み方法

PHPでのSQLファイルのデータベーステーブルへの書き込み方法は、一括で行う方法など様々ありますが、サイトの引っ越しなどを考慮しているためSQLコマンドを1つづつ処理する必要があります。
処理が必要というのは、移動先URLや、テーブル名などのsqlコマンドの文字列の置き換えです。

文字列を置き換えながら1つづつ sqlコマンドを実行する方法を選択します。
PHPでのSQLファイルのデータベーステーブルへの書き込み方法、詳しくは、こちらから→PHPでのSQLファイルのデータベーステーブルへの書き込み方法


Javascriptで1プロセスづつPHPのプロセスを実行させる方法

Javascriptで1プロセスづつPHPのプロセスを実行させる方法を解説します。

Javascriptで1プロセスづつPHPのプロセスを実行させる方法


サーバー上で動かすプロセスはサーバー側が設定した一定の時間内でしか動かすことができません。
そのジュ移管を越した時点でプロセスは強瀬的に終了させられてしまいます。
そのため時間のかかる処理を行う場合、プロセスをいくつかに分けて処理するようにします。

具体的には、JavaScriptをタイマーで動かし、プロセスを小分けにして処理します。
分割処理のひな型を作りましたので、詳しくはそちらでご確認ください。

今回のメイン構造になります。

Javascriptで1プロセスづつPHPのプロセスを実行させる方法、
詳しくは、こちらから→Javascriptで1プロセスづつPHPのプロセスを実行させる方法

プラグインの外回り制作

プラグインを作るときのひな型

ひな形を使って all-in-one-migrationもどきの外回り(オプション設定等)を制作。

プラグインの外回り制作の詳細はこちらから→プラグインのひな型を使って簡単にプラグインを作る

all-in-one-migrationもどきプラグイン雛形の改良

all-in-one-migrationもどきに必要なモジュールは、実際のバックアップリカバリーを行うページです。
となると、ひな形で残すのは、
  • プラグインヘッダ
  • バージョン番号
  • プラグイン名
  • プラグイン説明
  • トレース関数
  • フック
    コンテンツ置換
    設定画面
    ショートコード
  • ショートコード関数
  • コンテンツ置換関数
  • 設定画面設定
  • 設定画面関数
  • option文字列変換関数
  • デフォルト設定関数
  • 文字列置換関数(改行外す)
  • 文字列置換関数(改行)
  • 文字列置換関数(記号→特殊文字)
  • 文字列置換関数(特殊文字→記号)

all-in-one-migration もどきプラグインで雛形に追加する機能

all-in-one-migration もどきプラグインで雛形に追加する機能は、管理画面(設定-all-in-one-migrationモドキ設定画面)から全部呼び出す形になります。

  • エクスポート
    データベースエクスポート+圧縮
    プラグインフォルダー圧縮
    アップロードフォルダー圧縮
    データベース、プラグインフォルダー、アップロードフォルダー圧縮 → 圧縮
  • all-in-one-migrationモドキファイル一覧
    削除
    インポートへリンク
  • インポート
    解凍 → データベース書き込み → プラグイン、アップロードフォルダー展開

ファイルが大きくなった時PHPの実行時間がサーバーの制限を超す可能性があるので実際のエクスポート、インポートは、javascriptで php を呼び出す形にします。
そのため、データベーステーブルもテーブル単位で出力するようにします。

ここでデータベーステーブル一覧が必要になるわけですが、そうするとテーブル一覧からバックアップするテーブルを指示することも可能になるなと夢が膨らみます。

ワードプレスのデータベーステーブルの出力

ワードプレスのデータベーステーブルの出力を行うときに必要になるのがデータベースの情報です。
情報というより、使用中のデータベース名、そのデータベースを操作できるデータベースユーザーのIDとパスワード。
データベースがどこにあるか=データベースホスト名。
ターゲットのデータベース(現在ワードプレスが使っているデータベースのテーブルプレフィックス)

それらは、以下の変数に入っています。

  • データベース名:DB_NAME
  • データベースユーザーID:DB_USER
  • データベースユーザーパスワード:DB_PASSWORD
  • デーベースホスト:DB_HOST
  • データベーステーブルプレフィックス:global $table_prefix;

データベーステーブルの一覧

MySQLのデータベース
データベーステーブルのSQLファイル出力
(複数あるのでフォルダーに投げ込んでテストサイトに渡す)

※以下のモジュールは、テーブルの削除機能もいれてあります。
0001 /********************************************************/
0002 function wp_migration_yuzu_MySQLtable($php_v,$cmd)
0003 /********************************************************/
0004 {
0005
0006  global $table_prefix;
0007  global $wpdb;
0008  $db_name = DB_NAME;    //データベース名の取得
0009  $db_user = DB_USER;    //データベース接続ユーザーの取得
0010  $db_pass = DB_PASSWORD;   //データベース接続用パスワードの取得
0011  $db_host = DB_HOST;    //データベースホストの取得
0012  $db_pfix = $table_prefix;  //データベースホストの取得
0013  
0014  $link = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
0015  if (!$link) {
0016   return('');
0017  }
0018  $stack = array();
0019  // データ処理
0020  if($cmd == 'tablelist' || $cmd == 'tabledelete'){
0021   $sql = "SHOW ";
0022   $sql.= "TABLES ";
0023   $sql.= ";";
0024   if( $result = mysqli_query($link, $sql) ){
0025    while ($row = $result->fetch_row()) {
0026     if(substr($row[0],0,strlen($db_pfix))==$db_pfix ){
0027      // テーブル一覧
0028      $stack[] = $row[0];
0029      
0030      // 全テーブル削除
0031      if( $cmd == 'tabledelete' ){
0032       $sql = "DROP ";
0033       $sql.= "TABLE ";
0034       $sql.= $row[0];
0035       $sql.= ";";
0036       if( $resultA = mysqli_query($link, $sql) ){
0037        echo 'del query='.$sql.'
0038 ';
0039       }
0040      }
0041     }
0042    }
0043   }
0044  }
0045  mysqli_close($link);
0046  return($stack);
0047 }


テスト用サイトの設定

新しいワードプレスサイトの設定
すぐ再生できるように all-in-one-migration でバックアップしておきます。

データベーステーブルの入力

データベースバックアップ(フォルダー)からのデータベーステーブルのリカバリー
データベース内のURLの置き換え機能追加
リカバリー後ログインできるか確認

プラグイン/メディアの圧縮/解凍

プラグイン/メディアの zip 圧縮
プラグイン/メディアの zip 解凍

all-in-one にする

データベーステーブルフォルダーを圧縮
プラグインフォルダーを圧縮
データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の圧縮

データベースフォルダー圧縮ファイル、プラグインフォルダー圧縮ファイル、メディアフォルダーの圧縮 の解凍
データベーステーブルのリカバリー
データベース内のURLの置き換え
解凍フォルダーの削除

all-in-one ファイルの管理

all-in-one-migration もどきのファイル一覧作成
all-in-one-migration もどきのファイル一覧から解凍
all-in-one-migration もどきのファイル一覧から削除

不要テーブル削除機能追加

データベーステーブル一覧表示機能追加
データベーステーブル一覧からテーブルの削除機能追加

all-in-one-mirationモドキ機能追加

今のところ特に考えていない。
制作中に思いついたら書き足していく。
スポンサードリンク

関連記事一覧