<?php function bricks_append_product_gallery_images() { global $post; if (!$post || get_post_type($post->ID) !== 'product') { return ''; } // Get product gallery images $gallery_images = get_post_meta($post->ID, '_product_image_gallery', true); // Return early if no gallery images found if (empty($gallery_images)) { return ''; } $image_ids = explode(',', $gallery_images); $output = ''; // Function to get image dimensions function get_image_dimensions($image_id) { $image = wp_get_attachment_metadata($image_id); return $image ? ['width' => $image['width'], 'height' => $image['height']] : ['width' => 800, 'height' => 800]; // Fallback size } // Loop through gallery images foreach ($image_ids as $image_id) { $image_url = wp_get_attachment_image_url($image_id, 'full'); $image_size = get_image_dimensions($image_id); if ($image_url) { $output .= '<a href="' . esc_url($image_url) . '" class="brxe-image tag bricks-lightbox" data-pswp-src="' . esc_url($image_url) . '" data-pswp-width="' . esc_attr($image_size['width']) . '" data-pswp-height="' . esc_attr($image_size['height']) . '"> <img src="' . esc_url($image_url) . '" class="css-filter size-large" /> </a>'; } } // Wrap the output inside the product-images div $output = '<script> document.addEventListener("DOMContentLoaded", function() { let productImagesDiv = document.querySelector(".product-images"); if (productImagesDiv) { productImagesDiv.innerHTML += `' . addslashes($output) . '`; } }); </script>'; return $output; } // Register shortcode add_shortcode('append_product_gallery_images', 'bricks_append_product_gallery_images'); ?>
[append_product_gallery_images]
<?php function custom_product_images_with_variations() { global $post, $product; if ( ! $post || get_post_type( $post->ID ) !== 'product' ) { return ''; } // 1. Collect image IDs: featured image first, then gallery images (avoiding duplicates) $images = array(); $featured_image_id = get_post_thumbnail_id( $post->ID ); if ( $featured_image_id ) { $images[] = $featured_image_id; } $gallery_images = get_post_meta( $post->ID, '_product_image_gallery', true ); if ( ! empty( $gallery_images ) ) { $gallery_ids = explode( ',', $gallery_images ); foreach ( $gallery_ids as $id ) { if ( ! in_array( $id, $images ) ) { $images[] = $id; } } } // 2. Build a mapping of variation value (for Colors) to image ID. // This example assumes a variable product using the "Colors" attribute (attribute_pa_colors). $variation_mapping = array(); if ( $product && $product->is_type( 'variable' ) ) { $available_variations = $product->get_available_variations(); foreach ( $available_variations as $variation ) { if ( isset( $variation['attributes']['attribute_pa_colors'] ) && ! empty( $variation['attributes']['attribute_pa_colors'] ) ) { $color = strtolower( $variation['attributes']['attribute_pa_colors'] ); $variation_image_id = $variation['image_id']; if ( $variation_image_id && ! isset( $variation_mapping[ $color ] ) ) { $variation_mapping[ $color ] = $variation_image_id; } } } } // 3. Build the HTML for the images. // Each image is wrapped in an anchor that has the lightbox classes and data attributes. $html = ''; foreach ( $images as $image_id ) { $image_url = wp_get_attachment_image_url( $image_id, 'full' ); $image_meta = wp_get_attachment_metadata( $image_id ); $width = isset( $image_meta['width'] ) ? $image_meta['width'] : 800; $height = isset( $image_meta['height'] ) ? $image_meta['height'] : 800; // Get alt text; fallback to the filename (without extension) if empty. $image_alt = get_post_meta( $image_id, '_wp_attachment_image_alt', true ); if ( empty( $image_alt ) ) { $attachment = get_post( $image_id ); $image_alt = $attachment ? pathinfo( $attachment->guid, PATHINFO_FILENAME ) : ''; } // If this image is used as a variation image, add a data attribute. $data_variation = ''; $found_variation = array_search( $image_id, $variation_mapping ); if ( $found_variation !== false ) { $data_variation = ' data-variation="' . esc_attr( $found_variation ) . '"'; } if ( $image_url ) { // IMPORTANT: Use the classes your lightbox expects. $html .= '<a href="' . esc_url( $image_url ) . '" class="brxe-image tag bricks-lightbox"'. $data_variation .' data-pswp-src="' . esc_url( $image_url ) . '" data-pswp-width="' . esc_attr( $width ) . '" data-pswp-height="' . esc_attr( $height ) . '">'; $html .= '<img src="' . esc_url( $image_url ) . '" alt="' . esc_attr( $image_alt ) . '" class="custom-image" />'; $html .= '</a>'; } } // 4. Wrap all images in a container. $output = '<div class="custom-product-images">'.$html.'</div>'; return $output; } add_shortcode('custom_product_images', 'custom_product_images_with_variations'); ?>
document.addEventListener("DOMContentLoaded", function(){ var container = document.querySelector(".custom-product-images"); if (!container) return; // Save the original order of the image anchors. var originalNodes = Array.from(container.children); function reorderImages(selectedValue) { // If no variation is selected, remove any highlight and restore original order. if (!selectedValue) { container.querySelectorAll("a.highlight").forEach(function(a) { a.classList.remove("highlight"); }); while (container.firstChild) { container.removeChild(container.firstChild); } originalNodes.forEach(function(node) { container.appendChild(node); }); return; } // If a variation is selected, find the corresponding image link. var target = container.querySelector('a[data-variation="' + selectedValue.toLowerCase() + '"]'); if (target) { container.querySelectorAll("a.highlight").forEach(function(a) { a.classList.remove("highlight"); }); target.classList.add("highlight"); container.insertBefore(target, container.firstChild); } } // Listen for changes on the hidden select element. var variationSelect = document.querySelector("select[name='attribute_pa_colors']"); if (variationSelect) { variationSelect.addEventListener("change", function(){ var selected = variationSelect.value; reorderImages(selected); }); } // Listen for clicks on radio-style variation selectors. var variationRadios = document.querySelectorAll("[data-attribute_name='attribute_pa_colors']"); variationRadios.forEach(function(radio){ radio.addEventListener("click", function(){ // After the click, check if any radio still has the "selected" class. var selectedRadio = document.querySelector("li.selected[data-attribute_name='attribute_pa_colors']"); if (selectedRadio) { var val = selectedRadio.getAttribute("data-value"); reorderImages(val); } else { // If none are selected, clear the highlight and restore original order. reorderImages(""); } }); }); // Listen for clicks on the clear variations link. var clearBtn = document.querySelector(".reset_variations"); if (clearBtn) { clearBtn.addEventListener("click", function(e){ e.preventDefault(); // Prevent default behavior if needed. // Remove "selected" class from all radio items. variationRadios.forEach(function(radio){ radio.classList.remove("selected"); }); // Reset the select value. if (variationSelect) { variationSelect.value = ""; } // Revert images to original order. reorderImages(""); }); } });
Long velvet kimono
Original price was: € 189.00.€ 132.30Current price is: € 132.30.
This long velvet kimono, crafted in Italy, combines the elegance of velvet with the softness of viscose. Perfect for a sophisticated look, it offers both comfort and style. Its refined design and luxurious texture make this kimono an essential piece for any fashion-forward wardrobe.
Similar to this

Kimono Lilies
€ 149.00

Cordelia bag
€ 99.00

Kimono short flower Button
€ 129.00

Kimono Bousquet
€ 149.00