Untitled
unknown
php
a year ago
7.0 kB
11
Indexable
<?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;
}Editor is loading...
Leave a Comment