ทำไมการนำเข้าฐานข้อมูลของฉันถึงสูญเสียข้อมูลวิดเจ็ตข้อความ


46

ฉันได้สร้างเว็บไซต์ใน WordPress บนเครื่องพัฒนาของเราแล้ว ในชุดรูปแบบที่เราใช้นั้นมีโซนวิดเจ็ตมากมายที่จะแสดงข้อความใน (แถบด้านข้างและหน้าแรก) ฉันใช้วิดเจ็ตข้อความธรรมดาในทุกโซนเหล่านี้เพื่อใส่ข้อมูลการแสดงผลของเรา

เมื่อฉันย้ายเว็บไซต์ไปยังการผลิตฉันใช้ปลั๊กอิน WP-DB-Backup เพื่อถ่ายภาพฐานข้อมูล จากนั้นฉันแก้ไขไฟล์. sql ที่เป็นผลลัพธ์เพื่ออัปเดตพา ธ ไฟล์และการอ้างอิง URL ทั้งหมดเพื่อชี้ไปยังไซต์ที่ใช้งานจริงของเรา

หลังจากสร้างฐานข้อมูลเว็บไซต์และคัดลอกไฟล์ทั้งหมดไปยังไซต์ที่ผลิตแล้วฉันรันไฟล์. sql จากพรอมต์คำสั่ง mysql เพื่อนำเข้าข้อมูลไปยังฐานข้อมูลใหม่

อย่างไรก็ตามเมื่อฉันไปที่ไซต์การผลิตบางข้อความปรากฏขึ้นและบางส่วนไม่ เมื่อฉันดูในส่วนวิดเจ็ตของไซต์วิดเจ็ตข้อความหายไปจากบางส่วนของวิดเจ็ตโซน วิดเจ็ตข้อความไม่สามารถมองเห็นได้ในโซน "Inactive Widget" แต่มันไม่ได้อยู่ที่นั่น

ฉันได้พยายามทำซ้ำกระบวนการโดยใช้ปลั๊กอิน BackWPup โดยสังเกตว่าไวยากรณ์ SQL นั้นแตกต่างกันเมื่อมันทิ้งฐานข้อมูลออก

เหตุใดฉันจึงสูญเสียข้อมูลวิดเจ็ตข้อความในระหว่างการนำเข้า


ฉันขุดไปเรื่อย ๆ และสิ่งเดียวที่ฉันคิดได้ก็คือข้อมูลวิดเจ็ตถูกจัดเก็บไว้ในตาราง wp_options ซึ่งดูเหมือนจะเข้ารหัสข้อมูลบางอย่างในแบบแปลก ๆ ฉันไม่สามารถลองใช้ชุดรูปแบบที่แตกต่างกันเพื่อดูว่าเป็นชุดรูปแบบที่เกี่ยวข้องหรือไม่
Dillie-O

คำตอบ:


44

นี่คือปัญหาของคุณ:

จากนั้นฉันแก้ไขไฟล์. sql ที่เป็นผลลัพธ์เพื่ออัปเดตพา ธ ไฟล์และการอ้างอิง URL ทั้งหมดเพื่อชี้ไปยังไซต์ที่ใช้งานจริงของเรา

คุณทำอย่างนั้นไม่ได้ WordPress เก็บตัวเลือกมากมายเป็น "ข้อมูลต่อเนื่อง" ซึ่งมีทั้งเนื้อหาสตริงของสิ่งต่าง ๆและความยาวของมัน ดังนั้นเมื่อคุณแก้ไข URL และการเปลี่ยนแปลงความยาวข้อมูลที่ต่อเนื่องจะไม่ถูกต้องอีกต่อไปและ PHP จะปฏิเสธ

ปัญหาระยะยาวคือโดยพื้นฐานแล้วคุณทำผิด หากคุณกำลังตั้งค่าไซต์การพัฒนาที่จะมีการย้ายข้อมูลของมันก็ควรจะมี URL เดียวกับเว็บไซต์ที่ใช้งานจริงของคุณ คุณสามารถแก้ไขไฟล์โฮสต์ของคุณด้วยตนเองเพื่อให้โดเมนการผลิตนั้น (เช่น example.com) ที่อยู่ IP ที่แตกต่างกัน (เช่น 127.0.0.1) ดังนั้น URL "การผลิต" จะกลายเป็นไซต์การพัฒนาสำหรับคุณเท่านั้น จากนั้นคุณสามารถสร้างข้อมูลและลิงก์และทุกสิ่งอื่น ๆ โดยใช้ URL ที่ใช้งานจริงนั้นและเมื่อคุณย้ายข้อมูลไม่ต้องทำการเปลี่ยนแปลงใด ๆ

