WordPressの挿入した画像でwidth/heightを削除する方法

goodbye-img-attribute-width-height最近、下記の理由から、WordPressの挿入した画像のimgタグにwidth/heightがあることに違和感を感じてました。

  • レスポンシブにフルードイメージとして画像を取り扱う際に、imgタグ内のwidth/heightの値の意味が薄れる (画像本来のサイズを指定すればよいのだろうか?)。
  • imgタグ内のwidth/heightは、alt属性のように必須ではない。
  • width/height属性のせいで、微量ではあるがhtmlのコードサイズが肥大化してしまう。
  • FTPなどで違うサイズの画像を差し替えた際に、該当のimgタグのwidth/height値を直してあげないといけない。

しかしながら、imgタグのwidth/heightを削除すると下記のようなデメリットもあるようです。

  1. 画像のレンダリング速度の低下(1割程度?)
  2. JavaScriptのwidth/height取得のタイミングがズレてうまく機能しないことがある
    → でも、これって「jQuery(document).ready(function(){」内でwidth/heightを取得してるからであって、「jQuery.event.add(window,”load”,function(){」内でwidth/heightを取得すればOK?
  3. HTMLのローディングが途中で止まった際にレイアウトが崩れる可能性がある
    → 画像が飛んでしまって崩れるようなレイアウトって・・・

上記の1は痛いですが以上を踏まえて、imgタグのwidth/heightを削除したいと考えた場合、他のブログでも紹介されているとおり、下記のような方法になります。

/**
 * 画像挿入時にwidthとheightを削除する
 */
function remove_width_attribute( $html ) {
	$html = preg_replace( '/(width|height)="\d*"\s/', "", $html );
	return $html;
}
add_filter( 'post_thumbnail_html', 'remove_width_attribute', 10 );
add_filter( 'image_send_to_editor', 'remove_width_attribute', 10 );

しかしながら、上記の方法では、画像挿入時にしかwidth/heightを削除しません。具体的には、WP3.9あたりからTinyMCEが4.0にアップされ画像変更のUIが改善されましたが、画像変更(右寄せ・左寄せ等)すると、width/height属性が復活してしまいます。そこで、更に下記のように行えば、width/height属性は復活せず消えたままにしておけます。

// 画像編集の際に勝手にwidth/heightが入るので削除
function my_tinymce_remove_width_attribute( $options ) {
if ( $options['tinymce'] ) {
wp_enqueue_script( 'tinymce_remove_width_attribute', get_template_directory_uri() . '/js/wp-admin-remove_width_attribute.js', array( 'jquery' ), '1.0.0', true);
}
}
add_action( 'wp_enqueue_editor', 'my_tinymce_remove_width_attribute', 10, 1 );
(function( $, wp, _ ) {

	if ( ! wp.media.events ) {
		return;
	}

	wp.media.events.on( 'editor:image-update', function( options ) {
		var editor = options.editor,
			dom = editor.dom,
			image  = options.image;

		dom.setAttribs( image, {'width': null, 'height': null});
	} );

})( jQuery, wp, _ );

以上、何かのご参考になりましたら幸いです。

※上記の内容は全て自己責任のもとでご参考ください。