wp_get_attachment_image_src に post-thumbnail をあたえてもcropされた画像を返さない

表題のとおり。wp_get_attachment_image_src() は内部で image_downsize()を使っていて、これは「与えられた大きさに適応する最大サイズの縮小画像」を返す。この際、画像サイズのcrop属性が無視されます(未検証)。
そのため、仮に set_post_thumbnail_size(180,180,TRUE) とかやっていたとしても、wp_get_attachment_image_src($id, ‘post-thumbnail’)で返ってくるのは、例えば180×135の画像だったりします(生成されている場合)。

これを回避するには、add_image_size を使ってcropを指定した画像サイズを作り、(例:add_image_size(“180px-crop”,180,180,TRUE))、名前指定すること(wp_get_attachment_image_src($id, ‘180px-crop’))。

サイズをいちいち指定するのはアレなので、post-thumbnailをフィルターして適応する画像サイズ名を返す、という関数はいかがでしょうか。

function post_thumbnail_size_in_additional_image_size_name() {
 global $_wp_additional_image_sizes;
 $size = 'post-thumbnail';
 if (
  isset($_wp_additional_image_sizes['post-thumbnail'])
   && is_array($_wp_additional_image_sizes['post-thumbnail'])
   && isset($_wp_additional_image_sizes['post-thumbnail']['crop'])
   && (bool) $_wp_additional_image_sizes['post-thumbnail']['crop']
  ) {
  $dimensions = $_wp_additional_image_sizes['post-thumbnail'];
  foreach ($_wp_additional_image_sizes as $s => $d) {
   if ($size == $s) continue;
   if ((bool) $d['crop']) {
    if ($d['width'] == $dimensions['width'] && $d['height'] == $dimensions['height']) {
     $size = $s;
     break;
    }
   }
  }
 }
 return $size;
}

$_wp_additional_image_sizes を見て、post-thumbnailがセットされており、cropがTRUEの場合、該当するサイズ名を探して返します。
見つからなければpost-thumbnailを返します。

関数名長いのは、まあ分かりやすさ優先ということで。Typoにご注意ください。

Leave a Reply