Tại sao cơ sở dữ liệu của tôi nhập dữ liệu mất dữ liệu widget văn bản?


46

Tôi đã tạo một trang web trong WordPress trên máy phát triển của chúng tôi. Trong chủ đề chúng tôi đang sử dụng, có rất nhiều vùng widget để hiển thị văn bản trong (thanh bên và trang trước). Tôi đã sử dụng các tiện ích văn bản đơn giản trong tất cả các khu vực này để đưa thông tin hiển thị của chúng tôi.

Khi tôi di chuyển trang web sang sản xuất, tôi đã sử dụng plugin WP-DB-Backup để chụp ảnh cơ sở dữ liệu. Sau đó tôi đã chỉnh sửa tệp .sql kết quả để cập nhật tất cả các đường dẫn tệp và tham chiếu URL để trỏ đến trang web sản xuất của chúng tôi.

Sau khi tạo cơ sở dữ liệu, trang web và sao chép tất cả các tệp vào trang sản xuất, tôi chạy tệp .sql từ dấu nhắc lệnh mysql để nhập dữ liệu vào cơ sở dữ liệu mới.

Tuy nhiên, khi tôi đi đến trang sản xuất, một số văn bản xuất hiện và một số thì không. Khi tôi nhìn vào phần widget của trang web, các widget văn bản bị thiếu trong một số vùng widget. Các tiện ích văn bản thậm chí không hiển thị trong vùng "Tiện ích không hoạt động", đơn giản là chúng không có ở đó.

Tôi thậm chí đã cố gắng lặp lại quá trình sử dụng plugin BackWPup, nhận thấy rằng cú pháp SQL khác khi nó loại bỏ cơ sở dữ liệu.

Tại sao tôi mất dữ liệu widget văn bản trong quá trình nhập?


Tôi đã thực hiện một số hoạt động đào bới trên đường đi và điều duy nhất tôi có thể nghĩ là thông tin widget đang được lưu trữ trong bảng wp_options, có vẻ như mã hóa một số dữ liệu của nó theo một cách kỳ lạ. Tôi chưa thể thử điều này với một chủ đề khác để xem nó có liên quan đến chủ đề không.
Dillie-O

Câu trả lời:


44

Đây là vấn đề của bạn là:

Sau đó tôi đã chỉnh sửa tệp .sql kết quả để cập nhật tất cả các đường dẫn tệp và tham chiếu URL để trỏ đến trang web sản xuất của chúng tôi.

Bạn không thể làm điều đó. WordPress lưu trữ nhiều tùy chọn dưới dạng "dữ liệu tuần tự", chứa cả nội dung chuỗi của sự vật và độ dài của chúng . Vì vậy, khi bạn sửa đổi URL và độ dài thay đổi, thì dữ liệu được tuần tự hóa không còn đúng nữa và PHP từ chối nó.

Vấn đề dài hạn hơn là về cơ bản, bạn đang làm sai. Nếu bạn đang thiết lập một trang web phát triển sẽ di chuyển dữ liệu của nó, thì nó sẽ có cùng một URL chính xác như trang web sản xuất của bạn để bắt đầu. Bạn có thể chỉnh sửa thủ công tệp HOSTS của mình để cung cấp cho miền sản xuất đó (như example.com) một địa chỉ IP khác (như 127.0.0.1) và do đó, URL "sản xuất" sẽ chỉ trở thành trang web phát triển. Sau đó, bạn có thể tạo dữ liệu và liên kết của mình và mọi thứ khác bằng URL sản xuất đó và khi bạn di chuyển dữ liệu, không có gì phải thay đổi.

Tuy nhiên, trong ngắn hạn, không sử dụng tìm kiếm / thay thế văn bản đơn giản trên tệp SQL. Như bạn đã phát hiện ra, điều này phá vỡ mọi thứ.

Và trong khi tôi ngần ngại đề xuất nó, có một cách để thay đổi mã lõi WordPress để xử lý các tuần tự bị hỏng này. Bạn phải sửa đổi tệp wp-gồm / Hàm.php và thay đổi hàm may_unserialize () thành:

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

Đây KHÔNG phải là một giải pháp lâu dài khả thi. Nó chỉ nên được sử dụng để giúp bạn đứng dậy và làm việc ngay bây giờ. Về lâu dài, bạn cần sửa chữa quy trình phát triển của mình để không phải thực hiện loại URL này để bắt đầu.


@Otto câu trả lời tuyệt vời. Câu hỏi nhanh, liệu sửa đổi bảng blob / văn bản không được tuần tự hóa như wp_posts bên ngoài MySql có tác dụng bất kỳ dữ liệu được tuần tự hóa nào trong wp_post_meta hoặc wp_options không? Tôi gặp vấn đề tương tự với tiện ích văn bản nhưng tôi không chạm vào wp_options tôi chỉ sửa đổi wp_posts.
Chris_O

