Mengapa impor basis data saya kehilangan data widget teks?

46

Saya telah membuat situs di WordPress di mesin pengembangan kami. Dalam tema yang kami gunakan ada banyak zona widget untuk menampilkan teks di (bilah samping dan halaman depan). Saya telah menggunakan widget Teks sederhana di semua zona ini untuk menaruh informasi tampilan kami.

Ketika saya memigrasikan situs ke produksi, saya menggunakan plugin WP-DB-Backup untuk mengambil snapshot dari database. Saya kemudian mengedit file .sql yang dihasilkan untuk memperbarui semua jalur file dan referensi URL untuk menunjuk ke situs produksi kami.

Setelah membuat database, situs web, dan menyalin semua file ke situs produksi, saya menjalankan file .sql dari prompt perintah mysql untuk mengimpor data ke dalam database baru.

Namun, ketika saya pergi ke lokasi produksi, beberapa teks muncul dan sebagian tidak. Ketika saya melihat ke bagian widget situs, widget teks tidak ada di beberapa zona widget. Widget teks bahkan tidak terlihat di zona "Widget Tidak Aktif", mereka tidak ada di sana.

Saya bahkan telah mencoba mengulangi proses menggunakan plugin BackWPup, memperhatikan bahwa sintaks SQL berbeda ketika membuang database.

Mengapa saya kehilangan data widget teks selama impor?

Dillie-O
sumber
Saya telah melakukan beberapa penggalian di sepanjang jalan, dan satu-satunya hal yang dapat saya pikirkan adalah bahwa informasi widget disimpan di tabel wp_options, yang terlihat untuk menyandikan beberapa datanya dengan cara yang aneh. Saya belum dapat mencoba ini dengan tema yang berbeda untuk melihat apakah itu terkait tema.
Dillie-O

Jawaban:

44

Di sinilah masalah Anda:

Saya kemudian mengedit file .sql yang dihasilkan untuk memperbarui semua jalur file dan referensi URL untuk menunjuk ke situs produksi kami.

Kamu tidak bisa melakukan itu WordPress menyimpan banyak opsi sebagai "data berseri", yang berisi konten string hal-hal dan panjangnya . Jadi ketika Anda memodifikasi URL dan panjangnya berubah, maka data bersambung tidak lagi benar, dan PHP menolaknya.

Masalah jangka panjangnya adalah, pada dasarnya, Anda salah melakukannya. Jika Anda menyiapkan situs pengembangan yang datanya dimigrasikan, maka URL tersebut harus memiliki URL yang sama persis dengan situs produksi Anda. Anda dapat mengedit file HOSTS secara manual untuk memberikan domain IP (seperti example.com) alamat IP yang berbeda (seperti 127.0.0.1) dan dengan demikian URL "produksi" akan menjadi situs pengembangan, hanya untuk Anda. Kemudian Anda dapat membuat data dan tautan serta segala sesuatu lainnya menggunakan URL produksi itu, dan ketika Anda memigrasikan data, tidak ada yang harus diubah.

Namun, dalam jangka pendek, jangan gunakan pencarian / ganti teks sederhana pada file SQL. Seperti yang telah Anda temukan, ini merusak banyak hal.

Dan sementara saya ragu untuk menyarankannya, ada cara untuk mengubah kode inti WordPress untuk menangani serialisasi yang rusak ini. Anda harus memodifikasi file wp-include / functions.php, dan mengubah fungsi maybe_unserialize () menjadi ini:

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]); }  

Ini BUKAN solusi jangka panjang yang layak. Seharusnya hanya digunakan untuk membangunkan Anda dan bekerja sekarang. Dalam jangka panjang, Anda harus memperbaiki proses pengembangan Anda sehingga Anda tidak harus melakukan semacam ini URL untuk memulai.

