之前寫了一篇
WordPress - 把圖片加入/重新連結Media Library
大致上是用
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();
?>