0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 媒體庫沒用到的圖片怎麼找出來刪掉(不用外掛)

WordPress 媒體庫沒用到的圖片怎麼找出來刪掉(不用外掛) 封面

網站經營幾年,媒體庫累積了上千張圖片:改版前的舊圖、上傳錯的、同一張傳了好幾次的。每張圖片 WordPress 還會再產生好幾個縮圖檔,主機空間、備份檔都越來越大。

問題是:哪些圖片真的沒用到? 這篇在後台加一頁「沒用到的圖片」,幫你列出可能沒用到的圖片,只列出來,不會自動刪除,確認過再自己刪。

「尚無關聯內容」不等於沒用到

媒體庫的篩選有一個「尚無關聯內容」(英文介面叫 Unattached,很多教學翻成「未附加」),很多人以為就是沒用到的圖片,但兩者不一樣:

  • 「關聯內容」的意思是「這張圖是在編輯某篇文章時上傳的」。之後把它從文章裡刪掉,它還是關聯著那篇文章。
  • 直接在媒體庫上傳、後來才插入文章的圖片,會顯示「尚無關聯內容」,但它明明有在用。
  • Logo、網站圖示、商品圖片,也常常是「尚無關聯內容」。

所以要知道有沒有在用,得去各個地方找。

程式碼

放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增。加上之後,媒體選單底下會多一個「沒用到的圖片」:

PHP
// 在「媒體」選單底下加一頁「沒用到的圖片」,只列出來,不會自動刪除
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>';
}

它檢查了哪些地方

  1. 網站設定:網站圖示、Logo、頁首圖片、WooCommerce 的預設商品圖。
  2. WooCommerce 商品圖庫:每個商品的圖庫存的是一串圖片編號,先全部收集起來。
  3. 精選圖片:文章、頁面、商品的精選圖片。
  4. 用檔名去找:例如圖片是 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 貼文、其他網站直接連結你網站上的圖片。刪掉之後,那些地方就會破圖。

建議的刪除流程:

  1. 先備份網站和資料庫。
  2. 點清單上的「查看/刪除」,打開圖片的詳細資料,看檔名、上傳日期,想想它可能用在哪裡。
  3. 確定不要了,按「永久刪除」。WordPress 的媒體刪除不會進垃圾桶,刪了就沒了,原圖和所有縮圖檔會一起刪除。
  4. 刪完一批,到網站前台幾個主要頁面看看有沒有破圖。

延伸閱讀

媒體庫整理乾淨,網站備份、搬家都會快很多。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含每日備份,整理網站前不用擔心,台北與全台客戶也歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

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

讓我們一起打造
您的專屬網站!