2026年10月8日

2026年10月8日

WordPressの画像からEXIF情報を削除してプライバシーを守る実装

スマートフォンで撮った写真には、撮影日時や機種に加えて、位置情報(GPS)がEXIFとして埋め込まれていることがあります。WordPressは縮小版の画像からはメタデータを取り除きますが、アップロードした元の画像ファイルはそのまま残すため、元画像のURLからEXIFを読み取れる場合があります。この記事では、どのファイルに情報が残るのかを確かめる方法、アップロード時に自動で削除するコード、すでにアップロード済みの画像への対処、削除できたかの確認方法を説明します。

コードは子テーマの functions.php か mu-plugin(wp-content/mu-plugins/ に置くPHPファイル)に置きます。画像ファイルを書き換える作業の前には、wp-content/uploads/ とデータベースのバックアップを取り、ステージング環境で試してから本番に入れてください。

WordPressはどこまでEXIFを消すのか

画像をアップロードすると、WordPressは元の画像を保存したうえで、サムネイル・中サイズ・大サイズなどの縮小版を作ります。このとき、画像処理ライブラリがImagickの場合は、縮小版を作る処理の中でメタデータを取り除きます(image_strip_meta フィルターの既定値が true のため)。GDの場合は、画像を書き出す時点でEXIFが引き継がれません。つまり、縮小版には通常EXIFが残りません。

一方で、次のファイルにはEXIFが残ります。

  • アップロードした元の画像:WordPress 5.3以降、長辺が既定で2560ピクセルを超える画像は -scaled 付きの縮小版が「フルサイズ」として使われますが、元の画像もサーバーに残ります。ファイル名から -scaled を外したURLで開ける状態です。
  • 2560ピクセル以下の画像:縮小処理が行われないため、アップロードしたファイルがそのまま「フルサイズ」として配信されます。記事にフルサイズで貼った画像や、画像をクリックして拡大表示する設定では、この元ファイルが表示されます。

スマートフォンの写真は長辺が2560ピクセルを超えることが多い一方、送信前に端末やアプリで縮小された画像は2560ピクセル以下になりやすく、後者は元ファイルがそのまま公開されます。どちらの経路でも、元画像の扱いが論点になります。

なお、WordPressは撮影日時・カメラ・著作権表記など一部の項目を読み取り、添付ファイルのメタデータ(image_meta)としてデータベースにも保存します。

手順1:今の状態を確認する

対策の前に、自分のサイトで実際にEXIFが残っているかを確認します。サーバーにExifTool(コマンドラインのメタデータ編集ツール)が入っている、またはパソコンに入れられる場合は、次のように確認できます。

# GPS関連の項目だけを表示
exiftool -gps:all wp-content/uploads/2026/10/photo.jpg

# すべての項目をグループ名付きで表示
exiftool -a -G1 -s wp-content/uploads/2026/10/photo.jpg

ExifToolを使えない場合は、WP-CLIからPHPのexif拡張で読み取る方法もあります(exif拡張が有効な場合に限ります)。

wp eval 'print_r( exif_read_data( ABSPATH . "wp-content/uploads/2026/10/photo.jpg", "GPS" ) );'

GPSLatitude などの値が表示されたら、そのファイルには位置情報が残っています。同じ画像の縮小版(photo-300x200.jpg など)も確認し、元画像と縮小版で結果が違うことを確かめておくと、この後の対策の効果が分かりやすくなります。

手順2:アップロード時に自動で削除する

アップロードされたファイルが保存された直後、縮小版の生成より前に動く wp_handle_upload フィルターを使います。ここで元ファイルからメタデータを取り除けば、縮小版も -scaled 版も、すでに削除済みのファイルから作られます。

注意点が一つあります。EXIFには画像の向き(Orientation)も入っており、スマートフォンの写真の多くは「画像データは横向きのまま、向きの情報で縦に見せる」形で保存されています。向きの情報だけを消すと画像が横に倒れて表示されるため、先に画像データを正しい向きに回転させてから削除します。

<?php
/**
 * Plugin Name: Strip Image Metadata On Upload
 */

add_filter( 'wp_handle_upload', function ( $upload, $context ) {
	$types = array( 'image/jpeg', 'image/webp' );
	if ( empty( $upload['file'] ) || ! in_array( $upload['type'], $types, true ) ) {
		return $upload;
	}
	if ( extension_loaded( 'imagick' ) ) {
		my_strip_with_imagick( $upload['file'] );
	} else {
		my_strip_with_gd( $upload['file'] );
	}
	return $upload;
}, 10, 2 );

function my_strip_with_imagick( $path ) {
	try {
		$im = new Imagick( $path );

		// 向きの情報に合わせて画像データを回転・反転する
		switch ( $im->getImageOrientation() ) {
			case Imagick::ORIENTATION_TOPRIGHT:    $im->flopImage(); break;
			case Imagick::ORIENTATION_BOTTOMRIGHT: $im->rotateImage( '#000', 180 ); break;
			case Imagick::ORIENTATION_BOTTOMLEFT:  $im->flipImage(); break;
			case Imagick::ORIENTATION_LEFTTOP:     $im->flopImage(); $im->rotateImage( '#000', -90 ); break;
			case Imagick::ORIENTATION_RIGHTTOP:    $im->rotateImage( '#000', 90 ); break;
			case Imagick::ORIENTATION_RIGHTBOTTOM: $im->flopImage(); $im->rotateImage( '#000', 90 ); break;
			case Imagick::ORIENTATION_LEFTBOTTOM:  $im->rotateImage( '#000', -90 ); break;
		}
		$im->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );

		// 色の再現に使うICCプロファイルだけは残す
		$profiles = $im->getImageProfiles( 'icc', true );
		$im->stripImage();
		if ( ! empty( $profiles['icc'] ) ) {
			$im->profileImage( 'icc', $profiles['icc'] );
		}

		$im->writeImage( $path );
		$im->clear();
	} catch ( Exception $e ) {
		error_log( 'strip metadata failed: ' . basename( $path ) );
	}
}

