再談 WordPress 2.0 的照片管理

WordPress 2.0 的照片上傳功能有一個地方實在頂鳥的。

如果您用了 WordPress 2.0 所提供的照片上傳功能、上傳照片,那麼,系統除了將你的照片放在遠端主機上之外,同時也會在資料庫中建立這張照片的相關詮釋資料(metadata),其中包括照片的長寬尺寸、以及這張照片在遠端磁碟中的絕對路徑位置;例如,如果您將上傳目錄放在 /home/zonble/www/wp-contents/upload,而您在 2006 年七月間上傳了一張 mypic.jpg 的圖片,那麼資料庫中,就會紀錄上一筆/home/zonble/www/wp-contents/upload/2006/07/mypic.jpg,而這就是麻煩的地方了—如果說改了 WP 的安裝目錄(例如搬到別的機器上、換了帳號…),WP 並不會同時修改過去已經記錄下來的圖片絕對路徑資料。

WP 2.0 會使用圖片絕對路徑資料的地方,包括編輯區的圖片列表等—對,就是那個你可以直接將圖片拖拉到編輯區 WYSIWYG 編輯文章的圖片列表。WP 會先檢查圖片是否放在原來的地方,檢查是不是也有製作縮圖,如果沒有,圖片在列表中就出不來;所以,如果改過了安裝路徑,那也就有必要自己動手改一下資料庫裡頭的東西,把路徑給改掉,於是,又遇到一個麻煩的地方—因為 WP 2.0 是先將資料 serialize 過,才塞進資料庫裡,所以,如果要改這個絕對路徑資料,也就需要先將原本的資料 unserialize,改過,再 serialize 一次,塞回資料庫。

所以大概是這樣,如果原本的安裝路徑位在 /path/to/original/folder,後來班到了 /path/to/new/folder,那麼,請寫一個小 php 檔案,放在 WP 安裝根目錄下,內容如下。寫得亂七八糟,不過能用就是了:


postmeta";
$posts = $wpdb->get_results($request);
foreach ($posts as $post) {
$meta_value = $post->meta_value;
$meta_id = $post->meta_id;
if(strstr($meta_value, "/path/to/original/folder")) {
$z = unserialize($meta_value);
if($z) {
print_r($z);
$z['file'] = str_replace("/path/to/original/folder", "/path/to/new/folder", $z['file']);
$a = "";
$a = serialize($z);
$a = str_replace('\'', '\\\'', $a);
echo $a . "\n";
$cmd = "UPDATE $wpdb->postmeta SET meta_value = '$a' WHERE meta_id= '$meta_id'";
echo $cmd."\n\n";
$wpdb->query($cmd);
} else {
$str = "";
$str = str_replace("/path/to/original/folder", "/path/to/new/folder", $meta_value);
$str = str_replace('\'', '\\\'', $str);
echo $meta_id .".". $meta_value."->".$str."\n";
$cmd = "UPDATE $wpdb->postmeta SET meta_value = '$str' WHERE meta_id= '$meta_id'";
echo $cmd."\n\n";
$wpdb->query($cmd);
}
}
}
?>

然後,跑一下這個小程式。

6 thoughts on “再談 WordPress 2.0 的照片管理

  1. Pingback: BloggingPro China » Blog Archive » 再談 WordPress 2.0 的照片管理

  2. 對不起 不知道發在這邊對不對….
    我是blog新手.想把gallery2和wordpress結合在一起,在安裝WPG2時
    他要求要安裝像netPBM類的模組
    我到gallery2的siteamdin網頁上安裝時模組
    需要填入NetPBM 目錄,還說要先把NetPBM安裝在伺服器內
    於是我下載他的binary檔案再上傳到wordpress/gallery2/netpbm這裡
    可以填入路徑時不斷出現問題,”你輸入的路徑不正確”
    啊˙啊 到底該怎麼辦呢?
    請問您這樣有把Netpbm安裝在伺服器上嘛?
    我該怎麼輸入路徑呢?
    懇請您幫忙 我快瘋了
    ……

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.