WordPress 3.5で非推奨となったimage_resizeをWP_Image_Editorに置き換える方法。

WordPress 3.5から「image_resize関数」が非推奨となりました。公式リファレンスでは、image_reseize関数の代替として「WP_Image_Editorクラス」を使用するように推奨され、下記のようなサンプルコードが掲載されています。

$image = wp_get_image_editor( 'cool_image.jpg' ); // Return an implementation that extends WP_Image_Editor
if ( ! is_wp_error( $image ) ) {
    $image->rotate( 90 );
    $image->resize( 300, 300, true );
    $image->save( 'new_image.jpg' );
}

WP_Image_Editorクラスを生成する「wp_get_image_editor関数」に元ファイル名を引数として渡し、リサイズの後「saveメソッド」に新しいファイル名を引数として渡すという感じのようです。

しかし、コードを追い、image_resize関数の返り値を見てみると「{$dir}/{$name}-{$suffix}.{$ext}」と、元ファイル名にリサイズ後のサイズが付加されたファイルパスを返すようです。上記のサンプルコードでは、リサイズ後のファイル名は自分で決めないといけないので、image_resize関数をそのまま置き換えることはできません。

これは何か影響がありそうだなーと思いながらWordPressを3.5にバージョンアップしたところ、ユーザーの管理画面でNoticeエラーがでるようになってしまいました。調べたところ、ユーザーのアバター画像を設定するプラグイン「Simple Local Avatars」がimage_resize関数を使っているためでした。

Simple Local Avatarsとは

WordPressで使用されるアバターは、標準ではGravatarというWebサービスで登録した画像が表示されるようになっています。個人使用ならばこれで良いのですが、企業サイトでの利用を考えると、全ユーザーGravatarで画像を登録してもらうのは現実的ではありません。

そんなとき、「Simple Local Avatars」というプラグインを使えばユーザーの管理画面から直接ファイルをアップロードしてアバターを設定することができるようになります。

Simple Local Avatars
Simple Local Avatarsをインストールするとアバター画像のアップロードが出現。

image_resize関数をWP_Image_Editorクラス使用に置き換える

ここで、Simple Local Avatarsでimage_resize関数を使用している箇所を見てみます。

	
// generate a new size
if ( empty( $local_avatars[$size] ) ) {
	$upload_path = wp_upload_dir();
	$avatar_full_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full'] );
	$image_sized = image_resize( $avatar_full_path, $size, $size, true ); // ここ	
	// deal with original being >= to original image (or lack of sizing ability)
	$local_avatars[$size] = is_wp_error($image_sized) ? $local_avatars[$size] = $local_avatars['full'] : str_replace( $upload_path['basedir'], $upload_path['baseurl'], $image_sized );	
	// save updated avatar sizes
	update_user_meta( $user_id, 'simple_local_avatar', $local_avatars );
} elseif ( substr( $local_avatars[$size], 0, 4 ) != 'http' ) {
	$local_avatars[$size] = home_url( $local_avatars[$size] );
}

前述したように、WP_Image_Editor->save()の場合は自分でリサイズ後のファイル名を渡す形なので、image_resize関数をそのまま置き換えることはできず、image_resize関数が返すようなリサイズ後のファイルパスを自分で返す必要があります。そこで、Simple Local Avatarsの当該箇所のコードを下記のように変更します(image_resizeの返り値生成の部分に合わせようとしたので、少し冗長です…)。

// generate a new size
if ( empty( $local_avatars[$size] ) ) {
	$upload_path = wp_upload_dir();
	$avatar_full_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full'] );
	
	// $image_sized = image_resize( $avatar_full_path, $size, $size, true );	
	$image = wp_get_image_editor( $avatar_full_path );
	// エラーがあるときは元ファイルのフルパスを返す
	$destfilename = $avatar_full_path;
	if ( ! is_wp_error( $image ) ) {
		// サイズを設定
		$dst_w = $dws_h = $size;
		// 元ファイルのフルパスを分割して保存ディレクトリとファイル名を取得
		$_filenameArr = explode( '/', $avatar_full_path );
		if ( is_array( $_filenameArr ) ) {
			$name = array_pop( $_filenameArr );
			$dir = implode( '/', $_filenameArr );
			// ファイル名から拡張子を取得
			$_filenameArr = explode( '.', $name );
			$ext = array_pop( $_filenameArr );
			$suffix = "{$dst_w}x{$dws_h}";
			// リサイズ後のファイル名
			$destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";
			// リサイズして保存
			$image->resize( $size, $size, true );
			$image->save( $destfilename );
		}
	}
	// $image_sizedにリサイズ後ファイルのパスを格納
	$image_sized = $destfilename;
		
	// deal with original being >= to original image (or lack of sizing ability)
	$local_avatars[$size] = is_wp_error($image_sized) ? $local_avatars[$size] = $local_avatars['full'] : str_replace( $upload_path['basedir'], $upload_path['baseurl'], $image_sized );	
	// save updated avatar sizes
	update_user_meta( $user_id, 'simple_local_avatar', $local_avatars );
} elseif ( substr( $local_avatars[$size], 0, 4 ) != 'http' ) {
	$local_avatars[$size] = home_url( $local_avatars[$size] );
}
  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。