使用timthumb.php截取文章缩略图

wordpress自带的缩略图功能会对每次上传的所有图片根据设置的图片尺寸进行裁剪,并把原图和裁剪后的图片保存在网站空间中,图片只裁剪一次,更改设置的尺寸不会重新生成,这样不仅占用主机空间,以后改版网站时还要使用同一尺寸的图片,否则图片会失真或变形。timthumb.php是专门针对wordpress开发的集成在wordpress主题中的缩略图应用项目,只会对调用的图片进行裁剪,而且是在有访问请求时才临时生成一个配置文件,在一定时间内缓存在空间中,不会生成多余的缩略图。

 

温馨提示:

  • timthumb需要主机支持GD库;
  • timthumb处理过程需要一定的服务器资源支持;
  • timthumb不支持外链图片;
  • timthumb出现过漏洞;
  • 作者表示不再更新timthumb。

 

 

timthumb.php使用方法:

1、下载timthumb.php文件:https://code.google.com/p/timthumb/ 或 http://pan.baidu.com/s/1i4P2SMp

2、上传timthumb.php到当前主题文件夹,并在该主题文件夹中创建一个命名为cache的文件夹,设置cache文件夹的权限为755或777

3、关闭wordpress缩略图功能,教程:http://www.boke8.net/wordpress-close-thumbnail.html

4、在主题的functions.php文件添加以下代码:

 
  1. //输出缩略图地址
  2. function post_thumbnail_src(){
  3.     global $post;
  4.     if( $values = get_post_custom_values("thumbnail") ) { //输出自定义域图片地址
  5.         $values = get_post_custom_values("thumbnail");
  6.         $post_thumbnail_src = $values [0];
  7.     } elseif( has_post_thumbnail() ){ //如果有特色缩略图,则输出缩略图地址
  8.         $thumbnail_src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID),'full');
  9.         $post_thumbnail_src = $thumbnail_src [0];
  10.     } else {
  11.         $post_thumbnail_src = '';
  12.         ob_start();
  13.         ob_end_clean();
  14.         $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  15.         $post_thumbnail_src = $matches [1] [0]; //获取该图片 src
  16.         if(empty($post_thumbnail_src)){
  17.             $post_thumbnail_src = get_bloginfo('template_url')."/images/no-image.jpg"; //如果日志中没有图片,则显示默认图片
  18.         }
  19.     };
  20.     echo $post_thumbnail_src;
  21. }

上面的代码表示先获取自定义域的图片,如果没有设置自定义域图片则获取特色图像,如果没有设置特色图像获取内容首张图片,如果内容也没有图片,则显示默认图像no-image.jpg。

自定义域图片教程:http://www.boke8.net/wordpress-image-thumbnail.html

特色图像教程:http://www.boke8.net/wordpress-built-in-thumbnail.html

5、在需要显示缩略图的地方添加调用代码:

 
  1. <img src="<?php bloginfo('template_url');?>/timthumb.php?src=<?php echo post_thumbnail_src(); ?>&h=150&w=200&zc=1" alt="<?php the_title(); ?>" class="thumbnail"/>

使用的参数及说明如下:

src : 需要进行缩放的源图片地址,或者是需要进行截图操作的网页地址
w : 生成图片的宽度,如果宽度或高度只设置了一个值,则根据其中一个值进行等比缩放
h : 生成图片的高度,如果高度和宽度都没有指定,则默认为100*100
zc : 生成图片的缩放模式,可选值0, 1, 2, 3, 默认为1。0:根据传入的值进行缩放(不裁剪), 1:以最合适的比例裁剪和调整大小(裁剪), 2:按比例调整大小,并添加边框(裁剪),2:按比例调整大小,不添加边框(裁剪)
webshot : 如果此值为真则进行截图操作
q : 生成图片的质量,默认90
a : 超出部分的裁剪位置,和缩放模式有关,可选值t, b, l, r, 默认为从顶部裁剪
f : 需要对生成后的图片使用一些过滤器的话,则在这里设置不同过滤器的代码和值。
s : 是否对生产的图片进行锐化处理
cc : 生成图片的背景画布颜色
ct : 生成png图片时背景是否透明

在Wordpress上使用timthumb.php生成缩略图一般只需要用到src、w、h、zc四个参数,其他参数使用默认值即可。

 

附修补timthumb.php漏洞问题:

  • 使用最新版的timthumb.php(但作者表示不再更新)
  • 服务器目录权限设置
  • 删除白名单

在文件中找到以下代码,删除或注释掉

  1. // external domains that are allowed to be displayed on your website
  2. $allowedSites = array (
  3.         'flickr.com',
  4.         'picasa.com',
  5.         'blogger.com',
  6.         'wordpress.com',
  7.         'img.youtube.com',
  8. );
 
另:
 

众所周知,小2的网站近期改版了,缩略图也放大了,更加的展现主题的风采了;但是其实一直隐藏着一个问题没解决,而这个问题,从第二次改版的时候就伴随着了,就是缩略图的尺寸还是用的网站上线初所用的缩略图尺寸。

尽管后台的设置-多媒体-缩略图尺寸修改了,可这是新上传的图片才会生成新的尺寸的缩略图,小2想了很多办法,也从郑力大神那看到用ps加数据库批量的方法,可是小2站里图片太多,缩略图尺寸也复杂不一,曾经还做过中文文件名md5转换,用ps家数据库批量的方法实在是复杂和累人!

 

