乌徒帮技术范儿WordPressWordPress开发 › 不同的post_type采用不同的thumbnail缩略图尺寸

不同的post_type采用不同的thumbnail缩略图尺寸

分类:WordPress开发

对于《WordPress文章特色图片功能详解》中提到的关于缩略图尺寸的使用方法,到实际开发中常常由于上传后经过裁剪导致空间占用巨大的情况,我们试图控制图片的裁剪,以节约图片对空间的占用。例如,我们试图让post_type=product的文章类型只产生300*250的缩略图,而post_type=book的文章类型只产生150*280的缩略图,这样根据不同的文章类型(或者分类category)来配置缩略图尺寸,可以有效的缩减空间。

但实际上,你在上述的文章中也看到了,wordpress并没有提供post_type参数来规定不同post_type采用不同的缩略图尺寸,因此,我们必须想出其他的办法来实现。

其中一种思路是,通过对post_save钩子进行监测,在文章保存时根据文章的类型来分配不同的set_post_thumbnail_size,但实际上,这种方法是失败的,有人对此做了实验,你可以在这里读到。不过它启发了我们。如果我们可以更好的监测到这个过程呢?于是有人想到了下面这段代码:

function alter_image(){
	global $post;
	if($post->post_type == 'reviews') {
		add_image_size( 'review-thumbnail', 150, 200, true );
	}
}
add_action('edit','alter_image');

但实际上,你可以发现,这仍然存在问题,因为edit事件是在post_save之后,如果在edit的时候才来执行add_image_size,仍然会产生原本就有的缩略图。当然,这个已经很好了,起码不会产生其他声明的图片尺寸。该方法是否能够实现,没有证实,因为我们在functions.php中增加add_image_size的时候,常常是在setup_theme的时候,是初始化阶段,在edit的时候是否能够成功执行,还需要看最终的效果。

而另一种思路是,既然我们不能正面的规定只产生某些尺寸的缩略图,那么我们可以在它产生的时候阻止它或删除它。于是有人提出了下面的代码:

function w3learn_filter_image_sizes( $sizes) {

??? unset( $sizes['thumbnail']);
??? unset( $sizes['medium']);
??? unset( $sizes['large']);

??? return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'w3learn_filter_image_sizes');`

这段代码在进行图片裁剪的时候,去除原本有的图片尺寸,但没有提供post_type接口。其实在前面的一切意淫中都是这样,因为post_type是要在post_save之后才能确定的,在保存文章之前,post_type的值一直都是待定的。因此,我们可以尝试比较狠的招数,即在post_save事件发生时,再通过判断post_type值来确定是否删除已经产生了的图片,例如使用一个自建的delete_thumbnail($post,$size)来实现,不仅删除空间中实际保存的img文件,而且从数据库中将其删除。

这种思路只是笔者现在想到的,但还未进行实施。而且它还存在一些缺点:1、原来的图片尺寸会先产生,这样就导致数据库会事先占用一些自定增加的ID值;2、虽然之后删除了图片文件本身和数据库中的记录,但从图片的产生到删除,中间要执行比较长的时间,如果网速不好,说不定文章提交就不成功。

是否有更为简洁的方法实现本文提出的需求,还希望朋友们提供咨建。

填写个人信息,赶快回复吧!