<?php function wp_crop_image($src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false) { $src_file = $src; if (is_numeric($src)) { $src_file = get_attached_file($src); if (!file_exists($src_file)) { $src = _load_image_to_edit_path($src, 'full'); } else { $src = $src_file; } } $editor = wp_get_image_editor($src); 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)) { return $src; } if (!$dst_file) { $dst_file = str_replace(wp_basename($src_file), 'cropped-' . wp_basename($src_file), $src_file); } wp_mkdir_p(dirname($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)) { return $result; } return $dst_file; } function wp_get_missing_image_subsizes($attachment_id) { if (!wp_attachment_is_image($attachment_id)) { return array(); } $registered_sizes = wp_get_registered_image_subsizes(); $image_meta = wp_get_attachment_metadata($attachment_id); if (empty($image_meta)) { return $registered_sizes; } if (!empty($image_meta['original_image'])) { $image_file = wp_get_original_image_path($attachment_id); $imagesize = wp_getimagesize($image_file); } if (!empty($imagesize)) { $full_width = $imagesize[0]; $full_height = $imagesize[1]; } else { $full_width = (int) $image_meta['width']; $full_height = (int) $image_meta['height']; } $possible_sizes = array(); foreach ($registered_sizes as $size_name => $size_data) { if (image_resize_dimensions($full_width, $full_height, $size_data['width'], $size_data['height'], $size_data['crop'])) { $possible_sizes[$size_name] = $size_data; } } if (empty($image_meta['sizes'])) { $image_meta['sizes'] = array(); } $missing_sizes = array_diff_key($possible_sizes, $image_meta['sizes']); return apply_filters('wp_get_missing_image_subsizes', $missing_sizes, $image_meta, $attachment_id); } function wp_update_image_subsizes($attachment_id) { $image_meta = wp_get_attachment_metadata($attachment_id); $image_file = wp_get_original_image_path($attachment_id); if (empty($image_meta) || !is_array($image_meta)) { if (!empty($image_file)) { $image_meta = wp_create_image_subsizes($image_file, $attachment_id); } else { return new WP_Error('invalid_attachment', __('The attached file cannot be found.')); } } else { $missing_sizes = wp_get_missing_image_subsizes($attachment_id); if (empty($missing_sizes)) { return $image_meta; } $image_meta = _wp_make_subsizes($missing_sizes, $image_file, $image_meta, $attachment_id); } $image_meta = apply_filters('wp_generate_attachment_metadata', $image_meta, $attachment_id, 'update'); wp_update_attachment_metadata($attachment_id, $image_meta); return $image_meta; } function _wp_image_meta_replace_original($saved_data, $original_file, $image_meta, $attachment_id) { $new_file = $saved_data['path']; update_attached_file($attachment_id, $new_file); $image_meta['width'] = $saved_data['width']; $image_meta['height'] = $saved_data['height']; $image_meta['file'] = _wp_relative_upload_path($new_file); $image_meta['original_image'] = wp_basename($original_file); return $image_meta; } function wp_create_image_subsizes($file, $attachment_id) { $imagesize = wp_getimagesize($file); if (empty($imagesize)) { return array(); } $image_meta = array('width' => $imagesize[0], 'height' => $imagesize[1], 'file' => _wp_relative_upload_path($file), 'sizes' => array()); $exif_meta = wp_read_image_metadata($file); if ($exif_meta) { $image_meta['image_meta'] = $exif_meta; } if ('image/png' !== $imagesize['mime']) { $threshold = (int) apply_filters('big_image_size_threshold', 2560, $imagesize, $file, $attachment_id); if ($threshold && ($image_meta['width'] > $threshold || $image_meta['height'] > $threshold)) { $editor = wp_get_image_editor($file); if (is_wp_error($editor)) { return $image_meta; } $resized = $editor->resize($threshold, $threshold); $rotated = null; if (!is_wp_error($resized) && is_array($exif_meta)) { $resized = $editor->maybe_exif_rotate(); $rotated = $resized; } if (!is_wp_error($resized)) { $saved = $editor->save($editor->generate_filename('scaled')); if (!is_wp_error($saved)) { $image_meta = _wp_image_meta_replace_original($saved, $file, $image_meta, $attachment_id); if (true === $rotated && !empty($image_meta['image_meta']['orientation'])) { $image_meta['image_meta']['orientation'] = 1; } } else { } } else { } } elseif (!empty($exif_meta['orientation']) && 1 !== (int) $exif_meta['orientation']) { $editor = wp_get_image_editor($file); if (is_wp_error($editor)) { return $image_meta; } $rotated = $editor->maybe_exif_rotate(); if (true === $rotated) { $saved = $editor->save($editor->generate_filename('rotated')); if (!is_wp_error($saved)) { $image_meta = _wp_image_meta_replace_original($saved, $file, $image_meta, $attachment_id); if (!empty($image_meta['image_meta']['orientation'])) { $image_meta['image_meta']['orientation'] = 1; } } else { } } } } wp_update_attachment_metadata($attachment_id, $image_meta); $new_sizes = wp_get_registered_image_subsizes(); $new_sizes = apply_filters('intermediate_image_sizes_advanced', $new_sizes, $image_meta, $attachment_id); return _wp_make_subsizes($new_sizes, $file, $image_meta, $attachment_id); } function _wp_make_subsizes($new_sizes, $file, $image_meta, $attachment_id) { if (empty($image_meta) || !is_array($image_meta)) { return array(); } if (isset($image_meta['sizes']) && is_array($image_meta['sizes'])) { foreach ($image_meta['sizes'] as $size_name => $size_meta) { if (array_key_exists($size_name, $new_sizes)) { unset($new_sizes[$size_name]); } } } else { $image_meta['sizes'] = array(); } if (empty($new_sizes)) { return $image_meta; } $priority = array('medium' => null, 'large' => null, 'thumbnail' => null, 'medium_large' => null); $new_sizes = array_filter(array_merge($priority, $new_sizes)); $editor = wp_get_image_editor($file); if (is_wp_error($editor)) { return $image_meta; } if (!empty($image_meta['image_meta'])) { $rotated = $editor->maybe_exif_rotate(); if (is_wp_error($rotated)) { } } if (method_exists($editor, 'make_subsize')) { foreach ($new_sizes as $new_size_name => $new_size_data) { $new_size_meta = $editor->make_subsize($new_size_data); if (is_wp_error($new_size_meta)) { } else { $image_meta['sizes'][$new_size_name] = $new_size_meta; wp_update_attachment_metadata($attachment_id, $image_meta); } } } else { $created_sizes = $editor->multi_resize($new_sizes); if (!empty($created_sizes)) { $image_meta['sizes'] = array_merge($image_meta['sizes'], $created_sizes); wp_update_attachment_metadata($attachment_id, $image_meta); } } return $image_meta; } function wp_generate_attachment_metadata($attachment_id, $file) { $attachment = get_post($attachment_id); $metadata = array(); $support = false; $mime_type = get_post_mime_type($attachment); if (preg_match('!^image/!', $mime_type) && file_is_displayable_image($file)) { $metadata = wp_create_image_subsizes($file, $attachment_id); } 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'); } 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'); } if ($support && !empty($metadata['image']['data'])) { $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('.', '-', 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' => ''); $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); } } } elseif ('application/pdf' === $mime_type) { $fallback_sizes = array('thumbnail', 'medium', 'large'); $fallback_sizes = apply_filters('fallback_intermediate_image_sizes', $fallback_sizes, $metadata); $registered_sizes = wp_get_registered_image_subsizes(); $merged_sizes = array_intersect_key($registered_sizes, array_flip($fallback_sizes)); if (isset($merged_sizes['thumbnail']) && is_array($merged_sizes['thumbnail'])) { $merged_sizes['thumbnail']['crop'] = false; } if (!empty($merged_sizes)) { $editor = wp_get_image_editor($file); if (!is_wp_error($editor)) { $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'); unset($editor); if (!is_wp_error($uploaded)) { $image_file = $uploaded['path']; unset($uploaded['path']); $metadata['sizes'] = array('full' => $uploaded); wp_update_attachment_metadata($attachment_id, $metadata); $metadata = _wp_make_subsizes($merged_sizes, $image_file, $metadata, $attachment_id); } } } } if ($metadata) { unset($metadata['image']['data']); } return apply_filters('wp_generate_attachment_metadata', $metadata, $attachment_id, 'create'); } function wp_exif_frac2dec($str) { if (false === strpos($str, '/')) { return $str; } list($numerator, $denominator) = explode('/', $str); if (!empty($denominator)) { return $numerator / $denominator; } return $str; } function wp_exif_date2ts($str) { list($date, $time) = explode(' ', trim($str)); list($y, $m, $d) = explode(':', $date); return strtotime("{$y}-{$m}-{$d} {$time}"); } function wp_read_image_metadata($file) { if (!file_exists($file)) { return false; } list(, , $image_type) = wp_getimagesize($file); $meta = array('aperture' => 0, 'credit' => '', 'camera' => '', 'caption' => '', 'created_timestamp' => 0, 'copyright' => '', 'focal_length' => 0, 'iso' => 0, 'shutter_speed' => 0, 'title' => '', 'orientation' => 0, 'keywords' => array()); $iptc = array(); if (is_callable('iptcparse')) { wp_getimagesize($file, $info); if (!empty($info['APP13'])) { if (!defined('WP_RUN_CORE_TESTS') && defined('WP_DEBUG') && WP_DEBUG) { $iptc = iptcparse($info['APP13']); } else { $iptc = @iptcparse($info['APP13']); } if (!empty($iptc['2#105'][0])) { $meta['title'] = trim($iptc['2#105'][0]); } elseif (!empty($iptc['2#005'][0])) { $meta['title'] = trim($iptc['2#005'][0]); } if (!empty($iptc['2#120'][0])) { $caption = trim($iptc['2#120'][0]); mbstring_binary_safe_encoding(); $caption_length = strlen($caption); reset_mbstring_encoding(); if (empty($meta['title']) && $caption_length < 80) { $meta['title'] = $caption; } $meta['caption'] = $caption; } if (!empty($iptc['2#110'][0])) { $meta['credit'] = trim($iptc['2#110'][0]); } elseif (!empty($iptc['2#080'][0])) { $meta['credit'] = trim($iptc['2#080'][0]); } if (!empty($iptc['2#055'][0]) && !empty($iptc['2#060'][0])) { $meta['created_timestamp'] = strtotime($iptc['2#055'][0] . ' ' . $iptc['2#060'][0]); } if (!empty($iptc['2#116'][0])) { $meta['copyright'] = trim($iptc['2#116'][0]); } if (!empty($iptc['2#025'][0])) { $meta['keywords'] = array_values($iptc['2#025']); } } } $exif = array(); $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, true)) { if (!defined('WP_RUN_CORE_TESTS') && defined('WP_DEBUG') && WP_DEBUG) { $exif = exif_read_data($file); } else { $exif = @exif_read_data($file); } if (!empty($exif['ImageDescription'])) { mbstring_binary_safe_encoding(); $description_length = strlen($exif['ImageDescription']); reset_mbstring_encoding(); if (empty($meta['title']) && $description_length < 80) { $meta['title'] = trim($exif['ImageDescription']); } if (empty($meta['caption']) && !empty($exif['COMPUTED']['UserComment'])) { $meta['caption'] = trim($exif['COMPUTED']['UserComment']); } if (empty($meta['caption'])) { $meta['caption'] = trim($exif['ImageDescription']); } } elseif (empty($meta['caption']) && !empty($exif['Comments'])) { $meta['caption'] = trim($exif['Comments']); } if (empty($meta['credit'])) { if (!empty($exif['Artist'])) { $meta['credit'] = trim($exif['Artist']); } elseif (!empty($exif['Author'])) { $meta['credit'] = trim($exif['Author']); } } if (empty($meta['copyright']) && !empty($exif['Copyright'])) { $meta['copyright'] = trim($exif['Copyright']); } if (!empty($exif['FNumber'])) { $meta['aperture'] = round(wp_exif_frac2dec($exif['FNumber']), 2); } if (!empty($exif['Model'])) { $meta['camera'] = trim($exif['Model']); } if (empty($meta['created_timestamp']) && !empty($exif['DateTimeDigitized'])) { $meta['created_timestamp'] = wp_exif_date2ts($exif['DateTimeDigitized']); } if (!empty($exif['FocalLength'])) { $meta['focal_length'] = (string) wp_exif_frac2dec($exif['FocalLength']); } if (!empty($exif['ISOSpeedRatings'])) { $meta['iso'] = is_array($exif['ISOSpeedRatings']) ? reset($exif['ISOSpeedRatings']) : $exif['ISOSpeedRatings']; $meta['iso'] = trim($meta['iso']); } if (!empty($exif['ExposureTime'])) { $meta['shutter_speed'] = (string) wp_exif_frac2dec($exif['ExposureTime']); } if (!empty($exif['Orientation'])) { $meta['orientation'] = $exif['Orientation']; } } foreach (array('title', 'caption', 'credit', 'copyright', 'camera', 'iso') as $key) { if ($meta[$key] && !seems_utf8($meta[$key])) { $meta[$key] = utf8_encode($meta[$key]); } } foreach ($meta['keywords'] as $key => $keyword) { if (!seems_utf8($keyword)) { $meta['keywords'][$key] = utf8_encode($keyword); } } $meta = wp_kses_post_deep($meta); return apply_filters('wp_read_image_metadata', $meta, $file, $image_type, $iptc, $exif); } function file_is_valid_image($path) { $size = wp_getimagesize($path); return !empty($size); } function file_is_displayable_image($path) { $displayable_image_types = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO); $info = wp_getimagesize($path); if (empty($info)) { $result = false; } elseif (!in_array($info[2], $displayable_image_types, true)) { $result = false; } else { $result = true; } return apply_filters('file_is_displayable_image', $result, $path); } function load_image_to_edit($attachment_id, $mime_type, $size = 'full') { $filepath = _load_image_to_edit_path($attachment_id, $size); if (empty($filepath)) { return false; } switch ($mime_type) { case 'image/jpeg': $image = imagecreatefromjpeg($filepath); break; case 'image/png': $image = imagecreatefrompng($filepath); break; case 'image/gif': $image = imagecreatefromgif($filepath); break; default: $image = false; break; } if (is_gd_image($image)) { $image = apply_filters('load_image_to_edit', $image, $attachment_id, $size); if (function_exists('imagealphablending') && function_exists('imagesavealpha')) { imagealphablending($image, false); imagesavealpha($image, true); } } return $image; } function _load_image_to_edit_path($attachment_id, $size = 'full') { $filepath = get_attached_file($attachment_id); if ($filepath && file_exists($filepath)) { if ('full' !== $size) { $data = image_get_intermediate_size($attachment_id, $size); if ($data) { $filepath = path_join(dirname($filepath), $data['file']); $filepath = apply_filters('load_image_to_edit_filesystempath', $filepath, $attachment_id, $size); } } } elseif (function_exists('fopen') && ini_get('allow_url_fopen')) { $filepath = apply_filters('load_image_to_edit_attachmenturl', wp_get_attachment_url($attachment_id), $attachment_id, $size); } return apply_filters('load_image_to_edit_path', $filepath, $attachment_id, $size); } function _copy_image_file($attachment_id) { $dst_file = get_attached_file($attachment_id); $src_file = $dst_file; if (!file_exists($src_file)) { $src_file = _load_image_to_edit_path($attachment_id); } if ($src_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)); wp_mkdir_p(dirname($dst_file)); if (!copy($src_file, $dst_file)) { $dst_file = false; } } else { $dst_file = false; } return $dst_file; }