如何检查WordPress附件中的图片是否存在?小尺寸图片仅保留原图时的检测方案
嘿,针对你提出的两个WordPress图片检查问题,我结合你给出的代码片段来梳理解决方案,帮你搞定这些场景:
1. 检查WordPress附件中指定尺寸图片是否存在
要确认某个尺寸的图片是否存在,我们可以从数据库元数据记录和服务器实际文件两个维度入手——毕竟有时候数据库里有尺寸记录,但文件可能被意外删除。这里有两种实用方法:
方法一:用WordPress原生函数简化检查
wp_get_attachment_image_src()是WordPress自带的工具函数,它会自动帮我们做检查:如果目标尺寸的图片存在,返回包含URL、宽高的数组;如果不存在,直接返回false。示例代码如下:
// 假设$attachment_id是你的附件ID,$image_size是目标尺寸(比如'thumbnail'/'medium') $image_data = wp_get_attachment_image_src($attachment_id, $image_size); if ($image_data) { // 该尺寸图片存在,使用它的URL $image_lazy = $image_data[0]; } else { // 尺寸不存在, fallback到原始图片 $image_lazy = wp_get_attachment_url($attachment_id); }
方法二:手动检查元数据+文件存在性
如果你已经通过wp_get_attachment_metadata()获取了附件的元数据数组(也就是你代码里的$image),可以先检查sizes数组里是否有对应尺寸的键,再验证服务器上的文件是否真的存在:
$upload_dir = wp_upload_dir(); // 获取上传目录的路径和URL信息 $image_lazy = ''; if (!empty($image)) { if (isset($image['sizes'][$image_size])) { // 将图片URL转换为服务器本地路径 $image_file_path = str_replace($upload_dir['baseurl'], $upload_dir['basedir'], $image['sizes'][$image_size]['url']); if (file_exists($image_file_path)) { // 文件存在,使用该尺寸的URL $image_lazy = $image['sizes'][$image_size]['url']; } else { // 文件丢失,用原始图片兜底 $image_lazy = $image['url']; } } else { // 元数据里没有该尺寸的记录,直接用原始图片 $image_lazy = $image['url']; } }
2. 极小尺寸图片的对应尺寸检查处理
你提到上传50x50px的图片后,系统只保留原始文件——这是WordPress的默认规则:如果原始图片的宽/高小于你在后台设置的目标尺寸(比如thumbnail默认是150x150),系统就不会生成该尺寸的缩略图,直接跳过。
针对这种场景,我们只需要在代码里先判断目标尺寸是否存在于元数据的sizes数组中,不存在就直接使用原始图片即可。我帮你修复了原代码的语法问题,并加入检查逻辑:
// 假设$image是wp_get_attachment_metadata()返回的数组,$image_size是目标尺寸 $image_lazy = ''; if ($image_size == 'thumbnail') { // 检查thumbnail尺寸是否存在 if (isset($image['sizes']['thumbnail'])) { $image_src = $image['sizes']['thumbnail']['url']; $image_lazy = $image_src; } else { // 尺寸不存在,用原始图片 $image_lazy = $image['url']; } } elseif ($image_size == 'medium') { // 检查medium尺寸是否存在 if (isset($image['sizes']['medium'])) { $image_src = $image['sizes']['medium']['url']; $image_lazy = $image_src; } else { $image_lazy = $image['url']; } } else { // 默认使用原始尺寸 $image_lazy = $image['url']; }
这段代码的核心逻辑是:每次切换尺寸时,先确认该尺寸是否被生成过(通过isset($image['sizes'][$size])),如果没有就直接回退到原始图片,避免出现无效的图片URL。
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