Wow, tôi không bao giờ nhận ra đó là những gì đang xảy ra với dữ liệu, nhưng nó hoàn toàn có ý nghĩa! Cảm ơn nhiều!
Dillie-O

4
Một cách giải quyết khác mà một số người sử dụng là làm cho hệ thống phát triển của họ có tên miền là "example.dev" thay vì "example.com". Theo cách đó, độ dài không thay đổi cho chuỗi khi chúng chuyển chúng sang sản xuất. Tôi thích phương pháp tập tin HOSTS.
Otto

3
2016 và wordrepss vẫn đang lưu dữ liệu tuần tự trong cơ sở dữ liệu. most famous worst codeGiải thưởng phải nhìn xa hơn.
Ejaz

1
CẢM ƠN BẠN!!! Điểm tốt và hack tuyệt vời. Tôi đã nhận được bản hack này để trả lại tất cả dữ liệu và sau đó chỉ cần cập nhật lại các cài đặt hiện có và khi loại bỏ mã này hoạt động hoàn hảo.
Ivijan Stefan Stipić

10

Để giải quyết vấn đề này, tôi luôn sử dụng công cụ Tìm kiếm & Thay thế nối tiếp WordPress được cung cấp tại đây. Nó hoạt động hoàn toàn tốt với bất kỳ vấn đề. Tôi đã sử dụng điều này trong một thời gian dài cho tất cả các yêu cầu di chuyển trang web của tôi. Điều này thực sự quan tâm đến các vấn đề với việc chuyển cơ sở dữ liệu phát triển sang sản xuất.

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


1
Có đã sử dụng tập lệnh này trong nhiều năm và rất khuyến khích nó
davemac

Làm việc cho tôi hầu hết thời gian. Nhưng tuần này khi tôi thay thế http://localhost/Me/site_namebằng http://site.dev(từ một máy chủ cục bộ sang một máy chủ khác) bằng cách sử dụng phiên bản 3.0.0, tôi đã mất các vị trí phụ tùng và menu của mình một cách kỳ lạ. Vì vậy, có lẽ vấn đề này cũng liên quan đến chiều dài chuỗi.
rhand

Tôi đã sử dụng .. nhưng chưa bao giờ phải đối mặt với tình huống này. Bạn có thể tải xuống phiên bản cũ hơn của tập lệnh này và thử lại với tập lệnh đó không. Hãy thử thay thế localhost/Me/site_namebằng site.dev.
Subharanjan

Url đã thay đổi (bây giờ là https thay vì http): interconnectit.com/products/ từ
Koryonik

Kịch bản tuyệt đẹp. Tôi đã sao chép cơ sở dữ liệu MySQL từ PHPMyAdmin từ một cái cũ sang một cái mới - không thay đổi URL nào - sau đó đi đến thư mục của trang web mới nơi chứa các tệp WP mới (cùng với wp-config.php thích hợp, với thông tin đăng nhập DB mới), thêm tập lệnh và nó xử lý mọi thứ. Dữ liệu nối tiếp được cập nhật dọc theo các URL thông thường. Dễ dàng và nhanh chóng! Rat khuyen khich. Quan trọng: đừng quên xóa tập lệnh sau khi nó được sử dụng vì nó có quyền truy cập vào chi tiết DB của bạn!
Đậu phộng

7

Câu trả lời của Otto là tại chỗ. Tôi cũng phát hiện ra điều này một cách khó khăn.

Tuy nhiên, tôi đã xoay sở để giải quyết vấn đề này bằng cách sử dụng một tập lệnh tuyệt vời tại http://spectacu.la/search-and-replace-for-wordpress-database/

Để di chuyển wordpress của bạn và sang một tên miền / url mới, hãy làm như sau:

  1. Lấy kết xuất DB (ví dụ: sử dụng phpmyadmin) của wordpress hiện có
  2. Khôi phục bãi chứa nguyên trạng, (không cần sửa đổi) về vị trí mới của bạn
  3. Giải nén tập lệnh từ Spectacu.la vào thư mục nhà wordpress của bạn (đây không phải là plugin ...)
  4. Chạy tập lệnh trên trang web mới của bạn bằng cách trỏ trình duyệt của bạn tới nó, ví dụ: http: //new-website.url/searchreplacesb.php
  5. Đừng quên xóa tập lệnh khỏi trang wordpress mới của bạn

