也谈WordPress获取文章首张图片
从第一次接触WordPress开始,在前台首页需要调用文章中的图片以实现在首页显示图片文章,就看到网络上流传甚广的一个函数:
1 function catch_that_image() { 2 global $post, $posts; 3 $first_img = ''; 4 ob_start(); 5 ob_end_clean(); 6 $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches); 7 $first_img = $matches [1][0]; 8 9 if(empty($first_img)){ 10 $first_img = "/default.jpg"; 11 } 12 return $first_img; 13 }
毫无疑问,这个函数是可以正常工作的。但是你知道这个函数会抛出错误吗?当文章没有图片,并且PHP和WordPress开启调试模式时会抛出一个错误:”Undefined offset: 0 in ……“
作为一个要求完美的人,当然不希望自己的代码中有任何错误,因此简单分析解决之。
分析一下这个函数,出错的原因在于文章没有图片时 $matches 将是个空的数组,而第7行:
$first_img = $matches[1][0];
将一个空数组的某个元素赋值给另一个变量,当然就出现错误了。由于PHP并不总是以抛出错误来解决问题,因此在出错后 $first_img 并没有被赋值,后面的代码也就没有问题。
明白了这一点,解决起来就很简单了,直接去判断数组 $matches 是否为空。
我是这样处理的:
$first_img = ''; if(empty($matches[1])) $first_img = "/default.jpg"; else $first_img = $matches [1][0]; return $first_img;
就是说,在不明确 $matches是否为空的情况下,不要急于去为 $first_img 赋值。后面的 if 直接去判断 $matches[1]是否为空。
这样就避免了一个潜在的错误。
完整的修改方案如下:
//获取文章的第一张图片地址 function catch_that_image() { global $post, $posts; $first_img = ''; ob_start(); ob_end_clean(); $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches); $first_img = ''; if(empty($matches[1])) $first_img = "/default.jpg"; else $first_img = $matches [1][0]; return $matches[1]; }