メディアライブラリに EXIF 詳細情報を付加するプラグイン

はじめに

メディアライブラリの各メディアのキャプションに EXIF 情報を付加するプラグイン Exif Caption を公開していますが、そのサポートフォーラムで GPS 情報を取得したいとの要望があったのがきっかけで作成しました。

メディアのキャプションにExifデータを挿入します。また、コンテンツのキャプションを置き換えます。
(3) 最終更新: 3か月 前
700以上サイトで有効化中 検証済み: 6.6.2
ダウンロード: リリース: 2015-11-02

WordPress のメディアライブラリは、新規追加時にメタデータに EXIF 情報を保存しますが、必要最小限の情報しか保存しません。その内容は以下の通りです。

それ以外のほぼ全ての EXIF 情報を取得し、投稿メタデータに保存するプラグイン Exif Details を作成しました。

(1)
バージョン1.09
200以上サイトで有効化中
メディアファイルの詳細な EXIF 情報を取得します。
仕様
日付 対応バージョン リンク
最終更新: 3か月 前
リリース: 2020-05-05
PHP: 8.0
WordPress: 4.7
検証済み: 6.6.2
WordPress :
ダウンロード:
寄付:
備考

メディアファイルの詳細な EXIF 情報を取得します。

取得データ

  • FILE
  • EXIF
  • GPS

兄弟版プラグイン

  • このプラグインで生成されたタグは、以下のプラグインで使用することができます。
  • Exif Caption.

感謝!テストデータの提供

スニペット 1 & 3 を使用したサンプル

フィルターフックとアクションフックの使い方サンプル

  • サンプルスニペット1
/**  ==================================================
 * Sample snippet 1
 *
 * The original filter hook('exif_details_data'),
 * which changes the display when retrieving an Exif and storing it in metadata.
 * The following changes the display of the shooting date and time.
 *
 * @param array $exifdatas  exifdatas.
 * @param int   $id  id.
 */
function exif_details_change( $exifdatas, $id ) {
    if ( array_key_exists( 'DateTimeOriginal', $exifdatas ) ) {
        $shooting_date = str_replace( ':', '-', substr( $exifdatas['DateTimeOriginal'], 0, 10 ) );
        $shooting_time = substr( $exifdatas['DateTimeOriginal'], 10 );
        $exifdatas['DateTimeOriginal'] = $shooting_date . $shooting_time;
    }
    return $exifdatas;
}
add_filter( 'exif_details_data', 'exif_details_change', 10, 2 );
  • サンプルスニペット2
/**  ==================================================
 * Sample snippet 2
 *
 * Retrieve the post metadata and add the date and time of the shooting to the title of the media page.
 * Execute the original action hook('exif_details_update') in the function.
 *
 * @param array $title  title.
 * @param int   $id  id.
 */
function media_title( $title, $id ) {
    $datetime = null;
    if ( is_attachment() ) {
        do_action( 'exif_details_update', $id );
        $exifdatas = get_post_meta( $id, '_exif_details', true );
        if ( ! empty( $exifdatas ) && array_key_exists( 'DateTimeOriginal', $exifdatas ) ) {
            $datetime = ' Date:' . $exifdatas['DateTimeOriginal'];
        }
    }
    return $title . $datetime;
}
add_filter( 'the_title', 'media_title', 10, 2 );
  • サンプルスニペット3
/**  ==================================================
 * Sample snippet 3
 *
 * When adding new media, insert the processed data into the caption.
 * Use the original action hook ('exif_details_update') with function.
 *
 * @param array $metadata  metadata.
 * @param int   $id  id.
 */
