Di chuyển website wordpress sang hosting khác

Quảng cáo
Ads_ngang
Website dinhthuanit.com có bài Di chuyển website wordpress sang hosting khác

Di chuyển dữ liệu bài viết wordpress sang hosting khác. Khi tạo hoàn thành website trên localhost cả nhập dữ liệu đầy đặn đã đến lúc bạn đưa website lên host. Một website bao gồm phần code và database.
Bài viết này cũng áp dụng cho công việc di chuyển website từ nơi này sang chỗ khác chẳng những localhost. Quan trọng nhất là di chuyển dữ liệu. Thực hiện các bước dưới đây.

Backup Code và Attachments

Đầu tiên bạn download toàn bộ code wordpress gồm có các file hệ thống, plugins, theme và thư mục uploads chứa các tài nguyên ảnh, ..các attachment khác.
Tiếp đó upload các files code cơ bản lên host mới sử dụng trình tải file FTP lên server, trong đó có:

  • Các files hệ thống của wordpress : wp-content, wp-admin, các files ngoài root, wp-includes. Chú ý: trong folder wp-content bạn trừ folder uploads ra, nhờ có thể web trước có kích hoạt và tạo nhiều multisite nên các file ảnh tài nguyên được lưu dưới thư mục theo tên sites khác nhau. Phần nội dung này chúng ta sẽ chỉ lấy những attachments được đăng bởi website bạn đang muốn di chuyển.
    multisite-uploads-content

    Lấy mọi thứ các folders trong folder mang tên là ID của site , giả sử trên hình là site ID= 21. Bạn copy thêm nữa thư mục uploads/ của web mới.

Export – Import WordPress Database

Bước tiếp theo, bạn export dữ liệu của website bằng cách đăng nhập vào quản trị wordpress, truy cập công cụ Tools-> export . Chúng ta được file .xml lưu toàn bộ dữ liệu bài viết + taxonomy + custom post type. Nếu website có nhiều kiểu dữ liệu, bạn xuất ra từng files xml cho từng kiểu dữ liệu được quy chế bởi công cụ này.
Ví dụ: cài plugin tạo slideshow trong wordpress có plugin Meta Slidertrong tính năng export sẽ có thêm lựa chọn xuất dữ liệu của Meta Slider như thế này,.
export-plugin-data-wp

Bạn cũng đều có thể dùng lựa chọn trước mắt All content cho phép lưu ra toàn bộ dữ liệu có trong wordpress bao gồm dữ liệu của plugin.. vào một file XML.
Sau đó sử dụng file này để Import XML vào website wordpress mới.

Sửa lại dữ liệu cũ

Nếu file đính kèm trong post/page lên tới hàng trăm file ảnh,..thì plugin wordpress importer không thể nào up hết toàn bộ hình kia được vì con số quá lớn và code PHP có thể báo lỗi thời gian thực thi quá 30s. Lúc này bạn cần tăng thời gian thực thi PHP. Hoặc bạn sử dụng cách chia file XML kích cỡ lớn thành nhiều files XML có kích cỡ nhỏ hơn ( <=2mb). Xem thêm mẹo này tại đây.

Cách khéo léo hơn là up database của nội dung bài viết trước và các files attachments (ie:jpg, gif,zip,rar,…) sau. Đừng check tùy chọn “Download and import file attachments” trong bước import. Chúng ta sẽ upload các files tài nguyên này về sau.
download-import-attachments-wp

Nhấn Save bình thường.
Sau đó bước tiếp theo đây, bạn kiểm tra các files đã tải lên thư mục wp-content/uploads chưa, nếu chưa làm thì thực ngày nay bước Backup Code và Attachments ở trên.

Bạn mở mục quản trị database phpmyadmin của web trên trình duyệt và sửa lại cho đúng với domain. Ban đầu bỏ qua bước import attachment địa chỉ URL của attachment vẫn lưu của domain cũ.
wp-database1

