functions.phpの書き方に気をつけないとハマる

基本的な事だと思うんですが、ハマりやすいのでメモしておきます。もしWordPressの既存のテーマなどを修正してて、下記の4行目のように空行が入ってしまっている場合、静かに機能が壊れるので注意しましょう。

add_filter( 'xxxxx', 'xxxxx', 10 );

?>

<?php

functions.phpの中でHTMLの出力などもやっていたりするとやってしまいがちだと思います。

「画像を編集」が使えなくなる

メディアエディターの「画像を編集」を使おうとすると、

NewImage

下記のように画像が表示されなくなります。これは先程のfunctions.phpの中の空行が原因です。

NewImage

機能が壊れる理由

この画像なんですが、実は下記のようにphpでバイナリを読み出すようになっています。

<img id="image-preview-951" onload="imageEdit.imgLoaded('951')" src="/wp-admin/admin-ajax.php?action=imgedit-preview&amp;_ajax_nonce=8e55b8279b&amp;postid=951&amp;rand=9421">

wp-admin配下のadmin-ajax.phpを通してajax-actions.phpの中のwp_ajax_imgedit_previewという関数が呼ばれ、最終的にwp_stream_imageという関数の下記のコードで画像を読み出します。

		switch ( $mime_type ) {
			case 'image/jpeg':
				header( 'Content-Type: image/jpeg' );
				return imagejpeg( $image, null, 90 );
			case 'image/png':
				header( 'Content-Type: image/png' );
				return imagepng( $image );
			case 'image/gif':
				header( 'Content-Type: image/gif' );
				return imagegif( $image );
			default:
				return false;
		}

このコードはgdが入っていれば普通に画像が読み出されるのですが、その前にfunctions.phpを通るので、画像の読み出し以外に空行も出力されてしまいます。すると、画像としては壊れてしまうため先ほどのようにエラーで画像の編集ができない状態になるようです。

例として空行と書きましたが、もちろん何かしら文字列が同じように入っていれば壊れます。

このバイナリを壊してしまうミスは、知らないとやってしまいそうな気がします。WordPressじゃないですが、前に何かのPHPのアプリでこの空行の出力でバイナリが壊れる現象にハマった記憶があります。