diff -r c7c34916027a -r 177826044cd9 wp/wp-admin/includes/image.php --- a/wp/wp-admin/includes/image.php Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-admin/includes/image.php Mon Oct 14 18:28:13 2019 +0200 @@ -37,15 +37,18 @@ } $editor = wp_get_image_editor( $src ); - if ( is_wp_error( $editor ) ) + if ( is_wp_error( $editor ) ) { return $editor; + } $src = $editor->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs ); - if ( is_wp_error( $src ) ) + if ( is_wp_error( $src ) ) { return $src; + } - if ( ! $dst_file ) - $dst_file = str_replace( basename( $src_file ), 'cropped-' . basename( $src_file ), $src_file ); + if ( ! $dst_file ) { + $dst_file = str_replace( wp_basename( $src_file ), 'cropped-' . wp_basename( $src_file ), $src_file ); + } /* * The directory containing the original file may no longer exist when @@ -53,11 +56,12 @@ */ wp_mkdir_p( dirname( $dst_file ) ); - $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) ); + $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) ); $result = $editor->save( $dst_file ); - if ( is_wp_error( $result ) ) + if ( is_wp_error( $result ) ) { return $result; + } return $dst_file; } @@ -74,46 +78,50 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) { $attachment = get_post( $attachment_id ); - $metadata = array(); - $support = false; + $metadata = array(); + $support = false; $mime_type = get_post_mime_type( $attachment ); if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) { - $imagesize = getimagesize( $file ); - $metadata['width'] = $imagesize[0]; + $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); + $metadata['file'] = _wp_relative_upload_path( $file ); // Make thumbnails and other intermediate sizes. $_wp_additional_image_sizes = wp_get_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 ] = array( + 'width' => '', + 'height' => '', + 'crop' => false, + ); + if ( isset( $_wp_additional_image_sizes[ $s ]['width'] ) ) { // For theme-added sizes - $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); + $sizes[ $s ]['width'] = intval( $_wp_additional_image_sizes[ $s ]['width'] ); } else { // For default sizes set in options - $sizes[$s]['width'] = get_option( "{$s}_size_w" ); + $sizes[ $s ]['width'] = get_option( "{$s}_size_w" ); } - if ( isset( $_wp_additional_image_sizes[$s]['height'] ) ) { + if ( isset( $_wp_additional_image_sizes[ $s ]['height'] ) ) { // For theme-added sizes - $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); + $sizes[ $s ]['height'] = intval( $_wp_additional_image_sizes[ $s ]['height'] ); } else { // For default sizes set in options - $sizes[$s]['height'] = get_option( "{$s}_size_h" ); + $sizes[ $s ]['height'] = get_option( "{$s}_size_h" ); } - if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) ) { + if ( isset( $_wp_additional_image_sizes[ $s ]['crop'] ) ) { // For theme-added sizes - $sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop']; + $sizes[ $s ]['crop'] = $_wp_additional_image_sizes[ $s ]['crop']; } else { // For default sizes set in options - $sizes[$s]['crop'] = get_option( "{$s}_crop" ); + $sizes[ $s ]['crop'] = get_option( "{$s}_crop" ); } } @@ -122,46 +130,51 @@ * * @since 2.9.0 * @since 4.4.0 Added the `$metadata` argument. + * @since 5.1.0 Added the `$attachment_id` argument. * - * @param array $sizes An associative array of image sizes. - * @param array $metadata An associative array of image metadata: width, height, file. + * @param array $sizes An associative array of image sizes. + * @param array $metadata An associative array of image metadata: width, height, file. + * @param int $attachment_id Current attachment ID. */ - $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes, $metadata ); + $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes, $metadata, $attachment_id ); if ( $sizes ) { $editor = wp_get_image_editor( $file ); - if ( ! is_wp_error( $editor ) ) + 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 ) + if ( $image_meta ) { $metadata['image_meta'] = $image_meta; - + } } elseif ( wp_attachment_is( 'video', $attachment ) ) { $metadata = wp_read_video_metadata( $file ); - $support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' ); + $support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' ); } elseif ( wp_attachment_is( 'audio', $attachment ) ) { $metadata = wp_read_audio_metadata( $file ); - $support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' ); + $support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' ); } 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 - ) ); + $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 ) ) { @@ -169,20 +182,20 @@ } else { $ext = '.jpg'; switch ( $metadata['image']['mime'] ) { - case 'image/gif': - $ext = '.gif'; - break; - case 'image/png': - $ext = '.png'; - break; + case 'image/gif': + $ext = '.gif'; + break; + case 'image/png': + $ext = '.png'; + break; } - $basename = str_replace( '.', '-', basename( $file ) ) . '-image' . $ext; + $basename = str_replace( '.', '-', wp_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' => '', + 'post_type' => 'attachment', + 'post_content' => '', ); /** * Filters the parameters for the attachment thumbnail creation. @@ -202,9 +215,9 @@ update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id ); } } - } - // Try to create image thumbnails for PDFs - else if ( 'application/pdf' === $mime_type ) { + } elseif ( 'application/pdf' === $mime_type ) { + // Try to create image thumbnails for PDFs. + $fallback_sizes = array( 'thumbnail', 'medium', @@ -221,7 +234,7 @@ */ $fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata ); - $sizes = array(); + $sizes = array(); $_wp_additional_image_sizes = wp_get_additional_image_sizes(); foreach ( $fallback_sizes as $s ) { @@ -256,8 +269,8 @@ * PDFs may have the same file filename as JPEGs. * Ensure the PDF preview image does not overwrite any JPEG images that already exist. */ - $dirname = dirname( $file ) . '/'; - $ext = '.' . pathinfo( $file, PATHINFO_EXTENSION ); + $dirname = dirname( $file ) . '/'; + $ext = '.' . pathinfo( $file, PATHINFO_EXTENSION ); $preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' ); $uploaded = $editor->save( $preview_file, 'image/jpeg' ); @@ -269,7 +282,7 @@ unset( $uploaded['path'] ); if ( ! is_wp_error( $editor ) ) { - $metadata['sizes'] = $editor->multi_resize( $sizes ); + $metadata['sizes'] = $editor->multi_resize( $sizes ); $metadata['sizes']['full'] = $uploaded; } } @@ -301,10 +314,11 @@ * @param string $str * @return int|float */ -function wp_exif_frac2dec($str) { +function wp_exif_frac2dec( $str ) { @list( $n, $d ) = explode( '/', $str ); - if ( !empty($d) ) + if ( ! empty( $d ) ) { return $n / $d; + } return $str; } @@ -316,9 +330,9 @@ * @param string $str * @return int */ -function wp_exif_date2ts($str) { - @list( $date, $time ) = explode( ' ', trim($str) ); - @list( $y, $m, $d ) = explode( ':', $date ); +function wp_exif_date2ts( $str ) { + @list( $date, $time ) = explode( ' ', trim( $str ) ); + @list( $y, $m, $d ) = explode( ':', $date ); return strtotime( "{$y}-{$m}-{$d} {$time}" ); } @@ -340,10 +354,11 @@ * @return bool|array False on failure. Image metadata array on success. */ function wp_read_image_metadata( $file ) { - if ( ! file_exists( $file ) ) + if ( ! file_exists( $file ) ) { return false; + } - list( , , $sourceImageType ) = @getimagesize( $file ); + list( , , $image_type ) = @getimagesize( $file ); /* * EXIF contains a bunch of data we'll probably never need formatted in ways @@ -352,18 +367,18 @@ * floats, dates to unix timestamps, and everything else to strings. */ $meta = array( - 'aperture' => 0, - 'credit' => '', - 'camera' => '', - 'caption' => '', + 'aperture' => 0, + 'credit' => '', + 'camera' => '', + 'caption' => '', 'created_timestamp' => 0, - 'copyright' => '', - 'focal_length' => 0, - 'iso' => 0, - 'shutter_speed' => 0, - 'title' => '', - 'orientation' => 0, - 'keywords' => array(), + 'copyright' => '', + 'focal_length' => 0, + 'iso' => 0, + 'shutter_speed' => 0, + 'title' => '', + 'orientation' => 0, + 'keywords' => array(), ); $iptc = array(); @@ -380,10 +395,10 @@ // Headline, "A brief synopsis of the caption." if ( ! empty( $iptc['2#105'][0] ) ) { $meta['title'] = trim( $iptc['2#105'][0] ); - /* - * Title, "Many use the Title field to store the filename of the image, - * though the field may be used in many ways." - */ + /* + * Title, "Many use the Title field to store the filename of the image, + * though the field may be used in many ways." + */ } elseif ( ! empty( $iptc['2#005'][0] ) ) { $meta['title'] = trim( $iptc['2#005'][0] ); } @@ -403,23 +418,28 @@ $meta['caption'] = $caption; } - if ( ! empty( $iptc['2#110'][0] ) ) // credit + if ( ! empty( $iptc['2#110'][0] ) ) { // credit $meta['credit'] = trim( $iptc['2#110'][0] ); - elseif ( ! empty( $iptc['2#080'][0] ) ) // creator / legacy byline + } elseif ( ! empty( $iptc['2#080'][0] ) ) { // creator / legacy byline $meta['credit'] = trim( $iptc['2#080'][0] ); + } - if ( ! empty( $iptc['2#055'][0] ) && ! empty( $iptc['2#060'][0] ) ) // created date and time + if ( ! empty( $iptc['2#055'][0] ) && ! empty( $iptc['2#060'][0] ) ) { // created date and time $meta['created_timestamp'] = strtotime( $iptc['2#055'][0] . ' ' . $iptc['2#060'][0] ); + } - if ( ! empty( $iptc['2#116'][0] ) ) // copyright + if ( ! empty( $iptc['2#116'][0] ) ) { // copyright $meta['copyright'] = trim( $iptc['2#116'][0] ); + } if ( ! empty( $iptc['2#025'][0] ) ) { // keywords array $meta['keywords'] = array_values( $iptc['2#025'] ); } - } + } } + $exif = array(); + /** * Filters the image types to check for exif data. * @@ -427,7 +447,9 @@ * * @param array $image_types Image types to check for exif data. */ - if ( is_callable( 'exif_read_data' ) && in_array( $sourceImageType, apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) ) ) ) { + $exif_image_types = apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) ); + + if ( is_callable( 'exif_read_data' ) && in_array( $image_type, $exif_image_types ) ) { $exif = @exif_read_data( $file ); if ( ! empty( $exif['ImageDescription'] ) ) { @@ -454,7 +476,7 @@ if ( empty( $meta['credit'] ) ) { if ( ! empty( $exif['Artist'] ) ) { $meta['credit'] = trim( $exif['Artist'] ); - } elseif ( ! empty($exif['Author'] ) ) { + } elseif ( ! empty( $exif['Author'] ) ) { $meta['credit'] = trim( $exif['Author'] ); } } @@ -505,13 +527,15 @@ * * @since 2.5.0 * @since 4.4.0 The `$iptc` parameter was added. + * @since 5.0.0 The `$exif` parameter was added. * - * @param array $meta Image meta data. - * @param string $file Path to image file. - * @param int $sourceImageType Type of image. - * @param array $iptc IPTC data. + * @param array $meta Image meta data. + * @param string $file Path to image file. + * @param int $image_type Type of image, one of the `IMAGETYPE_XXX` constants. + * @param array $iptc IPTC data. + * @param array $exif EXIF data. */ - return apply_filters( 'wp_read_image_metadata', $meta, $file, $sourceImageType, $iptc ); + return apply_filters( 'wp_read_image_metadata', $meta, $file, $image_type, $iptc, $exif ); } @@ -523,9 +547,9 @@ * @param string $path File path to test if valid image. * @return bool True if valid image, false if not valid image. */ -function file_is_valid_image($path) { - $size = @getimagesize($path); - return !empty($size); +function file_is_valid_image( $path ) { + $size = @getimagesize( $path ); + return ! empty( $size ); } /** @@ -536,9 +560,14 @@ * @param string $path File path to test. * @return bool True if suitable, false if not suitable. */ -function file_is_displayable_image($path) { +function file_is_displayable_image( $path ) { $displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP ); + // IMAGETYPE_ICO is only defined in PHP 5.3+. + if ( defined( 'IMAGETYPE_ICO' ) ) { + $displayable_image_types[] = IMAGETYPE_ICO; + } + $info = @getimagesize( $path ); if ( empty( $info ) ) { $result = false; @@ -571,24 +600,25 @@ */ function load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) { $filepath = _load_image_to_edit_path( $attachment_id, $size ); - if ( empty( $filepath ) ) + if ( empty( $filepath ) ) { return false; + } switch ( $mime_type ) { case 'image/jpeg': - $image = imagecreatefromjpeg($filepath); + $image = imagecreatefromjpeg( $filepath ); break; case 'image/png': - $image = imagecreatefrompng($filepath); + $image = imagecreatefrompng( $filepath ); break; case 'image/gif': - $image = imagecreatefromgif($filepath); + $image = imagecreatefromgif( $filepath ); break; default: $image = false; break; } - if ( is_resource($image) ) { + if ( is_resource( $image ) ) { /** * Filters the current image being loaded for editing. * @@ -599,9 +629,9 @@ * @param string $size Image size. */ $image = apply_filters( 'load_image_to_edit', $image, $attachment_id, $size ); - if ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) { - imagealphablending($image, false); - imagesavealpha($image, true); + if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) { + imagealphablending( $image, false ); + imagesavealpha( $image, true ); } } return $image; @@ -676,12 +706,13 @@ */ function _copy_image_file( $attachment_id ) { $dst_file = $src_file = get_attached_file( $attachment_id ); - if ( ! file_exists( $src_file ) ) + if ( ! file_exists( $src_file ) ) { $src_file = _load_image_to_edit_path( $attachment_id ); + } if ( $src_file ) { - $dst_file = str_replace( basename( $dst_file ), 'copy-' . basename( $dst_file ), $dst_file ); - $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) ); + $dst_file = str_replace( wp_basename( $dst_file ), 'copy-' . wp_basename( $dst_file ), $dst_file ); + $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) ); /* * The directory containing the original file may no longer @@ -689,8 +720,9 @@ */ wp_mkdir_p( dirname( $dst_file ) ); - if ( ! @copy( $src_file, $dst_file ) ) + if ( ! @copy( $src_file, $dst_file ) ) { $dst_file = false; + } } else { $dst_file = false; }