表題のとおり。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にご注意ください。