Resize only one specifc size of image
-
Is there a way to resize only one image size? I tried to do it using customized wp_generate_attachment_metadata function but I can’t save metadata properly. As a result I get properly modified chosen size but broken other ones.
Viewing 1 replies (of 1 total)
-
Function code:
function wp_generate_attachment_metadata_for_single_size( $attachment_id, $file, $sizes_for_resizing = '' ) { $attachment = get_post( $attachment_id ); $metadata = array(); $support = false; if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) { $imagesize = getimagesize( $file ); $metadata['width'] = $imagesize[0]; $metadata['height'] = $imagesize[1]; // Make the file path relative to the upload dir. $metadata['file'] = _wp_relative_upload_path($file); // Make thumbnails and other intermediate sizes. global $_wp_additional_image_sizes; $sizes = array(); foreach ( get_intermediate_image_sizes() as $s ) { $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => false ); if ( isset( $_wp_additional_image_sizes[$s]['width'] ) ) $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); // For theme-added sizes else $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options if ( isset( $_wp_additional_image_sizes[$s]['height'] ) ) $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); // For theme-added sizes else $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) ) $sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop']; // For theme-added sizes else $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options } /** * Filter the image sizes automatically generated when uploading an image. * * @since 2.9.0 * * @param array $sizes An associative array of image sizes. */ $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes ); $editor = wp_get_image_editor( $file ); if ( $sizes_for_resizing ) { $metadata_sizes = array(); foreach ( $sizes as $key => $value ) { if ( ! isset( $sizes_for_resizing[$key] ) ) { $filename_parts = explode('.', basename( $file ) ); $metadata_sizes[$key] = array( 'file' => $filename_parts[0] . '-' . $value['width'] . 'x' . $value['height'] . '.' . $filename_parts[1], 'width' => intval( $value['width'] ), 'height' => intval( $value['height'] ), 'mime-type' => get_post_mime_type( $attachment ), ); } } if ( ! is_wp_error( $editor ) ) { $metadata['sizes'] = $editor->multi_resize( $sizes_for_resizing ); $metadata['sizes'] = array_merge( $metadata_sizes, $metadata['sizes'] ); } } else { if ( $sizes ) { if ( ! is_wp_error( $editor ) ) { $metadata['sizes'] = $editor->multi_resize( $sizes ); } } else { $metadata['sizes'] = array(); } } // Fetch additional metadata from EXIF/IPTC. $image_meta = wp_read_image_metadata( $file ); if ( $image_meta ) $metadata['image_meta'] = $image_meta; } if ( $support && ! empty( $metadata['image']['data'] ) ) { // Check for existing cover. $hash = md5( $metadata['image']['data'] ); $posts = get_posts( array( 'fields' => 'ids', 'post_type' => 'attachment', 'post_mime_type' => $metadata['image']['mime'], 'post_status' => 'inherit', 'posts_per_page' => 1, 'meta_key' => '_cover_hash', 'meta_value' => $hash ) ); $exists = reset( $posts ); if ( ! empty( $exists ) ) { update_post_meta( $attachment_id, '_thumbnail_id', $exists ); } else { $ext = '.jpg'; switch ( $metadata['image']['mime'] ) { case 'image/gif': $ext = '.gif'; break; case 'image/png': $ext = '.png'; break; } $basename = str_replace( '.', '-', basename( $file ) ) . '-image' . $ext; $uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] ); if ( false === $uploaded['error'] ) { $image_attachment = array( 'post_mime_type' => $metadata['image']['mime'], 'post_type' => 'attachment', 'post_content' => '', ); /** * Filter the parameters for the attachment thumbnail creation. * * @since 3.9.0 * * @param array $image_attachment An array of parameters to create the thumbnail. * @param array $metadata Current attachment metadata. * @param array $uploaded An array containing the thumbnail path and url. */ $image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded ); $sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] ); add_post_meta( $sub_attachment_id, '_cover_hash', $hash ); $attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] ); wp_update_attachment_metadata( $sub_attachment_id, $attach_data ); update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id ); } } } // Remove the blob of binary data from the array. unset( $metadata['image']['data'] ); /** * Filter the generated attachment meta data. * * @since 2.1.0 * * @param array $metadata An array of attachment meta data. * @param int $attachment_id Current attachment ID. */ return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id ); }
Viewing 1 replies (of 1 total)
- The topic ‘Resize only one specifc size of image’ is closed to new replies.