Otto
sumber
@Otto jawaban yang sangat baik. Pertanyaan cepat, apakah memodifikasi gumpalan / tabel teks non serial seperti wp_posts di luar MySql akan memengaruhi data serial mana pun di wp_post_meta atau wp_options? Saya memiliki masalah yang sama dengan widget teks tetapi saya tidak menyentuh wp_options. Saya hanya memodifikasi wp_posts.
Chris_O
Wow, saya tidak pernah menyadari bahwa apa yang terjadi dengan data, tetapi itu masuk akal! Terimakasih banyak!
Dillie-O
4
Solusi lain yang digunakan beberapa orang adalah membuat sistem pengembangan mereka memiliki nama domain "example.dev" alih-alih "example.com". Dengan begitu, panjang tidak berubah untuk string ketika mereka memindahkannya ke produksi. Saya lebih suka metode file HOSTS.
Otto
3
2016 dan wordrepss masih menyimpan data serial dalam database. most famous worst codehadiah harus tidak terlihat lagi.
Ejaz
1
TERIMA KASIH!!! Poin bagus dan hack yang bagus. Secara umum saya mendapatkan peretasan ini untuk mengembalikan semua data dan setelah itu perbarui pengaturan yang ada lagi dan ketika menghapus kode ini bekerja dengan sempurna.
Ivijan Stefan Stipić
10

Untuk mengatasi masalah ini, saya selalu menggunakan alat Serialized Search & Replace WordPress yang disediakan di sini. Ini berfungsi dengan baik tanpa masalah. Saya telah menggunakan ini sejak lama pada semua persyaratan migrasi situs saya. Ini benar-benar mengatasi masalah dengan migrasi basis data pengembangan ke produksi.

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

Subharanjan
sumber
1
Ya telah menggunakan skrip ini selama bertahun-tahun dan sangat merekomendasikannya
davemac
Bekerja untuk saya sebagian besar waktu. Tapi minggu ini ketika saya digantikan http://localhost/Me/site_nameoleh http://site.dev(dari satu host lokal ke yang lain) menggunakan v 3.0.0 saya kehilangan widget dan posisi menu saya cukup aneh. Jadi mungkin masalah ini terkait dengan panjang string juga.
ulas
Saya telah menggunakan .. tetapi belum pernah menghadapi situasi ini. Bisakah Anda mengunduh skrip versi yang lebih lama dan mencobanya lagi. Coba ganti localhost/Me/site_namedengan site.dev.
Subharanjan
Url telah berubah (sekarang https, bukan http): interconnectit.com/products/…
Koryonik
Naskah yang indah. Saya menggandakan database MySQL dari PHPMyAdmin dari yang lama ke yang baru - tidak ada perubahan URL apa pun -, lalu pergi ke folder situs baru tempat file WP baru berada (di samping wp-config.php yang tepat, dengan kredensial DB baru), menambahkan skrip, dan mengurus semuanya. Data berseri diperbarui sepanjang URL normal. Mudah dan cepat! Sangat dianjurkan. Penting: jangan lupa untuk menghapus skrip setelah digunakan karena memiliki akses ke detail DB Anda!
Kacang
7

Jawaban Otto tepat. Saya juga menemukan ini dengan cara yang sulit.

Namun, saya berhasil mengatasi ini menggunakan skrip keren di http://spectacu.la/search-and-replace-for-wordpress-databases/

Untuk memigrasi wordpress Anda dan ke url / nama domain baru, lakukan hal berikut:

  1. Ambil dump DB (misalnya menggunakan phpmyadmin) dari wordpress yang ada
  2. Kembalikan dump apa adanya, (tidak perlu modifikasi) ke lokasi baru Anda
  3. Buka zip skrip dari spectacu.la ke folder home wordpress Anda (ini bukan plugin ...)
  4. Jalankan skrip di situs baru Anda dengan mengarahkan browser Anda ke sana, mis. Http: //new-website.url/searchreplacedb.php
  5. Jangan lupa untuk menghapus skrip dari rumah wordpress baru Anda
