this {product_variation_images} data tag loops the current product variations images.
that’s it enjoy.
// TAG : {product_variation_images} add_filter( 'bricks/dynamic_tags_list', 'register_product_variation_images_tag' ); function register_product_variation_images_tag( $tags ) { $tags[] = [ 'name' => '{product_variation_images}', 'label' => 'WooCommerce Product Variation Images', 'group' => 'Custom Tags', ]; return $tags; } // Render the dynamic tag for WooCommerce variation images add_filter( 'bricks/dynamic_data/render_tag', 'render_product_variation_images_tag', 10, 3 ); function render_product_variation_images_tag( $tag, $post, $context = 'text' ) { if ( $tag !== 'product_variation_images' ) { return $tag; } // Check if the product is a variable product $product = wc_get_product( $post->ID ); if ( $product && $product->is_type( 'variable' ) ) { // Get the main product thumbnail URL $main_thumbnail_id = $product->get_image_id(); $main_thumbnail_url = wp_get_attachment_url( $main_thumbnail_id ); // Get the available variations $available_variations = $product->get_available_variations(); // Initialize a variable to store the variation images $variation_images = ''; // Loop through the variations to get the images and variation names foreach ( $available_variations as $variation ) { $variation_id = $variation['variation_id']; $variation_product = wc_get_product( $variation_id ); $variation_image_id = $variation_product->get_image_id(); $variation_image_url = wp_get_attachment_url( $variation_image_id ); // Only process if the variation has its own image AND it does not match the main product thumbnail if ( ! empty( $variation_image_url ) && $variation_image_url !== $main_thumbnail_url ) { $variation_attributes = $variation['attributes']; // Collect and sanitize the variation names to use as class names $variation_name_classes = []; foreach ( $variation_attributes as $key => $value ) { // Clean the attribute name (remove prefix 'pa_' if it exists) $clean_name = str_replace( 'pa_', '', $value ); // Convert to lowercase and replace spaces with hyphens $class_name = sanitize_title( $clean_name ); $variation_name_classes[] = $class_name; } // Combine the class names with variation ID $class_name = 'variation-image-' . $variation_id . ' ' . implode( ' ', $variation_name_classes ); // Add the image with both variation ID and sanitized variation names as class $variation_images .= '<img src="' . esc_url( $variation_image_url ) . '" alt="Variation Image" class="' . esc_attr( $class_name ) . '">'; } } // Return the variation images or nothing if no unique images are found (no fallback) return $variation_images ?: ''; // No fallback message or thumbnail } return 'Not a Variable Product'; } // Allow the dynamic tag to render inside content add_filter( 'bricks/dynamic_data/render_content', 'render_product_variation_images_tag_in_content', 10, 3 ); function render_product_variation_images_tag_in_content( $content, $post, $context = 'text' ) { if ( strpos( $content, '{product_variation_images}' ) !== false ) { $variation_images = render_product_variation_images_tag( 'product_variation_images', $post, $context ); $content = str_replace( '{product_variation_images}', $variation_images, $content ); } return $content; }