อย่างไรก็ตามในระยะสั้นอย่าใช้การค้นหา / แทนที่ข้อความธรรมดาในไฟล์ SQL ในขณะที่คุณค้นพบสิ่งนี้จะทำลายสิ่งต่างๆ

และในขณะที่ฉันลังเลที่จะแนะนำมันมีวิธีในการเปลี่ยนรหัสหลักของ WordPress เพื่อจัดการอนุกรมที่ไม่ต่อเนื่องเหล่านี้ คุณต้องแก้ไขไฟล์ wp-include / Functions.php และเปลี่ยนฟังก์ชันบางที _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 ประเภทนี้ที่เริ่มต้นด้วย


@ เป็นคำตอบที่ยอดเยี่ยม คำถามด่วนจะแก้ไขตาราง Blob / text ที่ไม่ต่อเนื่องเช่น wp_posts นอก MySql มีผลต่อข้อมูลใด ๆ ที่เป็นอนุกรมใน wp_post_meta หรือ wp_options หรือไม่ ฉันมีปัญหาเดียวกันกับวิดเจ็ตข้อความ แต่ฉันไม่ได้สัมผัส wp_options ฉันแก้ไข wp_posts เท่านั้น
Chris_O

ว้าวฉันไม่เคยรู้เลยว่านั่นคือสิ่งที่เกิดขึ้นกับข้อมูล แต่มันก็สมเหตุสมผลดี! ขอบคุณมาก!
Dillie-O

4
วิธีแก้ปัญหาอื่นที่บางคนใช้คือทำให้ระบบการพัฒนาของพวกเขามีชื่อโดเมน "example.dev" แทนที่จะเป็น "example.com" ด้วยวิธีนี้ความยาวจะไม่เปลี่ยนแปลงสำหรับสตริงเมื่อพวกเขาย้ายไปผลิต ฉันชอบวิธีการโฮสต์ไฟล์
อ็อตโต

3
2559 และ wordrepss ยังคงบันทึกข้อมูลต่อเนื่องในฐานข้อมูล most famous worst codeรางวัลไม่ต้องมองไกล
Ejaz

1
ขอขอบคุณ!!! จุดดีและแฮ็คที่ยอดเยี่ยม Generaly ฉันได้รับแฮ็คนี้เพื่อคืนกลับข้อมูลทั้งหมดและหลังจากนั้นเพียงอัปเดตการตั้งค่าที่มีอยู่อีกครั้งและเมื่อลบรหัสนี้ทำงานได้อย่างสมบูรณ์
Ivijan Stefan Stipić

10

เพื่อจัดการกับปัญหานี้ฉันมักจะใช้เครื่องมือค้นหาและแทนที่แบบต่อเนื่องของ WordPressที่มีให้ที่นี่ มันทำงานได้อย่างสมบูรณ์แบบโดยไม่มีปัญหาใด ๆ ฉันใช้สิ่งนี้มาเป็นเวลานานสำหรับความต้องการการย้ายข้อมูลเว็บไซต์ของฉัน สิ่งนี้จะดูแลปัญหาเกี่ยวกับการย้ายฐานข้อมูลการพัฒนาไปสู่การผลิต

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


1
ใช่ใช้สคริปต์นี้มานานหลายปีและแนะนำเป็นอย่างยิ่ง
davemac

ทำงานให้ฉันเกือบตลอดเวลา แต่สัปดาห์นี้เมื่อฉันแทนที่http://localhost/Me/site_nameด้วยhttp://site.dev(จากโฮสต์ท้องถิ่นหนึ่งไปยังอีกโฮสต์) โดยใช้ v 3.0.0 ฉันทำเครื่องมือและเมนูของฉันหายไปอย่างผิดปกติ ดังนั้นบางทีปัญหานี้เกี่ยวข้องกับความยาวของสตริงเช่นกัน
rhand