function my_strip_with_gd( $path ) {
	$editor = wp_get_image_editor( $path );
	if ( is_wp_error( $editor ) ) {
		return;
	}
	$editor->maybe_exif_rotate(); // WordPress 5.3以降
	$editor->save( $path );       // GDは書き出し時にEXIFを引き継がない
}

処理に失敗してもアップロード自体は止めず、ログにファイル名だけを残す作りにしています。ログに画像の中身や利用者の情報を書き出さないようにしてください。

このコードには次のような性質があります。

  • 再圧縮される:JPEGを読み込んで書き出し直すため、画質がわずかに変わり、ファイルサイズも変わります。GDの経路では、WordPressの既定の画質設定(wp_editor_set_quality フィルターで変更可能)で保存されます。
  • 著作権表記も消える:EXIFやIPTCに入れた撮影者名・著作権情報も取り除かれます。写真の権利表記をメタデータで管理している場合は、キャプションなど別の方法で表示します。
  • 対象の形式:例ではJPEGとWebPに限っています。PNGにもメタデータが入ることはありますが、写真の位置情報が問題になるのは主にJPEGです。iPhoneのHEIC形式は、WordPressのバージョンとサーバーのImagickの対応状況によってアップロード時にJPEGへ変換されるかどうかが変わります(2026年10月現在)。HEICを受け付けるサイトでは、変換後のファイルも確認してください。

プラグインで対応する方法

コードを書かずに済ませたい場合、画像最適化プラグインの多くにメタデータ削除の設定があります。EWWW Image Optimizer、ShortPixel Image Optimizer、Smushなどがその例です。ただし、設定の名称や、元画像まで処理するのか縮小版だけなのか、無料版で使えるかどうかはプラグインとバージョンによって異なります。導入後は、手順1の方法で元画像のEXIFが実際に消えているかを確かめてください。外部サービスに画像を送って処理する方式のプラグインもあるため、プライバシーポリシーとの関係も確認しておくと安心です。

手順3:アップロード済みの画像を処理する

過去にアップロードした画像には、手順2のコードは効きません。サーバーでExifToolを使える場合は、一括で処理できます。作業前に wp-content/uploads/ 全体のバックアップを取ってください。-overwrite_original を付けると、ExifToolが通常作る _original 付きの控えファイルが作られません。

# 位置情報(GPS)だけを削除する
exiftool -gps:all= -overwrite_original -r -ext jpg -ext jpeg wp-content/uploads/

# 向きとICCプロファイル以外をすべて削除する
exiftool -all= --icc_profile:all -tagsfromfile @ -orientation -overwrite_original -r -ext jpg -ext jpeg wp-content/uploads/

迷ったら、まず位置情報だけを消す1つ目の方法がおすすめです。画像データを再圧縮しないので画質は変わらず、向きの情報も残るため表示が崩れません。2つ目は撮影日時や機種名なども消したい場合の方法で、向きの情報だけを書き戻しています。いずれも、最初は1つのフォルダー(例:wp-content/uploads/2026/10/)で試し、画像の表示と向きを確認してから範囲を広げます。

ファイルを書き換えても、データベースの image_meta に保存された撮影日時やカメラ名は残ります。管理画面のメディア詳細などに表示される程度ですが、気になる場合は添付ファイルのメタデータを再生成するプラグインや wp media regenerate を検討します。wp media regenerate は縮小版を作り直す重い処理なので、件数が多いサイトでは時間帯を選び、ステージングで所要時間を測ってから実行してください。

手順4:削除できたか確認する

テスト用に位置情報付きの写真を1枚アップロードし、次の3点を確認します。

  1. wp-content/uploads/ に保存された元画像を exiftool -gps:all で調べ、何も表示されないこと
  2. メディアライブラリと記事内で、画像が正しい向きで表示されること
  3. ブラウザーで画像のURLを直接開いても、同じく位置情報が取れないこと(CDNやページキャッシュを使っている場合は、古い画像が配信されていないかも確認)

CDNを使っているサイトでは、既存の画像を書き換えた後にCDN側のキャッシュを削除しないと、元の画像が配信され続けることがあります。

まとめ

  • WordPressは縮小版からEXIFを取り除くが、アップロードした元画像はそのまま残る
  • 2560ピクセル以下の画像は元ファイルがフルサイズとして配信されるため、特に注意が必要
  • wp_handle_upload フィルターで、縮小版を作る前に元画像のメタデータを削除できる
  • 向きの情報を消す前に画像データを回転させ、色のためのICCプロファイルは残す
  • 既存画像はバックアップを取ってから、ExifToolで位置情報だけでも削除する
  • 削除後は元画像を実際に調べ、CDNのキャッシュも含めて確認する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