私は私たちの開発マシン上にWordPressでサイトを作成しました。私たちが使用しているテーマには、テキストを表示するためのウィジェットゾーンが多数あります(サイドバーとフロントページ)。表示情報を入れるために、これらのゾーンすべてで単純なテキストウィジェットを使用しました。
サイトを本番に移行したときに、WP-DB-Backupプラグインを使用してデータベースのスナップショットを作成しました。次に、作成した.sqlファイルを編集して、すべてのファイルパスとURL参照を更新して私たちの本番サイトを指すようにしました。
データベース、Webサイトを作成し、すべてのファイルを本番サイトにコピーした後、mysqlコマンドのPromptから新しいデータベースにデータをインポートするための.sqlファイルを実行します。
しかし、私が本番サイトにアクセスすると、一部のテキストが表示され、一部のテキストは表示されません。私がサイトのウィジェットセクションを見ると、テキストウィジェットがいくつかのウィジェットゾーンからなくなっています。テキストウィジェットは「Inactive Widget」ゾーンにも表示されず、単に存在しません。
BackWPupプラグインを使用してプロセスを繰り返すことを試みましたが、データベースをダンプするときにSQL構文が異なることに気付きました。
インポート中にテキストウィジェットデータが失われるのはなぜですか?
これはあなたの問題があるところです:
次に、作成した.sqlファイルを編集して、すべてのファイルパスとURL参照を更新して私たちの本番サイトを指すようにしました。
それはできません。 WordPressは多くのオプションを "シリアライズされたデータ"として保存します。これには、 の文字列の内容とそれらの長さ の両方が含まれます。そのため、URLを変更して長さを変更すると、シリアル化されたデータは正しくなくなり、PHPはそれを拒否します。
長期的な問題は、基本的に、あなたがそれを間違ってやっているということです。データを移行する開発サイトを設定する場合は、最初に本番サイトとまったく同じURLを使用する必要があります。 HOSTSファイルを手動で編集して、その本番ドメイン(example.comなど)に別のIPアドレス(127.0.0.1など)を指定すると、「本番」URLが開発サイトになります。そうすれば、その本番URLを使用してデータやリンク、その他すべてを作成できます。データを移行しても、それに関する変更は必要ありません。
ただし、短期的には、SQLファイルに対して単純なテキスト検索/置換を使用しないでください。あなたが発見したように、これは物事を壊します。
そして私がそれを提案することを躊躇しながら、これらの壊れたシリアル化を処理するためにWordPressのコアコードを変更する方法があります。あなたはwp-includes/functions.phpファイルを修正し、maybe_unserialize()関数をこれに変更しなければなりません:
function maybe_unserialize( $original ) {
if ( is_serialized( $original ) ) {
$fixed = preg_replace_callback(
'!(?<=^|;)s:(\d+)(?=:"(.*?)";(?:}|a:|s:|b:|i:|o:|N;))!s',
'serialize_fix_callback',
$original );
return @unserialize( $fixed );
}
return $original;
}
function serialize_fix_callback($match) { return 's:' . strlen($match[2]); }
これは実行可能な長期的な解決策ではありません。それはあなたを今立ち上げて動かすためだけに使われるべきです。長期的には、開発プロセスを修正する必要があるため、最初からこのようなURLの変更を行う必要はありません。
この問題に対処するために、私はいつも WordPress Serialized Search&Replace を使います。それはどんな問題もなく完全にうまくいきます。私はすべての私のサイト移行要件でこれを長い間使っています。これは実際に開発用データベースを本番環境に移行する際の問題を処理します。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/ /
オットーの答えはその場です。私もこれを難しい方法で発見しました。
しかし、 http://spectacu.la/search-and-replace-for-wordpress-databases/ にあるクールなスクリプトを使用して、これを回避することができました。
ワードプレスを新しいURL /ドメイン名に移行するには、次の手順に従います。
データベースエクスポートファイルで検索と置換を実行すると、OPが非常に面倒で、いくつかのシリアル化されたデータ内で "wp_"の出現箇所が変更されました。解決策は、正規表現内にバックティックを含めて、インポート後にデータベース内の残りのキーを手動で更新することによって、検索と置換をより節約することです。
手動でプレフィックスを移行したり変更したりする場合は、次の手順を実行します(これはOPの懸念事項にのみ対処し、サイトのURLの更新は扱いません)。
WP Migrate pluginを使用しました。httpとフォルダのパッチを魔女に置き換えました。インポート時に単一の問題が発生しましたが、生成されたSQLの先頭に次の行を追加することで解決しました。
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
私は@Yoavで答えた検索と置換ツール(v2.1)を使っても試したが、それでもシリアル化されたデータは壊れる。