ฉันใช้งานมาแล้วแต่ยังไม่เคยเจอสถานการณ์แบบนี้มาก่อน คุณสามารถดาวน์โหลดสคริปต์รุ่นเก่ากว่านี้แล้วลองอีกครั้งได้ไหม ลองเปลี่ยนด้วยlocalhost/Me/site_name site.dev
Subharanjan

เปลี่ยน URL แล้ว (ตอนนี้เป็น https แทน http): interconnectit.com/products/ …
Koryonik

สคริปต์ที่งดงาม ฉันทำซ้ำฐานข้อมูล MySQL จาก PHPMyAdmin จากเก่าไปเป็นใหม่ไม่เปลี่ยน URL ใด ๆ จากนั้นไปที่โฟลเดอร์ของเว็บไซต์ใหม่ที่มีไฟล์ WP สด (ควบคู่ไปกับ wp-config.php ที่เหมาะสมพร้อมกับ ข้อมูลประจำตัวของฐานข้อมูลใหม่) เพิ่มสคริปต์และดูแลทุกอย่าง ข้อมูลต่อเนื่องจะได้รับการอัปเดตตาม URL ปกติ ง่ายและรวดเร็ว! แนะนำเป็นอย่างยิ่ง สำคัญ: อย่าลืมลบสคริปต์หลังจากใช้งานแล้วเนื่องจากสามารถเข้าถึงรายละเอียดฐานข้อมูลของคุณได้!
ถั่วลิสง

7

คำตอบของ Otto นั้นตรงจุด ฉันค้นพบสิ่งนี้ด้วยวิธีที่ยากลำบาก

อย่างไรก็ตามฉันจัดการเพื่อหลีกเลี่ยงปัญหานี้โดยใช้สคริปต์ที่ยอดเยี่ยมที่http://spectacu.la/search-and-replace-for-wordpress-databases/

ในการโอนย้าย wordpress ของคุณและไปยัง URL ใหม่ / ชื่อโดเมนให้ทำดังต่อไปนี้:

  1. ใช้ดัมพ์ DB (เช่นใช้ phpmyadmin) ของเวิร์ดเพรสที่มีอยู่
  2. คืนค่าดัมพ์ตามสภาพเดิม (ไม่จำเป็นต้องแก้ไข) ไปยังตำแหน่งใหม่ของคุณ
  3. แตกซิปสคริปต์จาก spectacu.la ลงในโฟลเดอร์บ้าน wordpress ของคุณ (ไม่ใช่ปลั๊กอิน ... )
  4. เรียกใช้สคริปต์บนไซต์ใหม่ของคุณโดยชี้เบราว์เซอร์ของคุณไปที่เช่นhttp: //new-website.url/searchreplacedb.php
  5. อย่าลืมลบสคริปต์จาก wordpress home ใหม่ของคุณ

1
ฉันรู้ว่านี่เป็นรุ่นเก่า แต่ฉันควรระบุชื่อฐานข้อมูลใหม่หากฉันกู้คืนดัมพ์ตามเดิมหรือไม่ อย่างน้อยฉันไม่ควรใส่ชื่อฐานข้อมูลใหม่ในขั้นตอนที่สอง? ขอบคุณสำหรับข้อมูลนี้
andresmijares

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณอย่างเต็มที่ การกู้คืนฐานข้อมูลสามารถทำได้ด้วยเครื่องมือเช่น phpmyadmin และคุณสามารถตั้งชื่อใหม่หรือใช้ชื่อเดิม สคริปต์ที่ฉันพูดถึงเพียงแค่เปลี่ยนข้อความภายในฐานข้อมูลหลังจากที่กู้คืนแล้ว
Yoav Aner

สวัสดี Yoav ขอบคุณสำหรับคำตอบฉันหมายถึงเมื่อฉันส่งออกฐานข้อมูลปกติแล้วฉันจะเปลี่ยนชื่อฐานข้อมูลเป็นชื่อใหม่และเปลี่ยนการเชื่อมโยงโดเมน กล่าวอย่างนี้ในขั้นตอนที่สองคุณบอกว่าคืนค่าการถ่ายโอนข้อมูลตามที่เป็นโดยไม่มีการดัดแปลงฉันแค่อยากจะรู้ว่าอย่างแท้จริงหรือฉันต้องเปลี่ยนชื่อฐานข้อมูลอย่างน้อย ฉันรู้ว่ามันอาจเป็นคำถามจำลองฉันแค่หลงทางขอบคุณอีกครั้งสำหรับคำตอบของคุณ
andresmijares

