すでにネットでWP4.5にしてから画像がアップできなくなった件についていろいろな記事がでており、また、本家より対策パッチもリリースされていますが、弊社も含めてWP4.5にしても問題ないケースもあるので、なんの違いがあるか調べてみました。
画像がアップできなくなった場合、下記のエラーがログ等にでるようです。
Fatal error: Undefined class constant 'ALPHACHANNEL_UNDEFINED' in {WordPress のインストールディレクトリ}/wp-includes/class-wp-image-editor-imagick.php on line 379
問題となる対策パッチは、https://wpdocs.osdn.jp/Version_4.5 よりDLできます。
WP4.5の元ファイルと対策パッチのdiffでは、下記のようになっていました。
--- class-wp-image-editor-imagick.php.orig 2016-03-15 09:15:26.000000000 +0900 +++ class-wp-image-editor-imagick.php 2016-04-25 10:36:06.000000000 +0900 @@ -376,8 +376,8 @@ */ if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) ) && is_callable( array( $this->image, 'setImageAlphaChannel' ) ) - && defined( Imagick::ALPHACHANNEL_UNDEFINED ) - && defined( Imagick::ALPHACHANNEL_OPAQUE ) + && defined( 'Imagick::ALPHACHANNEL_UNDEFINED' ) + && defined( 'Imagick::ALPHACHANNEL_OPAQUE' ) ) { if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) { $this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE );
エラーが示している行数と同様のdefinedの箇所が修正されています。ちなみに、PHPのdefined関数ですが、下記のUsageとなっており、引数には文字列をセットしなければなりませんが、元ファイルでは定数そのものがセットされています。修正パッチでは、それをクォートして文字列をセットしています。明らかに、WP4.5のバグですね。
bool defined ( string $name )
しかし、上記のバグが含まれてもOKなケースもあるのですが、これは何? というとで、下記のような小さなプログラムで検証してみました。
<?php if (defined( Imagick::ALPHACHANNEL_UNDEFINED )) { echo 'Yes'; } else { echo 'No'; } ?>
検証、結果は下記のとおりです。
ケース | 条件 | 結果 |
---|---|---|
1 | ImageMagick6.4.6以上+imagick | エラーなし、Noと表示 |
2 | ImageMagick6.4.6より下+imagick | 今回エラー |
3 | ImageMagick/imagickなし | 「Class ‘Imagick’ not found」というエラー |
ちなみに、下記の定義は、ImageMagick6.4.6以上で追加された定義です。
- Imagick::ALPHACHANNEL_UNDEFINED
- Imagick::ALPHACHANNEL_OPAQUE
「class-wp-image-editor-imagick.php」ですが、「class-wp-image-editor.php」の抽象化クラス「WP_Image_Editor」に対して、ImageMagick/imagickがあれば「class-wp-image-editor-imagick.php」に書かれているクラスでオーバーライドして、そうでなければ、GDを使うように「class-wp-image-editor-gd.php」に書かれているクラスでオーバーライドしてインスタンス化する流れなので、上記「3」のパターンの場合は、WPではエラー表示されません。
従って、今回の問題に遭遇された方は、レンタルサーバ等のWEBサーバのImageMagickのバージョンが低い上記「2」のパターンということになります。
でも、上記「1」のパターンの方でも、本来、該当のif文が真になるはずのものが偽となっているため、画像のアルファチャネルが定義されていないときにアルファチャネルにOPAQUEをセットするというコードが動作していないので、可能であれば、提供されている対策パッチをあてた方が良いかもしれません。