Sửa lại giá trị một số trường của các bảng có lưu domain cũ, ví dụ: wp-posts, ..Thay địa điểm domain cũ bằng domain ngày nay bằng phương pháp sử dụng câu lệnh SQL. Ví dụ sau tôi thay chuỗi domain “http://demo.hoangweb.com/baoholaodong/” tìm trong nội dung trường guid của bảng wp_posts , bởi giá trị domain mới ngày nay của web là “http://baohohaan.com/”, có thể lọc thêm field như chỉ thực hành với những record có mức giá trị field post_type=”post”. Nghĩa là áp dụng cho các bài viết (post).

 update wp_posts set gu>   

Tuy nhiên sử dụng mệnh đề where là không cần thiết, đánh nhầm còn hơn bỏ xót. Mình lấy thí dụ như vậy để cho bạn hiểu mà thôi.
Ví dụ khác cho multisite, địa điểm attachment có dạng:

 http://demo.hoangweb.com/baoholaodong/wp-content/uploads/sites/21/2014/09/4024853qua_n_a_o_ba_o_ho__va_i_kaki_nam_di_nh_loa_i_11.jpg  

Trong đó 21 là ID của site. Như vậy đối với trường hợp này bạn thay thế cả chuỗi “http://demo.hoangweb.com/baoholaodong/wp-content/uploads/sites/21”.

 update wp_posts set post_content=REPLACE(post_content,"http://demo.hoangweb.com/baoholaodong/wp-content/uploads/sites/21/","http://baohohaan.com/wp-content/uploads/") where post_type="post"  

Chú ý: nhìn qua trước nội dung bảng CSDL rồi mang ra quyết định dùng lệnh SQL cho phù hợp. Chẳng hạn, Nếu Field trong table có nội dung chứa attachment URL thì không nên chạy lệnh “update” thay thế nguyên địa chỉ domain, như minh họa phía trên chúng ta phải xóa cả đến phân đoạn URL ‘/sites/{siteID}’.

Danh sách các bảng và trường thay đổi giá trị là:

  • wp_posts : post_content (tìm thay thế attachment URL), guid (tìm thay thế địa chỉ domain trang chủ/base url)
  • wp_postmeta : meta_value (tìm thay thế base url. Kết quả tìm thấy giá trị meta_key=’_menu_item_url’)

Khai báo vào file tài nguyên vào media attachment

Sau khi trỏ các file lưu trong database vào domain mới, mình vào thử quản lý Media thì vẫn không thấy các attachments xuất hiện. Như vậy wordpress không trích xuất attachment trong nội dung wp_posts, việc sửa lại domain dễ hiểu là không có tác dụng nó được lưu ở bảng khác.

Để thí nghiệm tính năng feature image thiết lập cho post và xem trong csdl lưu tin tức đó như thế nào. Tôi sẽ thiết lập post thumbnail cho 1 bài viết, ảnh này còn có ID=1273
download-import-attachments-wp
Còn lại mọi thứ các bài viết khác không có ảnh thumbnail.

Việc tiếp theo, mình sẽ tìm kiếm giá trị “1273” trong database wordpress, sử dụng công cụ quản lý CSDL MySQL HeidiSQL.
Để cho nhanh, tôi export csdl trên website về máy tính và import vào một CSDL mới để triển khai kiểm tra.
Mở phần mềm HeidiSQL, nhập tài khoản kết nối mysql trong tỉ dụ này mình dùng XAMP. Chuột phải vào tên database bạn vừa import, chọn tiếp “Find text on server”.
find-text-on-server
Nhập chuỗi 1273 tại mục Text to find rồi nhấn nút Find . Kết quả tìm thấy ở trên bảng wp_postmeta , wp_posts .
find-txt-mysql1

Đúng rồi, chúng ta tìm ID của file tất nhiên mọi file upload lên web đều hiện hữu ở wp_posts. Tìm tiếp một custom field nữa là ‘_thumbnail_id’.
Kết quả 2 thật ngạc nhiên.
find-txt-mysql2
Như vậy này là feature image/post thumbnail được thiết lập cho post vẫn được bảo toàn, như vì phải xuất hiện trong Media hay được nghĩ là attachment của website thì tính năng feature image của bài viết mới sử dụng được và trong cửa sổ edit post bạn mới thấy ảnh trong metabox Feature Image.

Quay trở lại kết quả 1, tìm tiếp chuỗi “_wp_attached_file” ah, nghe tên thì có vẻ đúng rồi field này là khai báo attachments quản lý trong menu Media đây. Kết quả 3 cho ra.
find-txt-mysql3

