Pocket

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している模様。ちょっとダンプして中身を確認。

エラーなしでreturnされる値は「WP_Image_Editor_GD」が返ってきました。WP_Image_Editor_GDは、WP_Image_Editorを継承しています。

なるほど、ちゃんとWordPressにはGD用とImageMagick用の処理がわけてある。wp-includesディレクトリのmedia.phpの中に_wp_image_editor_choose()関数があってその中に処理が書いてあった。ImageMagickだと「WP_Image_Editor_Imagick」というクラスが返ってくる模様。

画像のサイズを取得

WP_Image_Editorクラスのget_size()メソッドで取得するようです。戻り値はarray型。

ものすごく簡単だ…。curlとか駆使して必死に画像サイズ取ってた処理って一体…。画像キャッシュ処理やcurlでの画像処理を書いていたソースコードが激的にスリムになった。62行あったソースコードが9行に軽量化。

バグ修正したバージョン3.2.1をリリースしました。リリースはいつもどきどきする。
Markup (JSON-LD) structured in schema.org
GitHub(今回対応した差分)

Markup (JSON-LD) structured in schema.org