Call to undefined function imagecreatefromstring()
Markup (JSON-LD) structured in schema.orgプラグインのサポートページにエラー報告が。
[10-Feb-2017 16:22:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function imagecreatefromstring() in /…/wp-content/plugins/wp-structuring-markup/includes/wp-structuring-display.php:220
あら?!imagecreatefromstring()関数でエラーが出ているらしい。何でも、「GDはWordPressのインストール要件にありません。私達のサイトはImageMagickを採用しています。あなたのプラグインの要件にもGDのインストールする旨の注釈はありません。WordPressの規格に合わせてサムネイルジェネレータのコードを書き換えてください。とりあえずWebサイトのクラッシュを避けるために、GDの検出ルーチン(function_exists)を追加しました。」と書いてある。
そうか、ImageMagickの考慮が足りなかった…。ていうか、imagecreatefromstring()関数ってGDしか対応していないんだ。
サポートの内容にこれを使え的なURLが貼ってあった。WP_Image_Editorクラスだと!?こんなのあるんだ。無知とは恐ろしい。このクラスの内容を見ていって実装し直そうと思います。
wp_get_image_editor()関数
WP_Image_Editorクラスの例を見ると、wp_get_image_editorという関数でWP_Image_Editorクラスをreturnしている模様。ちょっとダンプして中身を確認。
$image = wp_get_image_editor( ABSPATH . 'wp-content/uploads/2017/02/kinoko.jpg' ); if ( ! is_wp_error( $image ) ) { var_dump( $image ); } else { echo "ERROR"; var_dump( $image ); }
エラーなしでreturnされる値は「WP_Image_Editor_GD」が返ってきました。WP_Image_Editor_GDは、WP_Image_Editorを継承しています。
object(WP_Image_Editor_GD)[10681] protected 'image' => resource(396, gd) protected 'file' => string '/var/www/wordpress/wp-content/uploads/2017/02/kinoko.jpg' (length=56) protected 'size' => array (size=2) 'width' => int 3008 'height' => int 2000 protected 'mime_type' => string 'image/jpeg' (length=10) protected 'default_mime_type' => string 'image/jpeg' (length=10) protected 'quality' => int 82 protected 'default_quality' => int 82
なるほど、ちゃんとWordPressにはGD用とImageMagick用の処理がわけてある。wp-includesディレクトリのmedia.phpの中に_wp_image_editor_choose()
関数があってその中に処理が書いてあった。ImageMagickだと「WP_Image_Editor_Imagick」というクラスが返ってくる模様。
画像のサイズを取得
WP_Image_Editorクラスのget_size()
メソッドで取得するようです。戻り値はarray型。
public function list_page_render () { $image = wp_get_image_editor( ABSPATH . 'wp-content/uploads/2017/02/kinoko.jpg' ); if ( ! is_wp_error( $image ) ) { $size_array = $image->get_size(); var_dump( $size_array['width'] ); var_dump( $size_array['height'] ); } }
ものすごく簡単だ…。curlとか駆使して必死に画像サイズ取ってた処理って一体…。画像キャッシュ処理やcurlでの画像処理を書いていたソースコードが激的にスリムになった。62行あったソースコードが9行に軽量化。
/** * Return image dimensions * * @version 3.2.1 * @since 2.3.3 * @author Justin Frydman * @author Kazuya Takami * @param string $url * @return array | boolean $dimensions */ private function get_image_dimensions ( $url ) { $image = wp_get_image_editor( $url ); if ( ! is_wp_error( $image ) ) { return $image->get_size(); } else { return __return_false(); } }
バグ修正したバージョン3.2.1をリリースしました。リリースはいつもどきどきする。
Markup (JSON-LD) structured in schema.org
GitHub(今回対応した差分)