
網站經營幾年,媒體庫累積了上千張圖片:改版前的舊圖、上傳錯的、同一張傳了好幾次的。每張圖片 WordPress 還會再產生好幾個縮圖檔,主機空間、備份檔都越來越大。
問題是:哪些圖片真的沒用到? 這篇在後台加一頁「沒用到的圖片」,幫你列出可能沒用到的圖片,只列出來,不會自動刪除,確認過再自己刪。
「尚無關聯內容」不等於沒用到
媒體庫的篩選有一個「尚無關聯內容」(英文介面叫 Unattached,很多教學翻成「未附加」),很多人以為就是沒用到的圖片,但兩者不一樣:
- 「關聯內容」的意思是「這張圖是在編輯某篇文章時上傳的」。之後把它從文章裡刪掉,它還是關聯著那篇文章。
- 直接在媒體庫上傳、後來才插入文章的圖片,會顯示「尚無關聯內容」,但它明明有在用。
- Logo、網站圖示、商品圖片,也常常是「尚無關聯內容」。
所以要知道有沒有在用,得去各個地方找。
程式碼
放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增。加上之後,媒體選單底下會多一個「沒用到的圖片」:
// 在「媒體」選單底下加一頁「沒用到的圖片」,只列出來,不會自動刪除
add_action( 'admin_menu', function () {
add_media_page( '可能沒用到的圖片', '沒用到的圖片', 'manage_options', 'zw-unused-images', 'zw_unused_images_page' );
} );
function zw_unused_images_page() {
global $wpdb;
// 先收集一定有在用的圖片編號:網站圖示、Logo、頁首圖片、WooCommerce 預設商品圖
$used_ids = array_map( 'intval', array(
get_option( 'site_icon' ),
get_option( 'site_logo' ),
get_theme_mod( 'custom_logo' ),
get_option( 'woocommerce_placeholder_image' ),
) );
$header = get_theme_mod( 'header_image_data' );
if ( is_object( $header ) && ! empty( $header->attachment_id ) ) {
$used_ids[] = (int) $header->attachment_id;
}
// WooCommerce 商品圖庫(每個商品存的是一串用逗號分開的圖片編號)
foreach ( $wpdb->get_col( "SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_product_image_gallery'" ) as $gallery ) {
$used_ids = array_merge( $used_ids, array_map( 'intval', explode( ',', $gallery ) ) );
}
$images = get_posts( array(
'post_type' => 'attachment',
'post_mime_type' => 'image',
'post_status' => 'inherit',
'posts_per_page' => 200, // 一次檢查 200 張,圖片很多的網站分批看
'orderby' => 'date',
'order' => 'ASC',
) );
$unused = array();
foreach ( $images as $image ) {
$id = $image->ID;
if ( in_array( $id, $used_ids, true ) ) {
continue;
}
// 1. 精選圖片
if ( $wpdb->get_var( $wpdb->prepare( "SELECT 1 FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id' AND meta_value = %d LIMIT 1", $id ) ) ) {
continue;
}
// 2. 用檔名找:文章、頁面、範本、可重複使用區塊的內容,自訂欄位,網站設定(小工具等)
$file = get_post_meta( $id, '_wp_attached_file', true ); // 例如 2026/10/photo.jpg
$stem = $wpdb->esc_like( preg_replace( '/\.[^.\/]+$/', '', $file ) ); // 2026/10/photo
$original = '%' . $stem . '.%'; // 原圖 photo.jpg
$resized = '%' . $stem . '-%'; // 縮圖 photo-300x200.jpg
$in_posts = $wpdb->get_var( $wpdb->prepare(
"SELECT 1 FROM {$wpdb->posts}
WHERE post_type NOT IN ( 'revision', 'attachment' ) AND post_status NOT IN ( 'trash', 'auto-draft' )
AND ( post_content LIKE %s OR post_content LIKE %s ) LIMIT 1",
$original, $resized
) );
$in_meta = $wpdb->get_var( $wpdb->prepare(
"SELECT 1 FROM {$wpdb->postmeta} WHERE meta_key <> '_wp_attached_file' AND meta_key <> '_wp_attachment_metadata'
AND ( meta_value LIKE %s OR meta_value LIKE %s ) LIMIT 1",
$original, $resized
) );
$in_options = $wpdb->get_var( $wpdb->prepare(
"SELECT 1 FROM {$wpdb->options} WHERE option_value LIKE %s OR option_value LIKE %s LIMIT 1",
$original, $resized
) );
if ( $in_posts || $in_meta || $in_options ) {
continue;
}
$unused[] = $image;
}
echo '<div class="wrap"><h1>可能沒用到的圖片</h1>';
echo '<p>檢查了 ' . count( $images ) . ' 張,找到 ' . count( $unused ) . ' 張在文章、頁面、精選圖片、商品圖庫和網站設定裡都找不到的圖片。刪除前請先備份,並點開確認。</p>';
echo '<table class="widefat striped"><thead><tr><th>圖片</th><th>檔名</th><th>上傳日期</th><th></th></tr></thead><tbody>';
foreach ( $unused as $image ) {
echo '<tr><td>' . wp_get_attachment_image( $image->ID, array( 60, 60 ) ) . '</td>'
. '<td>' . esc_html( basename( get_attached_file( $image->ID ) ) ) . '</td>'
. '<td>' . esc_html( get_the_date( 'Y-m-d', $image ) ) . '</td>'
. '<td><a href="' . esc_url( get_edit_post_link( $image->ID ) ) . '">查看/刪除</a></td></tr>';
}
echo '</tbody></table></div>';
}它檢查了哪些地方
- 網站設定:網站圖示、Logo、頁首圖片、WooCommerce 的預設商品圖。
- WooCommerce 商品圖庫:每個商品的圖庫存的是一串圖片編號,先全部收集起來。
- 精選圖片:文章、頁面、商品的精選圖片。
- 用檔名去找:例如圖片是
2026/10/photo.jpg,就去找有沒有地方寫了2026/10/photo.(原圖)或2026/10/photo-(各種尺寸的縮圖,像photo-300x200.jpg):
- 文章、頁面、區塊佈景主題的範本、可重複使用的區塊、導覽選單的內容。
- 自訂欄位(很多頁面編輯器、欄位外掛把圖片網址存在這裡)。
- 網站設定的資料表(例如舊式的圖片小工具)。
刻意設計成「寧可少列」。用檔名找有可能誤判成「有在用」(例如另一張檔名剛好是 photo-2.jpg),這種圖片就不會出現在清單上。清單上的圖片,是在這些地方都找不到的。
每次檢查最舊的 200 張。圖片很多的網站,一次全部檢查會讓頁面跑很久,可以先處理這 200 張,刪完再看下一批。
只有管理員看得到這一頁。測試時用訂閱者帳號直接打開網址,WordPress 回應「沒有存取這個頁面的權限」。
實際測試的結果
測試網站上傳了 10 張圖片,分別放在不同地方:
- 有在用,沒有出現在清單上:設為精選圖片的、用區塊插入內文的、內文只用了它的縮圖網址的、設為網站 Logo 的、放在商品圖庫的、放在頁首範本裡的、網址存在自訂欄位的。
- 出現在清單上:完全沒用到的;只出現在「垃圾桶裡的文章」的;檔名和另一張有在用的圖很像(
curl.jpg有用、curl2.jpg沒用)的。
測試過程中還發現一件事:WooCommerce 的「預設商品圖」(沒有商品圖片時顯示的那張),一開始被列成沒用到。因為 WooCommerce 把它的編號存在網站設定裡,用檔名找不到,所以程式碼裡把它加進「一定有在用」的名單。這也說明了下面要講的限制。
清單上的圖片,刪之前要再確認
這個清單找不到下面這些用法,清單上的圖片不一定真的沒用:
- 佈景主題的 CSS 或版型檔案裡直接寫死的圖片網址。
- 外掛把圖片編號存在自己的地方。像 WooCommerce 預設商品圖那樣,ACF 這類欄位外掛的圖片欄位、某些頁面編輯器,存的也是編號,用檔名找不到。
- 網站以外的地方用到:電子報、Facebook 貼文、其他網站直接連結你網站上的圖片。刪掉之後,那些地方就會破圖。
建議的刪除流程:
- 先備份網站和資料庫。
- 點清單上的「查看/刪除」,打開圖片的詳細資料,看檔名、上傳日期,想想它可能用在哪裡。
- 確定不要了,按「永久刪除」。WordPress 的媒體刪除不會進垃圾桶,刪了就沒了,原圖和所有縮圖檔會一起刪除。
- 刪完一批,到網站前台幾個主要頁面看看有沒有破圖。
延伸閱讀
- WordPress 刪除文章時一併刪除圖片:只刪沒被其他文章使用的安全寫法
- WordPress 媒體庫分類:不用外掛,用 register_taxonomy 替圖片加上獨立分類
- WordPress 網站加速完整攻略:測速、主機、快取、圖片、外掛與資料庫清理
媒體庫整理乾淨,網站備份、搬家都會快很多。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含每日備份,整理網站前不用擔心,台北與全台客戶也歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。