Yoav Aner
sumber
1
Saya tahu ini agak lama, tetapi di mana saya harus menentukan nama database baru jika saya mengembalikan dump seperti apa adanya? Bukankah seharusnya saya setidaknya memasukkan nama database baru di langkah kedua? Terima kasih atas info ini
andresmijares
Saya tidak yakin saya sepenuhnya memahami pertanyaan Anda. Memulihkan database dapat dilakukan dengan alat-alat seperti phpmyadmin dan Anda dapat memberikannya nama baru, atau menggunakan nama lama. Script yang saya sebutkan hanya mengubah teks di dalam database setelah sudah dipulihkan.
Yoav Aner
Hai Yoav, terima kasih atas jawabannya, maksud saya, ketika saya mengekspor DB, saya biasanya mengubah nama database ke yang baru dan mengubah tautan domain. Mengatakan ini, pada langkah nomor dua Anda mengatakan mengembalikan dump apa adanya tanpa modifikasi, saya hanya ingin tahu apakah itu secara harfiah, atau saya harus mengubah nama database setidaknya. Saya tahu ini bisa menjadi pertanyaan bodoh, saya hanya bingung, terima kasih lagi atas jawaban Anda
andresmijares
Saya tidak tahu bagaimana Anda membuang basis data Anda, tetapi jika Anda menggunakan alat 'ekspor' phpmyadmin, maka tidak masalah nama basis datanya. Anda dapat menggunakan ekspor dan mengimpornya kembali ke database lain. Secara umum, mengenai poin-2, saya pikir tidak apa-apa untuk mengubah nama database.
Yoav Aner
2

OP terlalu bersemangat ketika melakukan pencarian-dan-ganti pada file ekspor database, dan akhirnya mengubah kejadian "wp_" dalam beberapa data serial. Solusinya adalah untuk menjadi lebih pelit dalam pencarian-dan-ganti dengan memasukkan backtick dalam ekspresi reguler, dan kemudian secara manual memperbarui kunci yang tersisa dalam database setelah impor.

Jika Anda memigrasi dan mengubah awalan, dan menyukai pendekatan yang lebih manual, lakukan hal berikut (ini hanya membahas masalah OPs dan tidak berurusan dengan memperbarui URL situs)

  1. Cadangkan dan pindahkan database Anda mengekspor file SQL ke lingkungan baru (contoh saya mengasumsikan nama file backup_YYYY-MM-DD.sql)
  2. Lakukan pencarian massal dan ganti pada file SQL untuk mengubah nama tabel untuk menggunakan awalan baru Anda (SEBELUM mengimpor file SQL Anda!). Salah satu cara untuk melakukan ini adalah menggunakan Perl one-liner seperti: perl -p -i.bak -e "s /` wp_ / `myprefix_ / g" backup_YYYY-MM-DD.sql
  3. Impor data SQL Anda ke dalam basis data
  4. Perbarui kunci apa pun dalam _pilihan yang berisi kode awal awalan: perbarui myprefix_options set option_name = concat ('myprefix _', substr (option_name, 4)) di mana option_name seperti 'wp_%'
  5. Perbarui kunci apa pun di dalam _user_meta yang berisi awalan hard-kode: perbarui myprefix_usermeta set meta_key = concat ('myprefix _', substr (meta_key, 4)) di mana meta_key seperti 'wp_%'
Tom Auger
sumber
0

Saya menggunakan plugin WP Migrate , penyihir menggantikan patch http dan folder. Saya mendapat satu masalah saat mengimpor, tetapi memutuskan menempatkan baris berikut di bagian atas sql yang dihasilkan:

/*!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 */;

Saya juga mencoba dengan alat Pencarian dan Ganti (v2.1) yang dijawab oleh @Yoav, tetapi masih merusak data serial saya.

Ricardo Martins
sumber
Hai Ricardo, Selamat Datang di Jawaban WordPress! Area tempat Anda mengeposkan disediakan untuk jawaban atas pertanyaan awal. Meskipun pertanyaan Anda terkait, Anda harus mempostingnya sebagai pertanyaan terpisah. Anda akan mendapatkan kesempatan yang lebih baik untuk menjawabnya seperti itu.
Chris_O