1.利用timthumb.php
//这里设定timthumb.php存放在子主题中
function thumbnail_filter($html, $post_id, $post_thumbnail_id, $size, $attr){
global $blog_id, $_wp_additional_image_sizes;
$image = wp_get_attachment_image_src($post_thumbnail_id, 'full');
//使用数组或指定thumb名并crop属性存在
if( is_array($size) || (isset($_wp_additional_image_sizes[$size]) && $_wp_additional_image_sizes[$size]['crop']) ){
$img_size[0] = ( !is_array($size) ) ? $_wp_additional_image_sizes[$size]['width'] : $size[0];
$img_size[1] = ( !is_array($size) ) ? $_wp_additional_image_sizes[$size]['height'] : $size[1];
$hwstring = image_hwstring($img_size[0], $img_size[1]);
//如已取图片与指出的不符才处理
if( !strpos($html,$hwstring) ){
$patterns = array('/width="(.*?)" height="(.*?)" /', '/src="(.*?)"/');
$replacements = array('', 'src="'.get_stylesheet_directory_uri().'/timthumb.php?src='.$image[0].'&w='.$img_size[0].'&h='.$img_size[1].'&zc=1"');
$html = preg_replace($patterns, $replacements, $html);
}
}
return $html;
}
add_filter('post_thumbnail_html', 'thumbnail_filter', 10, 5);
//这是一个指定图片的处理
function get_timthumb_src($src,$size){
global $_wp_additional_image_sizes;
if( is_array($size) || isset($_wp_additional_image_sizes[$size]) ){
$img_size[0] = ( !is_array($size) ) ? $_wp_additional_image_sizes[$size]['width'] : $size[0];
$img_size[1] = ( !is_array($size) ) ? $_wp_additional_image_sizes[$size]['height'] : $size[1];
$src = get_stylesheet_directory_uri().'/timthumb.php?src='.$image[0].'&w='.$img_size[0].'&h='.$img_size[1].'&zc=1';
}
return $src;
}
需要说明一下的是:采用子目录方式使用wordpress MU的情况下,timthumb会找不到图片,即使你访问图片并发现图片存在时,国外有多种所谓的解决方法,wordpress几次升级后,大多已无效,其实原因在于wordpress已对图片urlrewrite了,所以将$image[0](图片地址)相应处理一下就行了.
2.强制crop指定大小,改变wordpress的crop方式,即使小图片也生成放大后的图片
class ThumbnailUpscaler
{
static function image_crop_dimensions($default, $orig_w, $orig_h, $new_w, $new_h, $crop)
{
if(!$crop)
return null; // let the wordpress default function handle this
$aspect_ratio = $orig_w / $orig_h;
$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
$crop_w = round($new_w / $size_ratio);
$crop_h = round($new_h / $size_ratio);
$s_x = floor( ($orig_w - $crop_w) / 2 );
$s_y = floor( ($orig_h - $crop_h) / 2 );
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );
}
}
add_filter('image_resize_dimensions', array('ThumbnailUpscaler', 'image_crop_dimensions'), 10, 6);
此方法如add_image_size过多过大的crop,可能会耗资源过重