也谈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];
 }

 

posted on 2015-10-31 00:38  昭阳人  阅读(2531)  评论(0编辑  收藏  举报

导航