work.log

元エンジニアの備忘録的ブログ

WordPressで添付ファイルを操作するのに便利なフック

投稿:

WordPress の添付ファイル関連のフックについてメモしておきます。

以下の処理が行われた際に添付ファイルのメタ情報を取得して独自の処理を追加したい時があると思います。

  • メディアライブラリへ添付ファイルを追加
  • メディアライブラリから添付ファイルを削除

調べた限り以下のフックが便利だったので順に説明していきたいと思います。

  • 追加: wp_generate_attachment_metadata
  • 削除: delete_attachment

wp_generate_attachment_metadata

添付ファイル追加時に、メタ情報も合わせて取得したい場合には、フィルターフック関数の wp_generate_attachment_metadata が便利です。

この関数はデータベースにメタ情報が保存される前に実行され、メタ情報を引数として受け取ることができます。

具体的な実行タイミングは添付ファイルアップロード直後で、画像ファイルの場合以下のようなメタ情報が取得できます。

array(5) {
	["width"]     => int(4200)
	["height"]    => int(2800)
	["file"]      => string(21) "2013/06/sample-01.jpg"
	["sizes"]     => array(4) {
		["thumbnail"] => array(4) {
			["file"]      => string(21) "sample-01-150x150.jpg"
			["width"]     => int(150)
			["height"]    => int(150)
			["mime-type"] => string(10) "image/jpeg"
		}
		["medium"] => array(4) {
			["file"]      => string(21) "sample-01-600x400.jpg"
			["width"]     => int(600)
			["height"]    => int(400)
			["mime-type"] => string(10) "image/jpeg"
		}
		["large"] => array(4) {
			["file"]      => string(22) "sample-01-1024x682.jpg"
			["width"]     => int(1024)
			["height"]    => int(682)
			["mime-type"] => string(10) "image/jpeg"
		}
		["post-thumbnail"] => array(4) {
			["file"]      => string(21) "sample-01-624x416.jpg"
			["width"]     => int(624)
			["height"]    => int(416)
			["mime-type"] => string(10) "image/jpeg"
		}
	}
	["image_meta"] => array(10) {
			["aperture"]          => int(0)
			["credit"]            => string(0) ""
			["camera"]            => string(0) ""
			["caption"]           => string(0) ""
			["created_timestamp"] => int(0)
			["copyright"]         => string(0) ""
			["focal_length"]      => int(0)
			["iso"]               => int(0)
			["shutter_speed"]     => int(0)
			["title"]             => string(0) ""
	}
}

WordPress 関数で言うところの wp_get_attachment_metadata と同じ情報が取れます。

使い方はこんな感じです。

function my_media_upload( $img_meta ) {

        /* 処理する内容 */

        return $img_meta;
}
add_filter( 'wp_generate_attachment_metadata', 'my_media_upload' );

他にアクションフック関数の add_attachment も使えそうではありますが、添付ファイル ID を受け取っても肝心のデータがデータベースに入っていないので、メタ情報を引っ張るには不向きです。

delete_attachment

添付ファイル削除時には delete_attachment が利用できます。

ただし、Codex では以下のように説明されています。

Wordpress Codex – delete_attachment 引用

delete_attachment
データベースから添付ファイルが削除された直後に実行する。
アクション関数引数: 添付ファイル ID

添付ファイル ID を受け取れるのは良いですが、データベースから削除された後に ID を受け取っても何もできないので意味ないのではと思ってしまいます。

そこで処理を sleep させて、テーブル名 wp_posts, wp_postmeta あたりを SELECT してみましたが、どうもデータはフック後に削除されるみたいです。

説明と全く違うけど他に添付ファイル情報を格納する場所もなさそうだし、どちらかと言うとこの動作の方が好都合…

ということで、実行タイミングはデータベースから添付ファイル情報が削除される直前が正しいということで理解しておきます。

delete_attachment はこんな感じで使えます。

function my_media_delete( $attachment_id ) {

        /* 処理する内容 */

        /* この後にデータベースより削除される */
        return $attachment_id;

}
add_action( 'delete_attachment', 'my_media_delete' );

WordPress は至る所にフックするポイントが設けられているので覚えてしまえば便利ですね。