Thôi đúng rồi, đó là các files nằm ở trong Media.
media-manager

Còn chuỗi cuối “_wp_attachment_metadata”, kết quả 4:
find-txt-mysql5png

Đó là field miêu tả thông tin của attachment là ảnh như width, height, mime-type..hình trên tìm thấy 3 attachment, đúng rồi tương đương với 3 ảnh tìm thấy trong kết quả 3, các file không pải ảnh sẽ không có tính chất trên.
Kết luận : Tổng số có 3 trường tạo giúp tạo attachment và post thumbnail cho post, chúng ta phải thêm 2 trường ‘ _wp_attached_file ‘ và ‘ _wp_attachment_metadata ‘ chèn record vào bảng wp_postmeta. Table wp_posts không càng phải thêm vì đã có rồi. Việc khai báo này công nhận các file đăng vào wp_posts là attachments của wordpress.

Phát hiện thêm: các post thumbnail tìm kiếm được ở trên bảng wp_postmeta có liên kết với post bộc lộ thông qua field meta_key=’_thumbnail_id’, không tìm thấy ở trong wp_posts có post_type=’attachment’. Thông thường mọi kiểu attachment và post đều chứa dữ liệu ở đây.

Do chúng ta bỏ lỡ optioon download và import media trong bước nhập dữ liệu vào wordpress, nên khuyết dữ liệu này. Nhưng bảng wp_postmeta cho ta thấy điều đó.
find-txt-mysql2
(trường meta_value thể hiển field wp_posts.ID của attachment nhưng vẫn không tìm thấy ở wp_posts)

Đính chính lại, như vậy chúng ta khai báo nội dung attachment bằng cách phải chèn thêm record vào bảng wp_posts với post_type=attachment. Nhưng còn meta_value của meta_key=’_wp_attachment_metadata’ thì lấy giá trị ở đâu?

Ý nghĩ: tạo metadata từ attachment URL, cái này không có hàm hỗ trợ trong wordpress. Mình tìm thấy hàm tạo metadata từ attachment id wp_generate_attachment_metadata . Nhưng vô tác dụng vì để cũng có thể có thể sử dụng được hàm đó thì ta biết attachment phải thuộc về dữ liệu media trong wordpress rồi.

Còn một file XML lưu dữ liệu mà ta quên mất, file export được export từ wordpress chứa đầy đặn thông số của attachment, thậm trí liên kết với post, custom post type.
attachment-link-custom-posttype

Mỗi record trong wp_posts thể hiện bởi tag item . VD:

      3651922quan_ao_vai_pawngzim_han_quoc[1]   http://demo.hoangweb.com/baoholaodong/quan-ao-bao-ho-lao-dong/quan-ao-bao-ho-vai-kaki- nhat.html/attachment/3651922quan_ao_vai_pawngzim_han_quoc1   Thu, 25 Sep 2014 07:39:10 +0000            http://demo.hoangweb.com/baoholaodong/wp- content/uploads/sites/21/2014/09/3651922quan_ao_vai_pawngzim_han_quoc1.jpg                    16     2014-09-25 07:39:10     2014-09-25 07:39:10     open     open     3651922quan_ao_vai_pawngzim_han_quoc1     inherit     15     0     attachment      0     http://demo.hoangweb.com/baoholaodong/wp- content/uploads/sites/21/2014/09/3651922quan_ao_vai_pawngzim_han_quoc1.jpg        _wp_attached_file                  _wp_attachment_metadata                 

Các bạn sử dụng PHP đọc nội dung XML này. Sau mỗi tag item nhận dạng là ‘attachment’ bởi element tag wp:post_type chúng ta cần chèn thêm record vào wp_postmeta khai báo cho attachment với custom field ‘_wp_attached_file’, có giá trị là path đến file. ie: 2014/09/3651922quan_ao_vai_pawngzim_han_quoc1.jpg

Tiếp theo, bạn cũng chèn tiếp vào wp_postmeta cho custom field ‘_wp_attachment_metadata’ của attachment. Cuối cùng thêm mới vào bảng wp_posts. Toàn bộ trường trong bảng lấy giá trị từ tag item của nội dung file export XML, trừ guid phải trỏ vào domain mới. Lưu ý: field post_parent là để tạo galleries cho bài viết và tính năng post thumbnail đã thiết lập cho post khi đang import dữ liệu qua wordpress importer rồi, giá trị trường meta_key=’_thumbnail_id’ liên kết giữa post (post_id = wp_posts.ID) và attachment (meta_value = wp_posts.ID)
post_thumbnail-mysql

CODE

Bạn có thể tương tác dữ liệu vào database MySQL bằng thư viện PHP ADOdb. Tham khảo đoạn script trương trình mình có viết ra sau đây, giúp bạn thực hành công việc import dữ liệu media như plugin wordpress importer.
updated: 05/10/2014

            Fixed wordpress importing attachments missing - Hoangweb.com          
Enter File: Choose File :
OR URL <input type="text" name="file_path" value=" "/>
Limit : <input name="dolimit" value=" "/>
Reset session :
<?php global $conn; function _print($txt){ ECHO ' '; } /** update all attachment */ function update_attachments($filexml){ global $conn; //vars $base_url='http://baohohaan.com'; $count=0; $dolimit=isset($_POST['dolimit']) && is_numeric($_POST['dolimit'])? $_POST['dolimit'] :0; $once_reset=1; if(isset($_POST['reset_storage']) && $_POST['reset_storage']=='on' && $once_reset){ $not_in_ID=save_attachments(null,true); $once_reset=0; }else{ $not_in_ID=save_attachments(); } print_r($not_in_ID); if(file_exists($filexml)): $xml=new SimpleXmlElement(file_get_contents($filexml)); $remain=count($xml-> channel-> item)-count($not_in_ID); ?>
  • Total found ( ) attachments.
  • Limit
channel-> item as $item){ $wp = $item-> children('http://wordpress.org/export/1.2/');//_print(($wp-> post_id.','.$wp-> post_type.','.$wp-> status)); if($wp-> post_type!='attachment' && $wp-> status!='inherit') continue; if(in_array($wp-> post_id,$not_in_ID)){ continue; } //$post_> post_id; echo '
'; $attachment_url=(string)$wp-> attachment_url; $d=date('Y-m-d H:i:s'); $mime_type=''; $gu> postmeta)){ foreach($wp-> postmeta as $meta){ $wp1=$meta-> children('http://wordpress.org/export/1.2/'); if($wp1-> meta_key=='_wp_attached_file' && (string)$wp1-> meta_value){ //add _wp_attached_file $t=$conn-> Execute('insert into wp_postmeta(post_id,meta_key,meta_value) values("'.strval($wp-> post_id).'","_wp_attached_file","'.mysql_real_escape_string(strval($wp1-> meta_value)).'")'); $gu> meta_value,'/'); } if($wp1-> meta_key=='_wp_attachment_metadata' && $wp1-> meta_value){ //add _wp_attachment_metadata $t=$conn-> Execute('insert into wp_postmeta(post_id,meta_key,meta_value) values("'.strval($wp-> post_id).'","_wp_attachment_metadata","'.mysql_real_escape_string(strval($wp1-> meta_value)).'")'); //get attachment mime type [email protected] ((string)$wp1-> meta_value); if(is_array($arr)) $mime_type=$arr['sizes']['thumbnail']['mime-type']; } } //insert new attachment to wp_posts $data=array( 'ID'=> (string)$wp-> post_id, 'post_author'=> '1', 'post_date'=> (string)$wp-> post_date, 'post_date_gmt'=> (string)$wp-> post_date_gmt, 'post_title'=> mysql_real_escape_string((string)$item-> title), 'post_excerpt'=> mysql_real_escape_string((string)$item-> excerpt), 'post_status'=> (string)$wp-> status, 'comment_status'=> (string)$wp-> comment_status, 'ping_status'=> (string)$wp-> ping_status, 'post_password'=> (string)$wp-> post_password, 'post_name'=> mysql_real_escape_string((string)$wp-> post_name), 'post_modified'=> $d, 'post_modified_gmt'=> $d, 'post_parent'=> (string)$wp-> post_parent, 'menu_order'=> (string)$wp-> menu_order, 'gupost_type'=> (string)$wp-> post_type, 'post_mime_type'=> $mime_type ); $data=array_filter($data); $escape_vals=array_map(function($v){return '"'.mysql_real_escape_string($v).'"';},array_values(($data))); $values=join(',',$escape_vals); //$ok=$conn-> Execute('insert into wp_posts('.join(',',array_keys($data)).') values('.$values.')'); //if(!$ok){ $q=array(); while (list($var, $val) = each(($data))) { if($var=='ID') continue; $q[]=$var.'="'.mysql_real_escape_string($val).'"'; } $conn-> Execute('insert into wp_posts('.join(',',array_keys($data)).') values('.$values.') on duplicate key update '.join(',',$q)); //} //save attachment save_attachments((string)$wp-> post_id); //get post attached thumbnail $rs=$conn-> Execute('select ID,post_name from wp_posts inner join (select post_id from wp_postmeta where meta_key="_thumbnail_id" and meta_value="'.strVal($wp-> post_id).'") as A1 on wp_posts.ID=A1.post_

Set galleries and post thumbnail successful for post with ID='.$row['ID'].', title=['.$row['post_name'].']

'; } else{ echo '

Không có post nào gắn với thumbnail này.

'; } } echo "added media ID {$wp-> post_id} into wp_postmeta"; echo '
'; if($dolimit && $count++> =$dolimit-1) break; ob_flush(); flush(); sleep(2); } endif; exit(); } /** list exists attachments */ function get_exists_attachments(){ global $conn; $not_in_ID=array(); $rs=$conn-> Execute("select post_id from wp_postmeta where meta_key='_wp_attachment_metadata' "); while ($array = $rs-> FetchRow()) { $not_in_ID[]=$array['post_ADONewConnection')) include('libs/ADOdb-master/adodb.inc.php'); global $conn; if(empty($conn)){ $conn = ADONewConnection('mysql'); # eg. 'mysql' or 'oci8' $conn-> debug = true; $conn-> Connect($host, $user, $pass, $db); } return $conn; } //update_attachments('baoholaodong.wordpress.2014-10-04.xml'); function save_attachments($> 0) { echo "Form File Error: " . $_FILES["file"]["error"] . "
"; if(isset($_POST['file_path']) && file_exists($_POST['file_path'])){ $file=$_POST['file_path']; } } else { echo '
[Form Upload]
'; echo "Upload: " . $_FILES["file"]["name"] . "
"; echo "Type: " . $_FILES["file"]["type"] . "
"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB
"; $file=$_FILES["file"]["tmp_name"]; echo '
'; } if(isset($file)) { //connect to mysql $db=connection('localhost', 'root', '', 'wordpress'); echo '
'; update_attachments($file); echo '
'; //echo ' '; } } ?>

Cách sử dụng: Copy đoạn code trên vào file fix_media.php và tải lên host của bạn. Chạy fix_media.php trên trình duyệt, lấy nội dung XML bằng phương pháp nhấn nút Choose File và trỏ vào file XML bạn export từ website wordpress cũ. Sau đó ấn nút Submit để trương trình bắt đầu sửa lại các bảng mysql vào CSDL hiện tại website mới đang sử dụng.

Nếu số lượng attachments lớn cần tạo lại, bạn cũng đều có thể chia thành nhiều lần import bằng phương pháp điền giá trị vào ô Limit. Những attachment đã được sửa rồi trong lần chạy tiếp công cụ này sẽ bỏ lỡ và tìm sửa những attachment lỗi tiếp theo.

Kết quả:
Trong Media:
media-wp1

Trang sửa post:
post-thumbnail1

Tác giả: hoangweb.com

Nếu bạn thích bài viết này, hãy cỗ vũ chúng tôi bằng phương pháp đăng ký nhận bài viết mới ở bên dưới và hãy nhớ chia sẻ kiến thức này với bạn bè của bạn nhé. Bạn cũng cũng có thể có thể theo dõi blog này trên Twitter và Facebook

Bài viết Di chuyển website wordpress sang hosting khác được tổng hợp và biên tập bởi: dinhthuanit.com. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho dinhthuanit.com để điều chỉnh. dinhthuanit.com xin cảm ơn.

Bài Viết Liên Quan


Bài Viết Khác


Quảng cáo
Ads_ngang