Nội dung
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Sau khi khách hàng chọn giao diện WordPress, họ có yêu cầu thêm chúng tôi nhập dữ liệu từ 2 blog khác vào website mới. Đây là bài toán di chuyển website wordpress sang hosting khác. Điều này đã phát sinh thêm ý tưởng cho tôi, Làm sao bạn có thể nhập dữ liệu của 2 WordPress database thành một? bài viết này mình sẽ tập trung giải quyết cách gộp dữ liệu bài viết, sản phẩm từ 2 database khác nhau.
Trước khi thực hiện, bạn nên thực hiện sao lưu dữ liệu WordPress an toàn để bạn có thể khôi phục bất cứ trường hợp nào nếu gặp lỗi
Phương pháp gộp bài viết (tham khảo)
Cách thức này chỉ để cho các bạn biết nguyên lý hoạt động của bảng wp_posts, và dữ liệu Posts được lưu trong database ra sao , với những blog có nhiều bài viết hay sản phẩm mình khuyến khích sử dụng cách thứ hai. Tuy nhiên bạn hãy đọc qua bước này để hiểu hơn nhé.
Xuất dữ liệu bảng wp_options & lưu vào file .sql:
Bước đầu tiên, bạn cần xuất dữ liệu bảng wp_posts
bằng cách tạo file .sql cho bảng này từ phpMyadmin. Từ giao diện phpMyadmin, nhấn tab Export nhấn chọn bảng wp_posts & nhấn “Save as File” để lưu file về máy tính.
Tiếp theo, bạn làm tương tự với blog WordPress khác. Sau khi đã xuất file sql bạn mở tệp và tìm Post ID cuối cùng trong file này.
Xóa lệnh tạo bảng
Vì bảng này đã được tạo với file .sql đầu tiên, các file .sql sau sẽ không cần lệnh tạo bảng wp_options nữa, nếu không xóa bạn sẽ gặp lỗi khi nhập dữ liệu.
Đánh lại chỉ số
Bây giờ bạn cần nhập lại ID mới cho mỗi dòng Post trong file .sql, bắt đầu sau chỉ số từ Post ID cuối cùng của file sql thứ hai. Nếu bạn bỏ qua bước này & khi nhập dữ liệu sẽ có nhiều dữ liệu bị trùng lặp và quá trình nhập sẽ bị lỗi, không thành công. Hãy làm như thế này:
Ngược lại, rất có thể bạn có lỗi:
Di chuyển thư mục uploads
Sẽ có nhiều liên kết ảnh có trong các bài viết của bạn. Nếu bạn thực sự muốn xóa liên kết ảnh từ domain cũ và đổi sang domain mới, bạn cần copy thư mục uploads, và ghi đề vào thư mục uploads của blog chính. Vì 2 website sử dụng WordPress CMS, đều có cấu trúc thư mục giống nhau, bạn chỉ cần copy đè thư mục, những files mới sẽ thêm vào thư mục đó. Tiếp theo, bước quan trọng sau sẽ thay thế toàn bộ liên kết của miền cũ có lưu trong database sang tên miền mới. Để làm điều này bạn tìm & thay thế URL trong file sql.
Tìm: http://OLD-domain.com/wp-content/uploads/ Thay thế: http://NEW-domain.com/wp-content/uploads/
Nhập dữ liệu
Như vậy bạn đã sửa xong file sql mới, sau đây bạn tiến hành nhập dữ liệu từ file sql này vào CSDL của WordPress. Truy cập vào phpMyadmin của website bạn muốn gộp dữ liệu, rồi nhấn tab Import, chọn tệp sql của bạn và nhấn nút Go. Kết quả dữ liệu bài viết Post của 2 blog đã được gộp thành công.
Ở trên mình đã trình bầy cách thức gộp posts của 2 blog WordPress, tuy nhiên ngoài dữ liệu Posts (bài viết, sản phẩm, dữ liệu tùy chỉnh) còn có các danh mục Taxonomy, bình luận. Bạn có thể sử dụng cách tương tự như trên đối với những dữ liệu này, nhưng kỹ thuật sẽ phức tạp hơn & mình cũng không chắc nó có thể hoạt động. Do website của mình có vài danh mục & không có quá nhiều bình luận nên mình làm theo cách thủ công sủ dụng giao diện quản trị WordPress để nhập trực tiếp.
Gộp dữ liệu từ 2 blog WordPress
Đây là cách mình sử dụng để gộp website WooCommerce với cơ sở dữ liệu của một blog WordPress lớn. Với cách thứ nào đi nữa, trước khi thực hiện bạn đừng quên sao lưu WordPress vào máy tính hay cloud của bạn nhé.
Vấn đề gặp phải?
Nhiều bạn mắc phải lỗi trùng lặp primary keys khi gộp các bảng WordPress mà không thay đổi ID. Có thể bạn nghĩ MySQL sẽ tự động sửa giá trị primary keys khi dữ liệu được nhập thêm. Điều này là đúng? nhưng nếu bạn để ý khi xuất dữ liệu bảng ra tệp .sql nó chứa đầy đủ dữ liệu của các trường & trong đó có cả cột ID, do đó MySQL sẽ luôn sử dụng giá trị của trường dù trường đó xác định là khóa chính.
Vấn đề mình gặp phải nếu gộp nhiều bảng với nhau sql sẽ bị lỗi, script chỉ hoạt động khi gộp 1 bảng. Do các khóa chính ở các bảng mysql khác nhau có chỉ số ID với thứ tự không đều nhau, Vậy chúng ta phải làm sao?
Giải pháp đơn giản, chúng ta sẽ tăng dần ID của tất cả các khóa chính và khóa bổ xung (foreign keys) với bắt đầu bằng một con số X. X tùy thuộc vào số lượng entry trong bảng. Ví dụ sau mình giả sử có 2 CSDL db1 & db2. Bạn muốn chèn thêm posts, danh mục, hình ảnh từ db2 vào db1. Lưu ý, để xuất dữ liệu db2 bạn sử dụng lệnh Mysqldump với tham số –no-something-or-other flag , sau đó nhập dữ liệu vào db1.
Script dưới đây sẽ xuất file db2.sql bao gồm dữ liệu bài viết, trang, sản phẩm WooCommerce, hình ảnh, danh mục từ database db2. Bạn có thể sửa cấu hình phù hợp với web hosting của bạn.
# WordPress export # Assuming the db details are: # db_name = db2 # db_user = root # db_pass = pass # ============================================================================= echo "Change all IDs to avoid conflicts" echo "====================================================" # wp_posts mysql --user=root --password= db2 -e "UPDATE wp_posts SET id = REPLACE( id, wp_posts.id, wp_posts.id + 10000 ) WHERE id > 0" # wp_postmeta # Increment post_id # Increment meta_value fields for post thumbnails to retain reference mysql --user=root --password= db2 -e "UPDATE wp_postmeta SET post_id = REPLACE( post_id, wp_postmeta.post_id, wp_postmeta.post_id + 10000 ) WHERE post_id > 0" mysql --user=root --password= db2 -e "UPDATE wp_postmeta SET meta_value = REPLACE( meta_value, wp_postmeta.meta_value, wp_postmeta.meta_value + 10000 ) WHERE meta_key = '_thumbnail_id'" # wp_terms mysql --user=root --password= db2 -e "UPDATE wp_terms SET term_id = REPLACE( term_id, wp_terms.term_id, wp_terms.term_id + 10000 ) WHERE term_id > 0" # wp_term_taxonomy mysql --user=root --password= db2 -e "UPDATE wp_term_taxonomy SET term_taxonomy_id = REPLACE( term_taxonomy_id, wp_term_taxonomy.term_taxonomy_id, wp_term_taxonomy.term_taxonomy_id + 10000 ) WHERE term_taxonomy_id > 0" mysql --user=root --password= db2 -e "UPDATE wp_term_taxonomy SET term_id = REPLACE( term_id, wp_term_taxonomy.term_id, wp_term_taxonomy.term_id + 10000 ) WHERE term_id > 0" mysql --user=root --password= db2 -e "UPDATE wp_term_taxonomy SET parent = REPLACE( parent, wp_term_taxonomy.parent, wp_term_taxonomy.parent + 10000 ) WHERE parent > 0" # wp_term_relationships mysql --user=root --password= db2 -e "UPDATE wp_term_relationships SET object_id = REPLACE( object_id, wp_term_relationships.object_id, wp_term_relationships.object_id + 10000 ) WHERE object_id > 0" mysql --user=root --password= db2 -e "UPDATE wp_term_relationships SET term_taxonomy_id = REPLACE( term_taxonomy_id, wp_term_relationships.term_taxonomy_id, wp_term_relationships.term_taxonomy_id + 10000 ) WHERE term_taxonomy_id > 0" echo "Now for the dumping" echo "====================================================" mysqldump --no-create-info --user=root --password= db2 wp_posts > wp_posts.sql mysqldump --no-create-info --user=root --password= db2 wp_postmeta > wp_postmeta.sql mysqldump --no-create-info --user=root --password= db2 wp_terms > wp_terms.sql mysqldump --no-create-info --user=root --password= db2 wp_term_taxonomy > wp_term_taxonomy.sql mysqldump --no-create-info --user=root --password= db2 wp_term_relationships > wp_term_relationships.sql echo "Edit exported files to allow for seamless inserting" echo "====================================================" # wp_postmeta id's don't need to be force incremented. Remove all ID inserts sed -ir "s/[)],[(][0-9]*,/),(/g" wp_postmeta.sql sed -i "s/INSERT INTO \`wp_postmeta\` VALUES ([0-9]*,/INSERT INTO \`wp_postmeta\` (\`post_id\`, \`meta_key\`, \`meta_value\`) VALUES (/g" wp_postmeta.sql # Prevents duplicates on wp_terms and wp_users script import sed -i "s/);/) ON DUPLICATE KEY UPDATE slug = slug;/g" wp_terms.sql
Lưu ý: Users từ db1 sẽ được xóa, và chỉ để lại bảng wp_users của db1. Khi bạn sử lý db1 hoàn tất, bước cuối cùng bạn sẽ nhập db2.sql sang CSDL db1.
# Import into dummy DB echo "Import into dummy DB" echo "====================================================" mysql -u root -p db1 < wp_posts.sql mysql -u root -p db1 < wp_postmeta.sql mysql -u root -p db1 < wp_terms.sql mysql -u root -p db1 < wp_term_taxonomy.sql mysql -u root -p db1 < wp_term_relationships.sql
Như vậy sử dụng script trên bạn có thể gộp dữ liệu từ 2 WordPress site vào một website WordPress của bạn. Ngoài ra bạn có thể sao lưu WordPress sử dụng plugin WP Migrate DB và di chuyển từ server này sang server khác.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype