【WordPress】メディアライブラリで画像の使用状況を判定する方法|投稿・固定ページ・カスタム投稿での利用調査

【WordPress】メディアライブラリで画像の使用状況を判定する方法|投稿・固定ページ・カスタム投稿での利用調査 WordPress

WordPressのメディアライブラリには多数の画像が蓄積されていきますが、その中にはすでに使用されていない画像も少なくありません。特に運用が長期化しているサイトでは、不要な画像が容量を圧迫しているケースもあります。この記事では、メディアライブラリ内の画像が投稿・固定ページ・カスタム投稿で使用されているかどうかを判定する方法を解説します。

メディアライブラリで画像の使用状況を確認する目的

WordPressは画像をアップロードしても、それがどの投稿やページで使用されているかを標準では管理していません。そのため、不要な画像の整理が困難です。使用状況を確認できれば、以下のような利点があります。

  • 不要な画像を削除してサーバー容量を節約できる
  • メディア管理がしやすくなる
  • サイトのバックアップや移行時のデータ軽量化に貢献する

投稿本文から画像の使用状況を調べる方法

まずは最も基本的な、投稿本文内で画像が使われているかをチェックする方法です。以下のように、画像のIDを取得し、post_contentに含まれているかを検索します。

function is_image_used_in_posts($attachment_id) {
  global $wpdb;

  $attachment_url = wp_get_attachment_url($attachment_id);
  if (!$attachment_url) return false;

  $query = "
    SELECT ID FROM $wpdb->posts
    WHERE post_type IN ('post', 'page', 'your_custom_post_type')
      AND post_status = 'publish'
      AND post_content LIKE %s
    LIMIT 1
  ";

  $like = '%' . $wpdb->esc_like($attachment_url) . '%';
  $result = $wpdb->get_var($wpdb->prepare($query, $like));

  return !empty($result);
}

この関数では、画像URLが投稿・固定ページ・カスタム投稿タイプ内の本文に含まれているかを確認しています。

アイキャッチ画像として使われているかを確認する

アイキャッチ画像として使用されている場合、_thumbnail_idというメタキーが登録されているため、それを確認します。

function is_image_used_as_thumbnail($attachment_id) {
  global $wpdb;

  $query = "
    SELECT post_id FROM $wpdb->postmeta
    WHERE meta_key = '_thumbnail_id'
      AND meta_value = %d
    LIMIT 1
  ";

  $result = $wpdb->get_var($wpdb->prepare($query, $attachment_id));

  return !empty($result);
}

この関数は、指定した画像がアイキャッチとして使われている投稿が存在するかを判定します。

カスタムフィールドで使用されているかを確認する

ACFや独自のカスタムフィールドで画像IDが保存されている場合もあります。その場合はpostmetaテーブルを対象に調査します。

function is_image_used_in_custom_fields($attachment_id) {
  global $wpdb;

  $query = "
    SELECT post_id FROM $wpdb->postmeta
    WHERE meta_value = %d
    LIMIT 1
  ";

  $result = $wpdb->get_var($wpdb->prepare($query, $attachment_id));

  return !empty($result);
}

この方法では、画像IDが文字列または数値として保存されているフィールドを検索します。より厳密に特定のフィールド名に絞ることも可能です。

画像の使用状況を総合的にチェックする関数

上記3つの判定方法をまとめた関数を用意すれば、1回の呼び出しで使用状況を総合的に確認できます。

function is_image_used($attachment_id) {
  return (
    is_image_used_in_posts($attachment_id) ||
    is_image_used_as_thumbnail($attachment_id) ||
    is_image_used_in_custom_fields($attachment_id)
  );
}

これを使えば、不要画像の一括チェックやレポート出力のベースとして活用できます。

使用されていない画像を抽出するには

WordPressの全メディアファイルを取得し、上記のis_image_used()関数でループチェックすることで、未使用画像を特定できます。

$all_images = get_posts(array(
  'post_type' => 'attachment',
  'post_mime_type' => 'image',
  'numberposts' => -1,
));

foreach ($all_images as $image) {
  if (!is_image_used($image->ID)) {
    echo '未使用: ' . esc_html($image->post_title) . '(ID: ' . $image->ID . ')<br>';
  }
}

数が多い場合は、処理の負荷を考慮してバッチ処理化することをおすすめします。

プラグインとの違いと注意点

本記事で紹介した方法は、独自にチェックロジックを構築するメリットがありますが、すでに存在するプラグイン(例:Media Cleaner)も活用できます。ただし、プラグインによっては完全に安全な判定ができない場合や、削除操作が強制的になることもあるため、バックアップの取得は必須です。

まとめ

WordPressで画像の使用状況を確認することで、メディアの整理やサーバー最適化につながります。本記事で紹介した方法を活用すれば、投稿・固定ページ・カスタム投稿のあらゆる場所にある画像の使用状況を自動的に確認できます。サイト運用が長期にわたっている場合は、ぜひ一度メディアライブラリの整理に着手してみてください。