このブログではサムネイルの生成に Auto Post Thumbnail プラグインを用いて記事内の先頭にある画像を自動的に設定するようにしている。のだが、記事一覧を見ていると一部サムネイルが生成されていない記事を発見した。
WordPress のサムネイルを自動して設定してくれるプラグイン Auto Post Thumbnail | Lonely Mobiler
調べてみると WordPress で管理していない画像を Auto Post Thumbnail が正常に読み込めないようであった。
php.ini で allow_url_fopen は有効になっている為 Auto Post Thumbnail プラグインにバグがあると予測しソースコードを確認していたところ、以下の箇所にバグを発見した。
auto-post-thumbnail.php ファイルにある apt_generate_post_thumb 関数内の以下のコードだ。
//Fix for checking file extensions
$exts = explode(".",$filename);
if(count($exts)>2)return null;
$allowed=get_allowed_mime_types();
$ext=pathinfo($new_file,PATHINFO_EXTENSION);
if(!array_key_exists($ext,$allowed))return null;
このコードではファイルの拡張子が WordPress で扱えるものかどうかをチェックしている。
get_allowed_mime_types() で取得した配列を対象にファイルの拡張子と同じキーを持ったものを array_key_exists で検索している。
ところが、get_allowed_mime_types() で取得できる配列は以下のような形式となっている。
array(
'jpg|jpeg|jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'bmp' => 'image/bmp',
'tif|tiff' => 'image/tiff',
'ico' => 'image/x-icon',
// 以下省略
jpeg のように複数の拡張子が混在するファイル形式の場合はこのように | で拡張子を羅列している為、array_key_exists では判別ができない。そのため return null; が実行され画像が読み込まれない。
このコードは WordPress で管理されていない画像ファイルを読み込む際に実行される為、Wordpress 内の画像をサムネイルとする場合には関係ない。
この問題の対処法だが、プラグインのコードを直接書き換えるのは良くないので、functions.php に以下のフィルターフックを書く。
function split_combined_mimes_for_apt( $mime_types ) {
foreach ( $mime_types as $regex => $mime_type ) {
if ( false !== strpos( $regex, '|' ) ) {
$keys = explode( '|', $regex );
foreach ( $keys as $key ) {
$mime_types[ $key ] = $mime_type;
}
}
}
return $mime_types;
}
add_filter( 'mime_types', 'split_combined_mimes_for_apt' );
自分が書いたコードじゃなくて以下のフォーラムからのコピペから typo ぽいものを除いただけだけど。
https://wordpress.org/support/topic/bug-in-code-3/
こうする事で MIME タイプ一覧が Auto Post Thumbnail で処理できるようになり、外部の画像であっても正常に読み込めるようになる。
フォーラムに既に上がっている話題であったのでそのうち修正されるのではないかと思う。
コメント