Untitled
unknown
php
22 days ago
7.0 kB
3
Indexable
Never
<?php function webp_uploads_create_sources_property( array $metadata, $attachment_id ) { // This should take place only on the JPEG image. $valid_mime_transforms = webp_uploads_get_upload_image_mime_transforms(); // Not a supported mime type to create the sources property. $mime_type = get_post_mime_type( $attachment_id ); if ( ! isset( $valid_mime_transforms[ $mime_type ] ) ) { return $metadata; } $file = get_attached_file( $attachment_id, true ); // File does not exist. if ( ! file_exists( $file ) ) { return $metadata; } // Make sure the top level `sources` key is a valid array. if ( ! isset( $metadata['sources'] ) || ! is_array( $metadata['sources'] ) ) { $metadata['sources'] = array(); } if ( empty( $metadata['sources'][ $mime_type ] ) ) { $metadata['sources'][ $mime_type ] = array( 'file' => wp_basename( $file ), 'filesize' => wp_filesize( $file ), ); wp_update_attachment_metadata( $attachment_id, $metadata ); } $original_size_data = array( 'width' => isset( $metadata['width'] ) ? (int) $metadata['width'] : 0, 'height' => isset( $metadata['height'] ) ? (int) $metadata['height'] : 0, 'crop' => false, ); $original_directory = pathinfo( $file, PATHINFO_DIRNAME ); $filename = pathinfo( $file, PATHINFO_FILENAME ); $ext = pathinfo( $file, PATHINFO_EXTENSION ); $allowed_mimes = array_flip( wp_get_mime_types() ); // Create the sources for the full sized image. foreach ( $valid_mime_transforms[ $mime_type ] as $targeted_mime ) { // If this property exists no need to create the image again. if ( ! empty( $metadata['sources'][ $targeted_mime ] ) ) { continue; } // The targeted mime is not allowed in the current installation. if ( empty( $allowed_mimes[ $targeted_mime ] ) ) { continue; } $extension = explode( '|', $allowed_mimes[ $targeted_mime ] ); $destination = trailingslashit( $original_directory ) . "{$filename}.{$extension[0]}"; $image = webp_uploads_generate_additional_image_source( $attachment_id, 'full', $original_size_data, $targeted_mime, $destination ); if ( is_wp_error( $image ) ) { continue; } if ( webp_uploads_should_discard_additional_image_file( $metadata, $image ) ) { wp_delete_file_from_directory( $destination, $original_directory ); continue; } $metadata['sources'][ $targeted_mime ] = $image; wp_update_attachment_metadata( $attachment_id, $metadata ); } // If the original MIME type should not be generated/used, override the main image // with the first MIME type image that actually should be generated. In that case, // the original should be backed up. if ( ! in_array( $mime_type, $valid_mime_transforms[ $mime_type ], true ) && isset( $valid_mime_transforms[ $mime_type ][0] ) && isset( $allowed_mimes[ $mime_type ] ) ) { $valid_mime_type = $valid_mime_transforms[ $mime_type ][0]; // Only do the replacement if the attachment file is still set to the original MIME type one, // and if there is a possible replacement source. $file_data = wp_check_filetype( $metadata['file'], array( $allowed_mimes[ $mime_type ] => $mime_type ) ); if ( $file_data['type'] === $mime_type && isset( $metadata['sources'][ $valid_mime_type ] ) ) { $saved_data = array( 'path' => trailingslashit( $original_directory ) . $metadata['sources'][ $valid_mime_type ]['file'], 'width' => $metadata['width'], 'height' => $metadata['height'], ); $original_image = wp_get_original_image_path( $attachment_id ); // If WordPress already modified the original itself, keep the original and discard WordPress's generated version. if ( ! empty( $metadata['original_image'] ) ) { $uploadpath = wp_get_upload_dir(); wp_delete_file_from_directory( get_attached_file( $attachment_id ), $uploadpath['basedir'] ); } // Replace the attached file with the custom MIME type version. $metadata = _wp_image_meta_replace_original( $saved_data, $original_image, $metadata, $attachment_id ); // Unset sources entry for the original MIME type, then save (to avoid inconsistent data // in case of an error after this logic). unset( $metadata['sources'][ $mime_type ] ); wp_update_attachment_metadata( $attachment_id, $metadata ); } } // Make sure we have some sizes to work with, otherwise avoid any work. if ( empty( $metadata['sizes'] ) || ! is_array( $metadata['sizes'] ) ) { return $metadata; } $sizes_with_mime_type_support = webp_uploads_get_image_sizes_additional_mime_type_support(); foreach ( $metadata['sizes'] as $size_name => $properties ) { // Do nothing if this image size is not an array or is not allowed to have additional mime types. if ( ! is_array( $properties ) || empty( $sizes_with_mime_type_support[ $size_name ] ) ) { continue; } // Try to find the mime type of the image size. $current_mime = ''; if ( isset( $properties['mime-type'] ) ) { $current_mime = $properties['mime-type']; } elseif ( isset( $properties['file'] ) ) { $current_mime = wp_check_filetype( $properties['file'] )['type']; } // The mime type can't be determined. if ( empty( $current_mime ) ) { continue; } // Ensure a `sources` property exists on the existing size. if ( empty( $properties['sources'] ) || ! is_array( $properties['sources'] ) ) { $properties['sources'] = array(); } if ( empty( $properties['sources'][ $current_mime ] ) && isset( $properties['file'] ) ) { $properties['sources'][ $current_mime ] = array( 'file' => $properties['file'], 'filesize' => 0, ); // Set the filesize from the current mime image. $file_location = path_join( $original_directory, $properties['file'] ); if ( file_exists( $file_location ) ) { $properties['sources'][ $current_mime ]['filesize'] = wp_filesize( $file_location ); } $metadata['sizes'][ $size_name ] = $properties; wp_update_attachment_metadata( $attachment_id, $metadata ); } foreach ( $valid_mime_transforms[ $mime_type ] as $mime ) { // If this property exists no need to create the image again. if ( ! empty( $properties['sources'][ $mime ] ) ) { continue; } $source = webp_uploads_generate_image_size( $attachment_id, $size_name, $mime ); if ( is_wp_error( $source ) ) { continue; } if ( webp_uploads_should_discard_additional_image_file( $properties, $source ) ) { $destination = path_join( $original_directory, $source['file'] ); wp_delete_file_from_directory( $destination, $original_directory ); continue; } $properties['sources'][ $mime ] = $source; $metadata['sizes'][ $size_name ] = $properties; wp_update_attachment_metadata( $attachment_id, $metadata ); } $metadata['sizes'][ $size_name ] = $properties; } return $metadata; }
Leave a Comment