cache = Cache::for('images')->connect('post');
$this->imgData = Cache::for('imageData')->connect('post');
if (JVB_TESTING) {
$this->cache->flush();
}
}
public function formatImage(int $ID, string $start = 'tiny', string $replace = 'large', bool $addLink = true, ?string $postSlug = null):string
{
$return = $this->cache->remember(
$this->cache->generateKey(['ID' => $ID, 'start' => $start, 'replace' => $replace]),
function() use ($ID, $start, $replace) {
// Define size order for progressive enhancement
$sizeOrder = ['tiny', 'directory-preview', 'thumbnail', 'medium', 'large', 'full'];
$startIndex = array_search($start, $sizeOrder);
$replaceIndex = array_search($replace, $sizeOrder);
// Fallback if invalid sizes provided
if ($startIndex === false) $startIndex = 0;
if ($replaceIndex === false) $replaceIndex = 2;
// Get all images up to the replace size
$images = [];
for ($i = $startIndex; $i <= $replaceIndex; $i++) {
$img = wp_get_attachment_image_src($ID, $sizeOrder[$i]);
if ($img) {
$images[$sizeOrder[$i]] = $img;
}
}
if (empty($images)) return '';
// Use first available image as src
$firstImage = reset($images);
$alt = get_post_meta($ID, '_wp_attachment_image_alt', true);
$alt = ($alt=='')? '' : ' alt="'.esc_attr($alt).'" ';
// Build srcset only with images from start to replace
$srcsetParts = [];
foreach ($images as $img) {
$srcsetParts[] = sprintf('%s %dw', $img[0], $img[1]);
}
$srcset = implode(', ', $srcsetParts);
return sprintf(
'
',
$firstImage[0],
$alt,
$srcset
);
}
);
if ($addLink) {
if (!$postSlug) {
if (is_singular()) {
global $post;
$postSlug = $post->post_name;
}else if (is_tax()) {
$tax = get_queried_object();
$postSlug = jvbNoBase($tax->taxonomy);
}elseif (is_post_type_archive()) {
$obj = get_queried_object();
$postSlug = jvbNoBase($obj->post_type);
}
}
$full = wp_get_attachment_image_src($ID, 'full');
$imgPost = get_post($ID);
if (!$imgPost) return $return;
$imgSlug = $imgPost->post_name;
$galleryAttrs = sprintf(
' data-gallery="gallery-%s" data-focus="%s-%s" data-full="%s"',
$postSlug,
$postSlug,
$imgSlug,
$full[0]
);
// Add gallery attributes to img tag
$return = str_replace('
imgData->remember(
$imgID,
function() use ($imgID) {
if (!wp_get_attachment_image($imgID, 'tiny')) {
return [];
}
return [
'tiny' => wp_get_attachment_image_src($imgID, 'tiny')[0],
'small' => wp_get_attachment_image_src($imgID, 'medium')[0],
'medium' => wp_get_attachment_image_src($imgID, 'large')[0],
'large' => wp_get_attachment_image_src($imgID, 'full')[0],
'image-alt-text'=> get_post_meta($imgID, '_wp_attachment_image_alt', true),
'image-title' => get_the_title($imgID),
'image-caption' => get_the_excerpt($imgID),
];
}
);
}
public static function getData(int $imgID):array
{
return (new Image)->getImageData($imgID);
}
}