データベースインポートでテキストウィジェットデータが失われるのはなぜですか?


46

開発用マシンのWordPressでサイトを作成しました。使用しているテーマには、テキストを表示するための多数のウィジェットゾーンがあります(サイドバーとフロントページ)。これらすべてのゾーンで単純なテキストウィジェットを使用して、表示情報を配置しました。

サイトを運用環境に移行したときに、WP-DB-Backupプラグインを使用してデータベースのスナップショットを作成しました。次に、結果の.sqlファイルを編集して、すべてのファイルパスとURL参照を更新して、運用サイトをポイントしました。

データベース、Webサイトを作成し、すべてのファイルを運用サイトにコピーした後、mysqlコマンドプロンプトから.sqlファイルを実行して、新しいデータベースにデータをインポートします。

ただし、本番サイトにアクセスすると、テキストの一部が表示され、一部は表示されません。サイトのウィジェットセクションを見ると、一部のウィジェットゾーンにテキストウィジェットがありません。テキストウィジェットは「非アクティブウィジェット」ゾーンにも表示されず、単に表示されません。

BackWPupプラグインを使用してプロセスを繰り返してみましたが、データベースをダンプするときにSQL構文が異なることに気付きました。

インポート中にテキストウィジェットデータが失われるのはなぜですか?


途中で掘り下げてきましたが、考えられる唯一のことは、ウィジェット情報がwp_optionsテーブルに格納されていることです。別のテーマでこれを試すことができず、テーマに関連しているかどうかを確認できませんでした。
ディリー-O

回答:


44

これが問題の原因です。

次に、結果の.sqlファイルを編集して、すべてのファイルパスとURL参照を更新して、運用サイトをポイントしました。

それはできません。WordPressは、多くのオプションを「シリアル化されたデータ」として保存します。これには、モノの文字列コンテンツとその長さの両方が含まれます。したがって、URLを変更して長さを変更すると、シリアル化されたデータは正しくなくなり、PHPはそれを拒否します。

長期的な問題は、基本的に、あなたが間違っていることです。データを移行する開発サイトをセットアップする場合、最初に運用サイトとまったく同じURLを使用する必要があります。HOSTSファイルを手動で編集して、その実稼働ドメイン(example.comなど)に異なるIPアドレス(127.0.0.1など)を与えることができるため、「実稼働」URLが開発サイトになります。その後、その実稼働URLを使用してデータとリンク、その他すべてを作成できます。データを移行する場合、変更する必要はありません。

ただし、短期的には、SQLファイルで単純なテキスト検索/置換を使用しないでください。あなたが発見したように、これは物事を壊します。

そして、私はそれを提案することをheしますが、これらの壊れたシリアル化を処理するために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改thisを最初から行う必要がないように、開発プロセスを修正する必要があります。


@オットー優れた答え。簡単な質問です。MySqlの外でwp_postsのようなシリアル化されていないblob / textテーブルを変更すると、wp_post_metaまたはwp_optionsのシリアル化されたデータに影響しますか?テキストウィジェットでも同じ問題がありましたが、wp_optionsには触れず、wp_postsのみを変更しました。
Chris_O

うわー、私はそれがデータで起こっていたことに気づきませんでしたが、それは完全に理にかなっています!どうもありがとう!
ディリー-O

4
一部の人々が使用する別の回避策は、開発システムに「example.com」ではなく「example.dev」のドメイン名を持たせることです。そうすれば、文字列を本番環境に移動しても、文字列の長さは変わりません。私はHOSTSファイル方式を好みます。
オットー

3
2016とwordrepssは、シリアル化されたデータをデータベースに保存しています。most famous worst code賞品はもう探す必要はありません。
エハズ

1
ありがとうございました!!!良い点と素晴らしいハック。一般的には、このハックを使用してすべてのデータを返します。その後、既存の設定を再度更新するだけで、このコードを削除しても完璧に機能します。
IvijanステファンStipić

10

この問題に対処するために、私は常にここで提供されるWordPress Serialized Search&Replaceツールを使用します。問題なく完全に機能します。私はすべてのサイト移行要件でこれを長い間使用しています。これにより、開発データベースを実稼働環境に移行する際の問題に本当に対処できます。

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/


1
はい、このスクリプトを何年も使用しており、強くお勧めします
-davemac

ほとんどの時間、私のために働いた。しかし今週、v 3.0.0を使用http://localhost/Me/site_nameしてhttp://site.dev(あるローカルホストから別のローカルホストに)置き換えたとき、奇妙なことにウィジェットとメニューの位置が失われました。したがって、おそらくこの問題は文字列の長さにも関係しています。
rhand

私は使用していましたが、まだこの状況に直面したことはありません。このスクリプトの古いバージョンをダウンロードして、もう一度試してください。に置き換えlocalhost/Me/site_nameてみてくださいsite.dev
スハラハンジャン14年

