Создадим переключающиеся изображения товара при наведении мыши, либо галерею изображений товара в шаблоне категории.
Под галереей изображений (Featured Images) понимаются дополнительные изображения помимо основного изображения.
Выводим дополнительные изображения
function woocommerce_feature_gallery() {
global $product;
$attachment_ids = $product->get_gallery_attachment_ids();
foreach( $attachment_ids as $attachment_id ) {
echo wp_get_attachment_image( $attachment_id, 'shop_catalog' );
}
}
add_action( 'woocommerce_shop_loop_item_title', 'woocommerce_feature_gallery', 8 );
Варианты вывода изображений
//Получить URL изображений галереи - размер изображений WordPress по умолчанию echo $Original_image_url = wp_get_attachment_url( $attachment_id ); echo $full_url = wp_get_attachment_image_src( $attachment_id, 'full' )[0]; echo $medium_url = wp_get_attachment_image_src( $attachment_id, 'medium' )[0]; echo $thumbnail_url = wp_get_attachment_image_src( $attachment_id, 'thumbnail' )[0]; //Получить URL изображений галереи - размеры изображений WooCommerce echo $shop_thumbnail_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_thumbnail' )[0]; echo $shop_catalog_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_catalog' )[0]; echo $shop_single_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_single' )[0]; //Вывести сразу изображение echo wp_get_attachment_image($attachment_id, 'full'); echo wp_get_attachment_image($attachment_id, 'medium'); echo wp_get_attachment_image($attachment_id, 'thumbnail'); echo wp_get_attachment_image($attachment_id, 'shop_thumbnail'); echo wp_get_attachment_image($attachment_id, 'shop_catalog'); echo wp_get_attachment_image($attachment_id, 'shop_single');
Переключение двух изображений
Вывести только первое изображение галереи
function woocommerce_feature_gallery() {
global $product;
$attachment_ids = $product->get_gallery_attachment_ids();
echo wp_get_attachment_image( $attachment_ids[0], 'shop_catalog' );
}
add_action( 'woocommerce_shop_loop_item_title', 'woocommerce_feature_gallery', 8 );
Либо ссылкой, с возможностью добавления произвольного класса — dop-image. Также сделана проверка на наличие дополнительного изображения.
function woocommerce_feature_gallery() {
global $product;
$attachment_ids = $product->get_gallery_attachment_ids();
if (!empty($attachment_ids)) {
echo '<img class="dop-image" src="'.wp_get_attachment_image_src( $attachment_ids[0], 'shop_catalog' )[0].'">';
}
}
add_action( 'woocommerce_shop_loop_item_title', 'woocommerce_feature_gallery', 8 );
Эффект переключения при наведении будет достигаться чистым CSS
.dop-image {
display: none;
position: absolute;
padding: 10px;
box-sizing: border-box;
width: 100%;
left: 0;
top: 0;
}
.product:hover .dop-image {display: block;}
Более плавного эффекта можно добиться используя свойство opacity, но в этом случае не должна быть задействована техника плавного появления изображений.
Решено! Можно применять и при использовании плавного появления элементов:
.dop-image {
opacity: 0 !important;
position: absolute;
padding: 10px;
box-sizing: border-box;
width: 100%;
left: 0;
top: 0;
}
.product:hover .dop-image {opacity: 1 !important;}
Создаем галерею из изображений
Непосредственно галерея всех изображений вряд ли пригодится в большинстве случаев. Но мы можем это реализовать.
Создаем новую функцию создания галереи, которая будет совмещать в себе основное изображение и дополнительные (Featured Images).
//Галерея изображений в архиве
function woocommerce_feature_gallery() {
global $product;
$attachment_ids = $product->get_gallery_attachment_ids();
echo '<div class="feature-slider">';
echo '<div>';
echo get_the_post_thumbnail( $post->ID, 'shop_single', $attributes );
echo '</div>';
foreach( $attachment_ids as $attachment_id ) {
echo '<div>';
echo wp_get_attachment_image( $attachment_id, 'shop_catalog' );
echo '</div>';
}
echo '</div>';
}
remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 ); //Убираем вывод одиночного изображения
add_action( 'woocommerce_shop_loop_item_title', 'woocommerce_feature_gallery', 8 );
Теперь вдохнем жизнь нашей галереи. Я буду это делать с помощью скрипта slick. Инициализируем слайдер:
$(document).ready(function() {
$('.feature-slider').slick();
});
Некоторые стили, возможно пригодяться
/* Для галереи изображений товара */
.feature-slider .slick-list {margin: 0 !important;}
.feature-slider .slick-arrow {
opacity: 0;
transition: all 0.3s ease;
-o-transition: all 0.3s;
-webkit-transition: all 0.3s ease 0s;
}
.feature-slider:hover .slick-arrow {opacity: 1;}
.feature-slider:hover .slick-prev {left: 0; z-index: 9;}
.feature-slider:hover .slick-next {right: 0;}
.feature-slider .slick-prev:before, .feature-slider .slick-next:before {color: #fff;}
Далее можно прикручивать любые настройки из арсенала slick: стрелки управления, автопрокрутка и т.д.
Это можно легко исправить мини скриптом, запрещающим переход по ссылке:
$(".slick-arrow").click(function(){ return false; });
Галерея изображений товара в архивах с помощью плагинов
WooCommerce Product Image Flipper (4000) — делает переключение изображения при наведении.
WooCommerce Product Archive Image Slider — выводит у товара всю галерею изображений. Плагин требует серьезной переработки (не обновлялся более 3-х лет): у товаров с одним изображением исчезает кнопка Купить. Кнопки Вперед и Назад находятся в самом низу.
Shop Product Images Slider — платное решение (5$). Настраивается направление перелистывания, скорость автопромотки.
[site-socialshare]

Еще 2 вопроса хочу Вам задать:
1) Использую сейчас предложенный вариант, где добавляется одна первая картинка галереи. При наведении на картинку, у дополнительной появляется свойство opacity:1 и это замечательно. Но первая картинка по-прежнему остается видимой и, если дополнительная картинка меньшего размера, то выглядит несуразно. Пробовал добавлять свойство (product:hover .woocommerce ul.products li.product a img {opacity:0!important;}), но это не помогает. Подскажите, как решить данную проблему.
2) Интересует вариант, когда можно добавить не только одну картинку и не все, а определенное количество, например 5. Как в таком случае будет выглядеть код?
Огромное спасибо заранее!