Exemplo n.º 1
0
/**
 * 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;
}
Exemplo n.º 2
0
/**
 * 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);
}
Exemplo n.º 3
0
Arquivo: media.php Projeto: nkeat12/dv
 /**
  * @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'));
 }
Exemplo n.º 5
0
 /**
  * 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;
 }
Exemplo n.º 6
0
/**
 * 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;
}