疑问

如何才能快速又方便的解决wordpress缩略图尺寸重新裁剪的问题呢?

从奶嘴那了解到谷歌的timthumb很好用,小2就百度了下,确实找到相关的文献,通过摸索,现在通过timthumb就可以自由的给缩略图裁剪自己设定的缩略图,可以说一个文章的缩略图可以有几个缩略图的尺寸,做到全站所有要展现缩略图的地方的尺寸都是最清晰的!

解决问题

下面我们直接说教程吧

  1. <?php
  2. function post_thumbnail( $width = 100,$height = 80 ){
  3.     global $post;
  4.     if( has_post_thumbnail() ){    //如果有缩略图,则显示缩略图
  5.         $timthumb_src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID),'full');
  6.         $post_timthumb = '<img src="'.get_bloginfo("template_url").'/timthumb.php?src='.$timthumb_src[0].'&amp;h='.$height.'&amp;w='.$width.'&amp;zc=1" alt="'.$post->post_title.'" class="thumb" />';
  7.         echo $post_timthumb;
  8.     } else {
  9.         $post_timthumb = '';
  10.         ob_start();
  11.         ob_end_clean();
  12.         $output = preg_match('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $index_matches);    //获取日志中第一张图片
  13.         $first_img_src = $index_matches [1];    //获取该图片 src
  14.         if( !empty($first_img_src) ){    //如果日志中有图片
  15.             $path_parts = pathinfo($first_img_src);    //获取图片 src 信息
  16.             $first_img_name = $path_parts["basename"];    //获取图片名
  17.             $first_img_pic = get_bloginfo('wpurl'). '/cache/'.$first_img_name;    //文件所在地址
  18.             $first_img_file = ABSPATH. 'cache/'.$first_img_name;    //保存地址
  19.             $expired = 604800;    //过期时间
  20.             if ( !is_file($first_img_file) || (time() - filemtime($first_img_file)) > $expired ){
  21.                 copy($first_img_src, $first_img_file);    //远程获取图片保存于本地
  22.                 $post_timthumb = '<img src="'.$first_img_src.'" alt="'.$post->post_title.'" class="thumb" />';    //保存时用原图显示
  23.             }
  24.             $post_timthumb = '<img src="'.get_bloginfo("template_url").'/timthumb.php?src='.$first_img_pic.'&amp;h='.$height.'&amp;w='.$width.'&amp;zc=1" alt="'.$post->post_title.'" class="thumb" />';
  25.         } else {    //如果日志中没有图片,则显示默认
  26.             $post_timthumb = '<img src="'.get_bloginfo("template_url").'/images/default_thumb.gif" alt="'.$post->post_title.'" class="thumb" />';
  27.         }
  28.         echo $post_timthumb;
  29.     }
  30. }
  31. ?>

将上面的代码放进wordpress主题文件夹的functions.php内,然后下载文章底部的 timthumb.php 文件放到wordpress主题的根目录下!

然后通过

  1. <?php post_thumbnail(243,182); ?>

这个函数就可以调用出裁剪好尺寸为243*182的缩略图了,相应的缩略图结构代码参照:

  1. <a href="<?php echo get_permalink(); ?>" title="<?php the_title(); ?>"><?php post_thumbnail(243,182); ?></a>

其中243代表宽,182代表高,你们在使用的时候替换成你们的尺寸即可!

然后我们还要给网站根目录下创建cache目录,并给予777权限,这样就可以全自动调用裁剪好的缩略图了,而这些缩略图也就都存在了cache文件夹里,使用起来很方便!

衍生疑问

这个时候有人会问,那系统自带的生成缩略图的功能这么办?每次上传图片,系统都会生成几个尺寸的缩略图,有了timthumb还需要系统自带的缩略图生成功能吗?小2的回答是:随便你!

wordpress批量删除全部文章缩略图的方法可以下载一些插件来进行删除!

关于wordpress缩略图尺寸重新裁剪,这是timthumb篇,还有七牛篇以后再介绍给大家!

衍生疑问2

最近听奶嘴说timthumb有权限上漏洞,反正大叔不懂,这里就穿插个教程吧,nginx与Apache禁止目录执行php文件权限!

以下配置均在nginx配置的server处添加

  1. location ~ /cache/.*.(php|php5)?$ {
  2. deny all;
  3. }

禁止cache目录执行php文件权限

2、多个目录

  1. location ~ /(cache|upload)/.*.(php|php5)?$ {
  2. deny all;
  3. }

禁止cache与upload目录执行php文件权限

配置完后,重新reload nginx即可。

1、单个目录

Apache禁止目录执行php文件权限

以Apache 模块方式运行 PHP,你可以在vhosts配置文件中添加如下代码:

  1. <Directory /www/www./upload>
  2. php_flag engine off
  3. </Directory>
  4. <Directory ~ "^/www/.*/upload">
  5.  <Files ~ ".php">
  6.  Order allow,deny
  7.  Deny from all
  8.  </Files>
  9. </Directory>

禁止upload目录执行php文件权限
友情提示,这个nginx中和apache+windows设置目录权限方法是有所区别的

posted on 2020-01-08 16:57  剩余价值  阅读(998)  评论(0编辑  收藏  举报

导航