1
Tôi biết đây là loại cũ, nhưng tôi phải xác định tên cơ sở dữ liệu mới ở đâu nếu tôi khôi phục bãi chứa như hiện tại? Tôi ít nhất nên đặt tên cơ sở dữ liệu mới trong bước thứ hai? Cảm ơn bạn vì thông tin này
andresmijares

Tôi không chắc là tôi hoàn toàn hiểu câu hỏi của bạn. Việc khôi phục cơ sở dữ liệu có thể được thực hiện bằng các công cụ như phpmyadmin và bạn có thể đặt cho nó một tên mới hoặc sử dụng tên cũ. Kịch bản tôi đã đề cập chỉ đơn giản là thay đổi văn bản bên trong cơ sở dữ liệu sau khi nó được khôi phục.
Yoav Aner

Xin chào Yoav, cảm ơn vì câu trả lời, ý tôi là, khi tôi xuất DB tôi thường thay đổi tên cơ sở dữ liệu thành tên mới và thay đổi các liên kết tên miền. Nói điều này, ở bước thứ hai, bạn nói khôi phục kết xuất như là sửa đổi, tôi chỉ muốn biết nếu đó theo nghĩa đen, hoặc tôi phải thay đổi tên cơ sở dữ liệu ít nhất. Tôi biết đó có thể là một câu hỏi giả, tôi chỉ là một người lạc
lối

Tôi không biết bạn kết xuất cơ sở dữ liệu của mình như thế nào, nhưng nếu bạn sử dụng công cụ 'xuất khẩu' của phpmyadmin, thì nó không thành vấn đề với tên cơ sở dữ liệu nào. Bạn có thể sử dụng xuất và nhập lại vào bất kỳ cơ sở dữ liệu nào khác. Nói chung, liên quan đến gạch đầu dòng 2, tôi nghĩ việc thay đổi tên cơ sở dữ liệu là ổn.
Yoav Aner

2

OP đã quá nhiệt tình khi thực hiện tìm kiếm và thay thế trên tệp xuất cơ sở dữ liệu và cuối cùng đã thay đổi các lần xuất hiện của "wp_" trong một số dữ liệu được tuần tự hóa. Giải pháp là phân tích kỹ lưỡng hơn trong tìm kiếm và thay thế bằng cách đưa backtick vào trong biểu thức thông thường, sau đó cập nhật thủ công các khóa còn lại trong cơ sở dữ liệu sau khi nhập.

Nếu bạn đang di chuyển và thay đổi tiền tố, và giống như một cách tiếp cận thủ công hơn, hãy làm như sau (điều này chỉ giải quyết các mối quan tâm của OP và không giải quyết việc cập nhật URL trang web)

  1. Sao lưu và di chuyển tệp SQL xuất cơ sở dữ liệu của bạn sang môi trường mới (ví dụ của tôi giả sử tên tệp là backup_YYYY-MM-DD.sql)
  2. Thực hiện tìm kiếm và thay thế hàng loạt trên tệp SQL để thay đổi tên bảng để sử dụng tiền tố mới của bạn (PRIOR để nhập tệp SQL của bạn!). Một cách để làm điều này là sử dụng một lớp lót Perl như: perl -p -i.bak -e "s /` wp_ / `myprefix_ / g" backup_YYYY-MM-DD.sql
  3. Nhập dữ liệu SQL của bạn vào cơ sở dữ liệu
  4. Cập nhật bất kỳ khóa nào trong _options có tiền tố được mã hóa cứng: cập nhật myprefix_options đặt tùy chọn_name = concat ('myprefix _', chất nền (tùy chọn tên, 4)) trong đó tùy chọn như 'wp_%'
  5. Cập nhật bất kỳ khóa nào trong _user_meta có tiền tố được mã hóa cứng: update myprefix_usermeta set meta_key = concat ('myprefix _', struct (meta_key, 4)) trong đó meta_key như 'wp_%'

0

Tôi đã sử dụng plugin WP Migrate , witch thay thế các bản vá http và thư mục. Tôi gặp một vấn đề duy nhất khi nhập, nhưng đã giải quyết đặt các dòng sau ở đầu sql được tạo:

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

Tôi cũng đã thử với công cụ Tìm kiếm và Thay thế (v2.1) được trả lời bởi @Yoav, nhưng nó vẫn phá vỡ dữ liệu nối tiếp của tôi.


Xin chào Ricardo, Chào mừng bạn đến với Câu trả lời của WordPress! Khu vực bạn đăng lên được dành riêng cho câu trả lời cho câu hỏi ban đầu. Mặc dù câu hỏi của bạn có liên quan, bạn nên đăng nó dưới dạng một câu hỏi riêng biệt. Bạn sẽ có cơ hội tốt hơn nhiều để có nó trả lời theo cách đó.
Chris_O
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.