如果有人有更好的解决方案,我愿意接受,然而,我的想法似乎很好。
基本上,下面的代码只是等待图像完成上传,然后挂接到add_attachment
行动添加第一个后,我们将通过post ID(用于图像附件)连接并生成新图像,这是add_attachment
行动
首先,我们通过按ID调用post来获取图像,然后一点regex保存各种文件路径、文件名和其他数据位。请注意,我正在递归地添加3个不同大小的图像,所以如果您只想创建1个或多个不同大小的图像,请进行更改。我还将我的主题命名为$_POST
数据,从各种图像上传操作的数据来看,这似乎是设置主题定制器内部条件的最具体方法。没有太多其他的事情要做,但是使用图像编辑器的其他领域没有一个包括$_POST[\'post_data\'][\'theme\']
, 因此,只需将其替换为主题名称或使用property_exists
如果希望它应用于所有主题,并且仅应用于自定义程序。
add_filter(\'add_attachment\',\'generate_responsive_sizes\');
function generate_responsive_sizes( $attachment_id ) {
$image_data = get_post( $attachment_id );
// quit if the post_type is not attachment and mime_type is not jpeg/jpg/gif
if ( $image_data->post_type != \'attachment\' || $image_data->post_mime_type != ( \'image/jpeg\' || \'image/png\' || \'image/gif\' ) )
return false;
// quit if the theme is not pure - only PURE gets responsive images, add new themes with responsive images here
if ( $_POST[\'post_data\'][\'theme\'] != \'pure\' )
return false;
$file = substr( strrchr( $image_data->guid, \'/\' ), 1 );
$filepath = str_replace( $file, \'\', $image_data->guid );
$file_arr = preg_split( \'/\\./\', $file );
$filename = $file_arr[0];
$file_ext = $file_arr[1];
$upload_dir = wp_upload_dir();
$sizes = array(
\'1024\' => array(
\'width\' => 1024,
\'height\' => 768,
\'crop\' => true,
),
\'1680\' => array(
\'width\' => 1680,
\'height\' => 1050,
\'crop\' => true,
),
\'2560\' => array(
\'width\' => 2560,
\'height\' => 1440,
\'crop\' => true,
),
);
if ( ! is_wp_error( $image ) ) {
foreach ($sizes as $key => $value) {
$image = wp_get_image_editor( $image_data->guid );
$dimensions = $image->get_size();
if ( $dimensions[\'width\'] < $value[\'width\'] && $dimensions[\'height\'] < $value[\'height\'] ) {
continue;
}
$image->resize( $value[\'width\'], $value[\'height\'], $value[\'crop\'] );
if ( $dimensions[\'width\'] < $value[\'width\'] ) {
$value[\'width\'] = $dimensions[\'width\'];
}
$image->save( $upload_dir[\'path\'] . \'/\' . $filename . \'-\' . $value[\'width\'] . \'x\' . $value[\'height\'] . \'.\' . $file_ext );
}
}
}