/** * Adds 'srcset' and 'sizes' attributes to an existing 'img' element. * * @since 4.4.0 * * @see wp_calculate_image_srcset() * @see wp_calculate_image_sizes() * * @param string $image An HTML 'img' element to be filtered. * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. * @param int $attachment_id Image attachment ID. * @return string Converted 'img' element with 'srcset' and 'sizes' attributes added. */ function wp_image_add_srcset_and_sizes($image, $image_meta, $attachment_id) { // Ensure the image meta exists. if (empty($image_meta['sizes'])) { return $image; } $image_src = preg_match('/src="([^"]+)"/', $image, $match_src) ? $match_src[1] : ''; list($image_src) = explode('?', $image_src); // Return early if we couldn't get the image source. if (!$image_src) { return $image; } // Bail early if an image has been inserted and later edited. if (preg_match('/-e[0-9]{13}/', $image_meta['file'], $img_edit_hash) && strpos(wp_basename($image_src), $img_edit_hash[0]) === false) { return $image; } $base_url = trailingslashit(_wp_upload_dir_baseurl()); $image_base_url = $base_url; $dirname = dirname($image_meta['file']); if ($dirname !== '.') { $image_base_url .= trailingslashit($dirname); } $all_sizes = wp_list_pluck($image_meta['sizes'], 'file'); foreach ($all_sizes as $key => $file) { $all_sizes[$key] = $image_base_url . $file; } // Add the original image. $all_sizes[] = $base_url . $image_meta['file']; // Bail early if the image src doesn't match any of the known image sizes. if (!in_array($image_src, $all_sizes)) { return $image; } $width = preg_match('/ width="([0-9]+)"/', $image, $match_width) ? (int) $match_width[1] : 0; $height = preg_match('/ height="([0-9]+)"/', $image, $match_height) ? (int) $match_height[1] : 0; if (!$width || !$height) { /* * If attempts to parse the size value failed, attempt to use the image meta data to match * the image file name from 'src' against the available sizes for an attachment. */ $image_filename = wp_basename($image_src); if ($image_filename === wp_basename($image_meta['file'])) { $width = (int) $image_meta['width']; $height = (int) $image_meta['height']; } else { foreach ($image_meta['sizes'] as $image_size_data) { if ($image_filename === $image_size_data['file']) { $width = (int) $image_size_data['width']; $height = (int) $image_size_data['height']; break; } } } } if (!$width || !$height) { return $image; } $size_array = array($width, $height); $srcset = wp_calculate_image_srcset($size_array, $image_src, $image_meta, $attachment_id); if ($srcset) { // Check if there is already a 'sizes' attribute. $sizes = strpos($image, ' sizes='); if (!$sizes) { $sizes = wp_calculate_image_sizes($size_array, $image_src, $image_meta, $attachment_id); } } if ($srcset && $sizes) { // Format the 'srcset' and 'sizes' string and escape attributes. $attr = sprintf(' srcset="%s"', esc_attr($srcset)); if (is_string($sizes)) { $attr .= sprintf(' sizes="%s"', esc_attr($sizes)); } // Add 'srcset' and 'sizes' attributes to the image markup. $image = preg_replace('/<img ([^>]+?)[\\/ ]*>/', '<img $1' . $attr . ' />', $image); } return $image; }
/** * Create image tag markup for a custom header image. * * @since 4.4.0 * * @param array $attr Optional. Additional attributes for the image tag. Can be used * to override the default attributes. Default empty. * @return string HTML image element markup or empty string on failure. */ function get_header_image_tag($attr = array()) { $header = get_custom_header(); if (empty($header->url)) { return ''; } $width = absint($header->width); $height = absint($header->height); $attr = wp_parse_args($attr, array('src' => $header->url, 'width' => $width, 'height' => $height, 'alt' => get_bloginfo('name'))); // Generate 'srcset' and 'sizes' if not already present. if (empty($attr['srcset']) && !empty($header->attachment_id)) { $image_meta = get_post_meta($header->attachment_id, '_wp_attachment_metadata', true); $size_array = array($width, $height); if (is_array($image_meta)) { $srcset = wp_calculate_image_srcset($size_array, $header->url, $image_meta, $header->attachment_id); $sizes = !empty($attr['sizes']) ? $attr['sizes'] : wp_calculate_image_sizes($size_array, $header->url, $image_meta, $header->attachment_id); if ($srcset && $sizes) { $attr['srcset'] = $srcset; $attr['sizes'] = $sizes; } } } $attr = array_map('esc_attr', $attr); $html = '<img'; foreach ($attr as $name => $value) { $html .= ' ' . $name . '="' . $value . '"'; } $html .= ' />'; /** * Filter the markup of header images. * * @since 4.4.0 * * @param string $html The HTML image tag markup being filtered. * @param object $header The custom header object returned by 'get_custom_header()'. * @param array $attr Array of the attributes for the image tag. */ return apply_filters('get_header_image_tag', $html, $header, $attr); }
/** * @ticket 33641 */ function test_wp_calculate_image_sizes() { // Test sizes against the default WP sizes. $intermediates = array('thumbnail', 'medium', 'medium_large', 'large'); $image_meta = wp_get_attachment_metadata(self::$large_id); // Make sure themes aren't filtering the sizes array. remove_all_filters('wp_calculate_image_sizes'); foreach ($intermediates as $int_size) { $size_array = $this->_get_image_size_array_from_name($int_size); $image_src = $image_meta['sizes'][$int_size]['file']; list($width, $height) = $size_array; $expected = '(max-width: ' . $width . 'px) 100vw, ' . $width . 'px'; $sizes = wp_calculate_image_sizes($size_array, $image_src, $image_meta); $this->assertSame($expected, $sizes); } }
/** * @group 226 * @expectedException PHPUnit_Framework_Error_Notice */ function test_filter_shim_calculate_image_sizes() { // Add our test filter. add_filter('tevkori_image_sizes_args', array($this, '_test_tevkori_image_sizes_args')); // A size array is the min required data for `wp_calculate_image_sizes()`. $size = array(300, 150); $sizes = wp_calculate_image_sizes($size, null, null); // Evaluate that the sizes returned is what we expected. $this->assertSame($sizes, '100vw'); remove_filter('tevkori_image_sizes_args', array($this, '_test_tevkori_image_sizes_args')); }
/** * Get wp 4.4 responsive solution, return the srcset and sizes attributes in a string which starts with * a space * * @param $url * @return string */ public static function responsive_wp($url) { $responsive = ''; $srcset = false; $sizes = false; $image_size = SwiftyImageFunctions::$image_size; // only for wp 4.4+ if (isset($url) && function_exists('wp_calculate_image_srcset')) { $attach_id = SwiftyImageFunctions::get_attachment_id_from_url($url); if ($attach_id) { $image = SwiftyImageFunctions::get_attachment_image_src_wp($attach_id, $image_size, false); if ($image) { list($src, $width, $height) = $image; $image_meta = wp_get_attachment_metadata($attach_id); if (is_array($image_meta)) { $size_array = array(absint($width), absint($height)); // wp_calculate_image_srcset will only return sizes smaller than 1600 $srcset = wp_calculate_image_srcset($size_array, $src, $image_meta, $attach_id); $sizes = wp_calculate_image_sizes($size_array, $src, $image_meta, $attach_id); } } } } if ($sizes && $srcset) { $responsive = ' srcset="' . esc_attr($srcset) . '" sizes="' . esc_attr($sizes) . '"'; } return $responsive; }
/** * Adds 'srcset' and 'sizes' attributes to an existing 'img' element. * * @since 4.4.0 * * @see 'wp_get_attachment_image_srcset()' * @see 'wp_get_attachment_image_sizes()' * * @param string $image An HTML 'img' element to be filtered. * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. * @param int $attachment_id Image attachment ID. * @return string Converted 'img' element with 'srcset' and 'sizes' attributes added. */ function wp_image_add_srcset_and_sizes($image, $image_meta, $attachment_id) { // Ensure the image meta exists. if (empty($image_meta['sizes'])) { return $image; } $image_src = preg_match('/src="([^"]+)"/', $image, $match_src) ? $match_src[1] : ''; list($image_src) = explode('?', $image_src); // Return early if we couldn't get the image source. if (!$image_src) { return $image; } // Bail early if an image has been inserted and later edited. if (preg_match('/-e[0-9]{13}/', $image_meta['file'], $img_edit_hash) && strpos(wp_basename($image_src), $img_edit_hash[0]) === false) { return $image; } $width = preg_match('/ width="([0-9]+)"/', $image, $match_width) ? (int) $match_width[1] : 0; $height = preg_match('/ height="([0-9]+)"/', $image, $match_height) ? (int) $match_height[1] : 0; if (!$width || !$height) { /* * If attempts to parse the size value failed, attempt to use the image meta data to match * the image file name from 'src' against the available sizes for an attachment. */ $image_filename = wp_basename($image_src); if ($image_filename === wp_basename($image_meta['file'])) { $width = (int) $image_meta['width']; $height = (int) $image_meta['height']; } else { foreach ($image_meta['sizes'] as $image_size_data) { if ($image_filename === $image_size_data['file']) { $width = (int) $image_size_data['width']; $height = (int) $image_size_data['height']; break; } } } } if (!$width || !$height) { return $image; } $size_array = array($width, $height); $srcset = wp_calculate_image_srcset($size_array, $image_src, $image_meta, $attachment_id); if ($srcset) { $sizes = wp_calculate_image_sizes($size_array, $image_src, $image_meta, $attachment_id); } if ($srcset && $sizes) { // Format the 'srcset' and 'sizes' string and escape attributes. $srcset_and_sizes = sprintf(' srcset="%s" sizes="%s"', esc_attr($srcset), esc_attr($sizes)); // Add 'srcset' and 'sizes' attributes to the image markup. $image = preg_replace('/<img ([^>]+?)[\\/ ]*>/', '<img $1' . $srcset_and_sizes . ' />', $image); } return $image; }