大致上是用WP-Plugin Add From Server把Server上的圖片匯入至WP的Media Library中,再利用小弟我的PHP Script 把沒關聯的圖片與Post/Page重新連結。
但今天再整理一下WordPress時,發現自己的WordPress已經長大了,有1178個Post,接近二千張圖片。
一直都想把圖片再整理,詳細因由可以看看之前的WordPress - 把圖片加入/重新連結Media Library。
今天再次寫一個PHP Script,主要目的有兩個:
1. 把圖片重新加入至 "YYYY/MM/" 結構的資料夾
2. 找出沒有用過的孤兒圖片
完成後,自己測試過很多次,效果不錯。
現在本Blog 2005年-2009的圖片都齊齊整整有自己的家(資料夾)了。
大家有需要可以把Code Save至一個PHP檔案,上傳到Server執行。
另外每個Server設定不同,請更改$image_dir和$images_to_process變數,說明一下:
$image_dir = 你WP的上傳資料夾,必須"/"結尾,但絕對不要"/"開頭。
$images_to_process = 每個Server的PHP Config(php.ini)都不同,以我為例,max_execution_time = 30的話,一次最多300張就好了。
如果你好似我一樣,有兩千張圖片,可以人手分多次執行。執行直到你看到圖片已經搬遷完成就可以。
完成後,最好重新把Server的Images資料夾下載一次,對比一下圖片數量和File Size,讓自己安心一點。 :hoho:
但緊記緊記!!! Backup你的Database和Images資料夾才動手,因為我會寫入你DB中的wp_posts Table和移動檔案!!!
廢話少說,送上PHP Code。
<?php require_once ('wp-config.php'); require_once ('wp-admin/includes/admin.php'); require_once ('wp-includes/functions.php'); $server = DB_HOST; $username = DB_USER; $password = DB_PASSWORD; $dbname = DB_NAME; //Change this line to your WordPress Images folder if need, End with '/', but DO NOT start with '/'. $image_dir = "wp-content/uploads/images/"; $images_to_process = 500; // $process_cnt = 0; $abs_dir = get_home_path() . '/' . $image_dir; function dirImages($dir, $i) { $d = dir($dir); //Open Directory while (false !== ($file = $d -> read()))//Reads Directory { $extension = strtolower(substr($file, strrpos($file, '.'))); // Gets the File Extension if ($extension == ".jpg" || $extension == ".jpeg" || $extension == ".gif" || $extension == ".png")// Extensions Allowed $images[$file] = $file; // Store in Array } $d -> close(); // Close Directory echo 'Total ' . count($images) . ' files found.'; asort($images); // Sorts the Array $part_images = array_slice($images, 0, $i); return $part_images; } $array = dirImages($abs_dir, $images_to_process); mysql_connect($server, $username, $password) or die(mysql_error()); mysql_select_db($dbname) or die(mysql_error()); foreach ($array as $key => $image)// Display Images { //find out all attachment records which is no parent post. $sql = "SELECT ID , post_date FROM `wp_posts` WHERE post_type IN ('nav_menu_item','page','post','revision','template') AND `post_content` LIKE '%/" . $image . "%' LIMIT 1"; //echo $sql; $attachment_post = mysql_fetch_assoc(mysql_query($sql)); if (!$attachment_post) { echo 'No post is found by filename : ' . $image . 'SQL : ' . $sql; continue; } $process_cnt++; $id = $attachment_post['ID']; $post_date = date_parse($attachment_post['post_date']); $post_year = $post_date['year']; $post_month = substr('0' . $post_date['month'], strlen('0' . $post_date['month']) - 2, 2); //echo $image.' : '.$post_year.'-'.$post_month; //echo $abs_dir.$post_year; //check [year]/[month] folder is exist or not. $yearfolder = $abs_dir . $post_year . '/'; $monthfolder = $yearfolder . $post_month . '/'; if (!is_dir($yearfolder)) { mkdir($yearfolder, 0777); chmod($yearfolder, 0777); echo 'Create folder : ' . $yearfolder; } if (!is_dir($monthfolder)) { mkdir($monthfolder, 0777); chmod($monthfolder, 0777); echo 'Create folder : ' . $monthfolder; } //Move the images to new folder. if (file_exists($monthfolder . $image)) { echo 'The file : ' . $monthfolder . $image . 'exists, skip.'; continue; } if (!rename($abs_dir . $image, $monthfolder . $image)) { echo 'Move ' . $image . ' Fail.'; continue; } //Update wp_post's [post_content] to rewrite the existing url. $sql = "UPDATE wp_posts SET post_content = replace(post_content, '" . $image_dir . $image . "' , '" . $image_dir . $post_year . '/' . $post_month . '/' . $image . "') WHERE post_type IN ('nav_menu_item','page','post','revision','template');"; mysql_query($sql) or die(mysql_error()); } echo $process_cnt . ' files is done!'; mysql_close(); ?>
沒有留言:
發佈留言