ฉันไม่ทราบวิธีที่คุณถ่ายโอนฐานข้อมูลของคุณ แต่ถ้าคุณใช้เครื่องมือ 'ส่งออก' phpmyadmin แล้วมันไม่สำคัญว่าชื่อฐานข้อมูลใด คุณสามารถใช้การส่งออกและนำเข้ากลับไปยังฐานข้อมูลอื่น ๆ โดยทั่วไปเกี่ยวกับสัญลักษณ์แสดงหัวข้อ 2 ฉันคิดว่าไม่เป็นไรที่จะเปลี่ยนชื่อฐานข้อมูล
Yoav Aner

2

OP ทำมากเกินไปเมื่อทำการค้นหาและแทนที่ในไฟล์เอ็กซ์พอร์ตฐานข้อมูลและสิ้นสุดการเปลี่ยนแปลงที่เกิดขึ้นของ "wp_" ภายในข้อมูลอนุกรมบางส่วน การแก้ปัญหาคือให้ละเอียดมากขึ้นในการค้นหาและแทนที่โดยรวม backtick ภายในนิพจน์ปกติแล้วปรับปรุงคีย์ที่เหลือภายในฐานข้อมูลด้วยตนเองหลังจากนำเข้า

หากคุณกำลังโยกย้ายและเปลี่ยนคำนำหน้าและเช่นเดียวกับวิธีการที่ต้องทำด้วยตนเองให้ทำดังนี้

  1. สำรองและย้ายฐานข้อมูล SQL ไฟล์ของคุณส่งออกไปยังสภาพแวดล้อมใหม่ (ตัวอย่างของฉันถือว่าชื่อไฟล์ของ backup_YYYY-MM-DD.sql)
  2. ทำการค้นหาและแทนที่จำนวนมากในไฟล์ SQL เพื่อเปลี่ยนชื่อตารางเพื่อใช้คำนำหน้าใหม่ของคุณ (ก่อนจะนำเข้าไฟล์ SQL ของคุณ!) วิธีหนึ่งในการทำเช่นนี้คือการใช้ Perl one-liner เช่น: perl -p -i.bak -e "s /` wp_ / `myprefix_ / g" backup_YYYY-MM-DD.sql
  3. นำเข้าข้อมูล SQL ของคุณไปยังฐานข้อมูล
  4. อัปเดตคีย์ใด ๆ ภายใน _options ที่มีคำนำหน้าฮาร์ดโค้ด: อัปเดต myprefix_options ตั้ง option_name = concat ('myprefix _', substr (option_name, 4)) โดยที่ option_name เช่น 'wp_%'
  5. อัปเดตคีย์ใด ๆ ภายใน _user_meta ที่มีคำนำหน้าฮาร์ดโค้ด: อัปเดต myprefix_usermeta ตั้ง meta_key = concat ('myprefix _', substr (meta_key, 4)) โดยที่ meta_key เช่น 'wp_%'

0

ฉันใช้WP Migrate plugin แม่มดจะแทนที่ http และโฟลเดอร์ patches ฉันมีปัญหาเดียวเมื่อนำเข้า แต่แก้ไขการวางบรรทัดต่อไปนี้ที่ด้านบนของ 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 */;

ฉันลองใช้เครื่องมือค้นหาและแทนที่ (v2.1) ตอบกลับโดย @Yoav แต่ก็ยังแบ่งข้อมูลต่อเนื่องของฉัน


สวัสดี Ricardo ยินดีต้อนรับสู่คำตอบของ WordPress! พื้นที่ที่คุณโพสต์ไว้สงวนไว้สำหรับคำตอบของคำถามเดิม แม้ว่าคำถามของคุณเกี่ยวข้องกับคุณควรโพสต์เป็นคำถามแยกต่างหาก คุณจะได้รับโอกาสที่ดีกว่าในการตอบคำถามแบบนี้
Chris_O
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.