null, 'other_images' => [], 'ratio' => '1/1', 'class' => '', 'aspect_ratio' => true, 'tag_name' => 'div', 'html_atts' => [], 'img_atts' => [], 'inner_content' => '', 'lazyload' => true, 'size' => 'medium', // default | woo 'no_image_type' => 'default', 'suffix' => '', // Used to trigger begin_fetch_post_thumbnail_html action 'post_id' => null, // true | false | 'pill' 'display_video' => false ] ); if ($args['post_id']) { do_action( 'begin_fetch_post_thumbnail_html', $args['post_id'], $args['attachment_id'], $args['size'] ); } $classes = $args['class']; $attachment_exists = !!wp_get_attachment_image_src($args['attachment_id']); $other_html_atts = ''; $original_class = 'ct-image-container'; if (! empty($args['suffix'])) { $original_class .= '-' . $args['suffix']; } $args['html_atts']['class'] = $original_class . ( empty( $classes ) ? '' : ' ' . $classes ); $is_woo_placeholder_image = false; if (! $attachment_exists) { if ($args['no_image_type'] === 'woo') { $placeholder_image = get_option('woocommerce_placeholder_image', 0); if ($placeholder_image) { if (is_numeric($placeholder_image)) { $args['attachment_id'] = $placeholder_image; $attachment_exists = !!wp_get_attachment_image_src($args['attachment_id']); $is_woo_placeholder_image = true; } else { return apply_filters( 'woocommerce_placeholder_img', blocksy_simple_image($placeholder_image, $args), $args['size'], [100, 100] ); } } } } if (isset($args['html_atts']['class'])) { $other_html_atts .= 'class="' . $args['html_atts']['class'] . '" '; unset($args['html_atts']['class']); } if ($args['aspect_ratio']) { $args['img_atts']['style'] = blocksy_generate_ratio( $args['ratio'], $args['attachment_id'], $args['size'] ); } if ($args['attachment_id']) { global $blocksy_is_quick_view; if ( function_exists('is_product') && ( $blocksy_is_quick_view || is_product() ) && wp_get_attachment_image_src($args['attachment_id']) ) { $info = wp_get_attachment_metadata($args['attachment_id']); $args['img_atts']['data-caption'] = _wp_specialchars( get_post_field('post_excerpt', $args['attachment_id']), ENT_QUOTES, 'UTF-8', true ); $args['img_atts']['title'] = _wp_specialchars( get_post_field('post_title', $args['attachment_id']), ENT_QUOTES, 'UTF-8', true ); if (empty($args['img_atts']['data-caption'])) { unset($args['img_atts']['data-caption']); } if (empty($args['img_atts']['title'])) { unset($args['img_atts']['title']); } if ( $info && isset($info['width']) && intval($info['width']) !== 0 && is_customize_preview() ) { $args['html_atts']['data-w'] = $info['width']; $args['html_atts']['data-h'] = $info['height']; } } } foreach ($args['html_atts'] as $attr => $value) { $other_html_atts .= $attr . '="' . $value . '" '; } $other_html_atts = trim($other_html_atts); $image_result = blocksy_get_image_element($args); if ($is_woo_placeholder_image) { $dimensions = [100, 100]; if (isset($info)) { $dimensions = [ $info['width'], $info['height'] ]; } $image_result = apply_filters( 'woocommerce_placeholder_img', $image_result, $args['size'], $dimensions ); } return '<' . $args['tag_name'] . ' ' . $other_html_atts . '>' . $image_result . $args['inner_content'] . ''; } } /** * Output image element for all the cases. * * @param array $args various params that the function accepts. */ if (! function_exists('blocksy_get_image_element')) { function blocksy_get_image_element($args) { if (! wp_get_attachment_image_src($args['attachment_id'])) { return ''; } $output = ''; if ($args['display_video'] && $args['display_video'] === 'pill') { $maybe_video = get_post_meta( $args['attachment_id'], 'blocksy_media_video', true ); if (! empty($maybe_video)) { $output = ' '; } } $parser = new Blocksy_Attributes_Parser(); if ($args['display_video'] && $args['display_video'] !== 'pill') { $maybe_video = get_post_meta( $args['attachment_id'], 'blocksy_media_video', true ); if (! empty($maybe_video)) { preg_match( '#^(http|https)://.+\.(mp4|MP4|mpeg4)(?=\?|$)#i', $maybe_video, $matches ); if (! empty($matches[0])) { $poster = wp_get_attachment_url($args['attachment_id']); $class = array(); $video_attr = [ 'poster' => $poster, 'controls' => true ]; if ($args['aspect_ratio']) { $video_attr['style'] = blocksy_generate_ratio( $args['ratio'], $args['attachment_id'], $args['size'] ); } $result = blocksy_html_tag( 'video', $video_attr, blocksy_html_tag( 'source', [ 'src' => $maybe_video, 'type' => 'video/mp4' ], false ) ); return $result; } else { $embed = wp_oembed_get($maybe_video); if ( strpos($maybe_video, 'youtube') !== false || strpos($maybe_video, 'youtu.be') !== false ) { $embed = str_replace( '?feature=oembed', '?feature=oembed&enablejsapi=1&version=3&playerapiid=ytplayer', $embed ); } if ($args['aspect_ratio']) { $embed = $parser->add_attribute_to_images_with_tag( $embed, 'style', blocksy_generate_ratio( $args['ratio'], $args['attachment_id'], $args['size'] ), 'iframe' ); } return html_entity_decode($embed); } } } $image = wp_get_attachment_image( $args['attachment_id'], $args['size'], false, $args['lazyload'] ? [] : ['loading' => false] ); $has_srcset = strpos($image, 'srcset') !== false; if (blocksy_has_schema_org_markup()) { $image = $parser->add_attribute_to_images($image, 'itemprop', 'image'); } foreach ($args['img_atts'] as $attr => $attr_value) { $image = $parser->add_attribute_to_images($image, $attr, $attr_value); } if (! empty($args['other_images'])) { foreach ($args['other_images'] as $other_image) { $other_image = wp_get_attachment_image( $other_image, $args['size'], false, $args['lazyload'] ? [] : ['loading' => false] ); $other_image = $parser->add_attribute_to_images( $other_image, 'class', 'ct-swap' ); if ($args['aspect_ratio']) { $other_image = $parser->add_attribute_to_images( $other_image, 'style', blocksy_generate_ratio( $args['ratio'], $args['attachment_id'], $args['size'] ) ); } $output = $other_image . $output; } } $output = $image . $output; return $output; } } function blocksy_gcd($a, $b) { $a = abs($a); $b = abs($b); if ($a < $b) list($b,$a) = Array($a,$b); if ($b == 0) return $a; $r = $a % $b; while ($r > 0) { $a = $b; $b = $r; $r = $a % $b; } return $b; } if (! function_exists('blocksy_generate_ratio')) { function blocksy_generate_ratio($ratio, $attachment_id = null, $size = null) { if ('original' === $ratio) { $result = '1/1'; if ($attachment_id) { $all_sizes = blocksy_get_all_wp_image_sizes(); if ( $size && $size === 'woocommerce_gallery_thumbnail' && isset($all_sizes[$size]) && $all_sizes[$size]['width'] && $all_sizes[$size]['height'] ) { $info = $all_sizes[$size]; } else { $info = wp_get_attachment_metadata($attachment_id); } if ( $info && isset($info['width']) && intval($info['width']) !== 0 ) { $g = blocksy_gcd((int) $info['width'], (int) $info['height']); $ratio = ((int) $info['width'] / $g) . '/' . ((int) $info['height'] / $g); } } } else { if (strpos($ratio, ':') !== false) { $info = explode(':', $ratio); $ratio = $info[0] . '/' . $info[1]; } } return 'aspect-ratio: ' . $ratio . ';'; } } if (! function_exists('blocksy_get_all_wp_image_sizes')) { function blocksy_get_all_wp_image_sizes() { global $_wp_additional_image_sizes; $default_image_sizes = get_intermediate_image_sizes(); $image_sizes = []; foreach ($default_image_sizes as $size) { $image_sizes[ $size ] = []; $image_sizes[ $size ][ 'width' ] = intval( get_option( "{$size}_size_w" ) ); $image_sizes[ $size ][ 'height' ] = intval( get_option( "{$size}_size_h" ) ); $image_sizes[ $size ][ 'crop' ] = get_option( "{$size}_crop" ) ? get_option( "{$size}_crop" ) : false; } if ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) ) { $image_sizes = array_merge( $image_sizes, $_wp_additional_image_sizes ); } // blocksy_print($image_sizes); return $image_sizes; } } /** * Generate an image container based on image URL. * * @param string $image_src URL to the image. * @param array $args various params that the function accepts. */ if (! function_exists('blocksy_simple_image')) { function blocksy_simple_image( $image_src, $args = [] ) { $args = wp_parse_args( $args, [ 'ratio' => '1/1', 'class' => '', 'aspect_ratio' => true, 'tag_name' => 'div', 'html_atts' => [], 'img_atts' => [], 'inner_content' => '', 'lazyload' => true, 'size' => 'medium', 'has_image' => true, 'suffix' => '', 'has_default_alt' => true ] ); $original = 'ct-image-container'; if (! empty($args['suffix'])) { $original .= '-' . $args['suffix']; } if ($args['aspect_ratio']) { $args['img_atts']['style'] = blocksy_generate_ratio($args['ratio']); } $image_attr = 'src'; $other_img_atts = ''; if (! isset($args['img_atts']['alt']) && $args['has_default_alt']) { $args['img_atts']['alt'] = __('Default image', 'blocksy'); } foreach ($args['img_atts'] as $attr => $value) { $other_img_atts .= $attr . '="' . $value . '" '; } if (! isset($args['html_atts']['class'])) { $args['html_atts']['class'] = $original; } else { $args['html_atts']['class'] = $original . ' ' . $args['html_atts']['class']; } $other_html_atts = ''; foreach ( $args['html_atts'] as $attr => $value ) { $other_html_atts .= $attr . '="' . $value . '" '; } $other_html_atts = trim( $other_html_atts ); $image_content = ''; if ($args['has_image']) { $image_content = ''; if ( wp_lazy_loading_enabled('img', 'blocksy_simple_image') && false === strpos($image_content, ' loading=') ) { $image_content = wp_img_tag_add_loading_attr( $image_content, 'blocksy_simple_image' ); } } return '<' . $args['tag_name'] . ' ' . $other_html_atts . '>' . $image_content . $args['inner_content'] . ''; } }