URLが変更されました(現在はhttpの代わりにhttps):interconnectit.com/products/…–
Koryonik

ゴージャスなスクリプト。PHPMyAdminのMySQLデータベースを古いものから新しいものに複製し(URLの変更は一切ありません)、新しいWPファイルがある新しいサイトのフォルダーに移動しました(適切なwp-config.phpとともに、新しいDB認証情報)、スクリプトを追加し、すべてを処理しました。シリアル化されたデータは、通常のURLに沿って更新されます。簡単かつ迅速に!強くお勧めします。重要:スクリプトは、DBの詳細にアクセスできるため、使用後に削除することを忘れないでください!
ピーナッツ

7

オットーの答えはスポットオンです。私もこれを難しい方法で発見しました。

ただし、http://spectacu.la/search-and-replace-for-wordpress-databases/にあるクールなスクリプトを使用して、この問題を回避することができました。

ワードプレスを新しいURL /ドメイン名に移行するには、次の手順を実行します。

  1. 既存のワードプレスのDBダンプを取得します(phpmyadminなどを使用)
  2. 新しい場所にダンプをそのまま(変更の必要なし)復元します。
  3. スクリプトをspectacu.laからwordpressホームフォルダーに解凍します(プラグインではありません...)
  4. ブラウザを指定して、新しいサイトでスクリプトを実行します(例:http://new-website.url/searchreplacedb.php)
  5. 新しいワードプレスのホームからスクリプトを削除することを忘れないでください

1
私はこれが古いことを知っていますが、ダンプをそのまま復元する場合、新しいデータベース名をどこで指定することになっていますか?少なくとも2番目のステップに新しいデータベース名を入れてはいけませんか?この情報をありがとう
-andresmijares

私はあなたの質問を完全に理解しているかどうかわかりません。データベースの復元は、phpmyadminなどのツールを使用して行うことができ、新しい名前を付けるか、古い名前を使用できます。前述のスクリプトは、データベース内のテキストが既に復元された後に単に変更します。
ヨーヴアナー

こんにちはYoav、答えをありがとう、つまり、DBをエクスポートするとき、通常はデータベース名を新しい名前に変更し、ドメインリンクを変更します。これは、ステップ2で、変更なしでダンプをそのまま復元すると言いますが、それが文字通りかどうか、または少なくともデータベース名を変更する必要があるかどうかを知りたいだけです。私はそれがダミーの質問になる可能性があることを知っています、私はちょうど失われました、
あなたの

データベースをどのようにダンプするかわかりませんが、phpmyadmin 'export'ツールを使用する場合、どのデータベース名であるかは関係ありません。エクスポートを使用して、他のデータベースにインポートして戻すことができます。一般的に、箇条書き2に関しては、データベース名を変更しても大丈夫だと思います。
ヨーヴアナー

2

OPは、データベースエクスポートファイルで検索と置換を行うときに熱心であり、シリアル化されたデータの一部で "wp_"の出現を変更することになりました。解決策は、正規表現内にバックティックを含め、インポート後にデータベース内の残りのキーを手動で更新することにより、検索と置換をより節約することです。

プレフィックスを移行および変更する場合、およびより手動のアプローチが必要な場合は、次の手順を実行します(これはOPの懸念事項にのみ対応し、サイトURLの更新は扱いません)

  1. データベースのエクスポートSQLファイルを新しい環境にバックアップおよび移動します(私の例では、backup_YYYY-MM-DD.sqlのファイル名を想定しています)
  2. SQLファイルを一括検索して置換し、新しいプレフィックスを使用するようにテーブル名を変更します(SQLファイルをインポートする前に!)。これを行う1つの方法は、perl -p -i.bak -e "s /` wp_ / `myprefix_ / g" backup_YYYY-MM-DD.sqlのようなPerlワンライナーを使用することです。
  3. SQLデータをデータベースにインポートします
  4. ハードコードされたプレフィックスを含む_options内のキーを更新します。update myprefix_options set option_name = concat( 'myprefix _'、substr(option_name、4))where option_name like 'wp_%'
  5. ハードコードされたプレフィックスを含む_user_meta内のすべてのキーを更新します。update myprefix_usermeta set meta_key = concat( 'myprefix _'、substr(meta_key、4))where meta_key like 'wp_%'

0

私はWP Migrateプラグインを使用し、httpとフォルダーのパッチを置き換えます。インポート時に1つの問題が発生しましたが、生成された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が応答するSearch And Replaceツール(v2.1)を試しましたが、シリアル化されたデータが破損します。


こんにちはRicardo、WordPress Answersへようこそ!投稿したエリアは、元の質問への回答用に予約されています。質問が関連している場合でも、別の質問として投稿する必要があります。あなたはそれがそのように答えられるはるかに良いチャンスを得るでしょう。
Chris_O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.