function media_caption( $metadata, $id ) {
    $mime_type = get_post_mime_type( $id );
    if ( in_array( $mime_type, array( 'image/jpeg', 'image/tiff' ) ) ) {
        do_action( 'exif_details_update', $id );
        $exifdatas = get_post_meta( $id, '_exif_details', true );
        if ( ! empty( $exifdatas ) ) {
            $camera = null;
            $f_number = null;
            $s_speed = null;
            $iso = null;
            $date = null;
            $googlemap = null;
            if ( array_key_exists( 'Model', $exifdatas ) ) {
                $camera = 'Camera:' . $exifdatas['Model'];
            }
            if ( array_key_exists( 'ApertureFNumber', $exifdatas ) ) {
                $f_number = 'F-number:' . $exifdatas['ApertureFNumber'];
            }
            if ( array_key_exists( 'ExposureTime', $exifdatas ) ) {
                $s_speed = 'Shutter speed:' . $exifdatas['ExposureTime'];
            }
            if ( array_key_exists( 'ISOSpeedRatings', $exifdatas ) ) {
                $isodata = json_decode( $exifdatas['ISOSpeedRatings'] );
                if ( is_array( $isodata ) ) {
                    $iso = 'ISO:' . $isodata[0];
                } else {
                    $iso = 'ISO:' . $isodata;
                }
            }
            if ( array_key_exists( 'DateTimeOriginal', $exifdatas ) ) {
                $date = 'Date:' . $exifdatas['DateTimeOriginal'];
            }
            if ( array_key_exists( 'latitude_dd', $exifdatas ) && array_key_exists( 'longtitude_dd', $exifdatas ) ) {
                $googlemap = '<a href="https://www.google.com/maps?q=' . $exifdatas['latitude_dd'] . ',' . $exifdatas['longtitude_dd'] . '">Google Map</a>';
            }
            $caption = sprintf( '%1$s %2$s %3$s %4$s %5$s %6$s', $camera, $f_number, $s_speed, $iso, $date, $googlemap );
            $caption = rtrim( $caption );
            $caption = preg_replace( '/\s(?=\s)/', '', $caption );
            $media_post = array(
                'ID'           => $id,
                'post_excerpt' => $caption,
            );
            wp_update_post( $media_post );
        }
    }
    return $metadata;
}
add_filter( 'wp_generate_attachment_metadata', 'media_caption', 10, 2 );

開発にあたり、sysbird 様から写真のテストデータを提供していただきました。ありがとうございました。

sysbird

使用方法

インストールすると、メディアライブラリのカラムに EXIF が追加されます。その欄に、EXIF タグと値が表示されます。そのデータは、投稿メタデータのメタキー _exif_details に保存されます。また、そのデータ保存をフィルターするフィルターフック exif_details_data を提供します。

プラグイン Exif Caption を利用した使用方法

プラグイン Exif Caption の設定で Exif Details で表示される Exif タグを使用できます。タグは % で囲んで使用します。Exif タグを設定すると、メディアのキャプションに出力されます。Exif Caption は最新バージョンを使用してください。

単純なメタデータの取得・使用方法

/* 取得:投稿 ID を指定し、メタデータを取得 */
$exifdatas = get_post_meta( 投稿ID, '_exif_details', true );
/* 使用:配列で提供されるメタデータのキーに EXIF タグ を指定しデータを表示 */
<?php echo esc_html( $exifdatas['DateTimeOriginal'] ); ?>

フィルターフックとアクションフックを利用した使用方法

/* EXIF を取得してメタデータに保存する際の表示を変更するオリジナルフィルターフック('exif_details_data')。以下、撮影日時の表示を EXIF オリジナルの 2020:05:06 07:00:00 から、2020-05-06 07:00:00 のように変更します。 */
add_filter( 'exif_details_data', 'exif_details_change', 10, 2 );
function exif_details_change( $exifdatas, $id ) {
	if ( array_key_exists( 'DateTimeOriginal', $exifdatas ) ) {
		$shooting_date = str_replace( ':', '-', substr( $exifdatas['DateTimeOriginal'], 0, 10 ) );
		$shooting_time = substr( $exifdatas['DateTimeOriginal'], 10 );
		$exifdatas['DateTimeOriginal'] = $shooting_date . $shooting_time;
	}
	return $exifdatas;
}

/* 投稿メタデータを取得し、メディアページのタイトルに撮影日時を追加します。関数内でオリジナルアクションフック('exif_details_update')を使用します。 */
add_filter( 'the_title', 'media_title', 10, 2 );
function media_title( $title, $id ) { 
	$datetime = null;
	if ( is_attachment() ) {
		do_action( 'exif_details_update', $id );
		$exifdatas = get_post_meta( $id, '_exif_details', true );
		$datetime = ' 撮影日時 : ' . $exifdatas['DateTimeOriginal'];
	}
    return $title . $datetime; 
}

仕様

  • EXIF タグの内、大文字で始まるものは、未加工のものです。全て小文字のものは、このプラグインが加工したものです。
    • latitude 緯度
    • longtitude 経度
    • gpsaltitude 標高
    • / が入った数字のみのものは、割り算しています。
  • 元データが配列のものは、JSON に変換されます。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください