Display a video as the featured image on the Products Archive

Adding the code from this article to the child-theme/functions.php file will display the videos uploaded in the product settings as the featured image on the Products Archive (shop, categories) pages.

add_filter('etheme_product_grid_list_product_wrapper_element_attributes', function($attr, $product, $local_settings, $object) {
	global $show_featured_as_video_data;
	if ( !is_array($show_featured_as_video_data) ) 
		$show_featured_as_video_data = array();

	$product_id = $product->get_id();
	$product_video_thumbnail = etheme_get_option('product_video_thumbnail', false);
	if ( etheme_get_custom_field('product_video_thumbnail', $product_id) == 'disable' )
	    $product_video_thumbnail = false;
	if ( !$product_video_thumbnail ) {
		return $attr;
	}

	$size = $local_settings['image_size'] != 'custom' ? $local_settings['image_size'] : 'woocommerce_thumbnail';

	$show_featured_as_video_data[$product_id] = array();

	$video_slides_array = array();
	$video_attachments = array();
	$video_slides = '';

	$product_video_attrs = etheme_get_option('product_video_thumbnail_attributes', array('preload', 'loop'));
    $product_video_pause_on_hover = etheme_get_option('product_video_pause_on_hover', false);
    $size = $local_settings['image_size'] != 'custom' ? $local_settings['image_size'] : 'woocommerce_thumbnail';

	$show_featured_as_video = false;

	if ( $product_video_thumbnail ) {
	    $videos = etheme_get_attach_video($product_id);
	        if (isset($videos[0]) && $videos[0] != '') {
	            $video_attachments = get_posts(array(
	                'post_type' => 'attachment',
	                'include' => $videos[0]
	            ));
	            foreach ($video_attachments as $video) {
	                if ( !$video || !in_array($video->post_mime_type, array('video/mp4', 'video/webm', 'video/ogg'))) continue;
	                $video_slides_array[] = array(
	                    'item_type' => 'video',
	                    'src' => $video->guid,
	                    'type' => str_replace(
	                        array('video/mp4', 'video/webm', 'video/ogg'),
	                        array(
	                            'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
	                            'video/webm; codecs="vp8, vorbis"',
	                            'video/ogg; codecs="theora, vorbis"'
	                        ),
	                        $video->post_mime_type)
	                );
	            }
	        }
	    $has_video = count($video_attachments) > 0;

	    $show_featured_as_video = $has_video || false;
	}

	if ( $show_featured_as_video ) {

		if ( in_array($local_settings['image_hover_effect'], array('slider'))) {
		    $video_slides = wp_json_encode(
		        array(
		            'items' => array_merge($video_slides_array, array_map(
		                function ($item_value) {
		                    return array(
		                        'item_type' => 'image',
		                        'src' => $item_value
		                    );
		                }, explode(';', $object->etheme_get_image_list($product, true, $size))))
		        ));
		}

        $product_video_params = array(
            'muted="muted"'
        );
        if ( in_array('preload', $product_video_attrs))
            $product_video_params[] = 'preload="auto"';
        if ( in_array('loop', $product_video_attrs))
            $product_video_params[] = 'loop="true"';
        if ( in_array('autoplay', $product_video_attrs)) {
            $product_video_params[] = 'autoplay="true"';
            if ($product_video_pause_on_hover)
                $product_video_params[] = 'data-pause-on-hover="true"';
        }
        $video_poster = '';
        if ( in_array('poster', $product_video_attrs) ) {
            if ($product->get_image_id()) {
                $video_poster = wp_get_attachment_image_src($product->get_image_id(), $size, false, array())[0];
            } elseif ($product->get_parent_id()) {
                $video_poster = wp_get_attachment_image_src($product->get_parent_id(), $size, false, array())[0];
            }

            if (!$video_poster) {
                $video_poster = wc_placeholder_img_src($size, array());
            }

            if ( $video_poster )
                $product_video_params[] = 'poster="'.$video_poster.'"';
        }

        $show_featured_as_video_data[$product_id]['video_attachments'] = $video_attachments;
        $show_featured_as_video_data[$product_id]['product_video_params'] = $product_video_params; 

		if (in_array('autoplay', $product_video_attrs) && $product_video_pause_on_hover ) $attr .= ' data-video-hover-state="pause"';

        else if (!in_array('autoplay', $product_video_attrs)) $attr .= ' data-video-hover-state="play"';

        if ( 'slider' == $local_settings['image_hover_effect'] ) : $attr .= ' data-videos="'. esc_attr($video_slides) . '"'; endif;

	}

	return $attr;
}, 10, 4);
add_filter('etheme_product_grid_list_product_element_image', function($image, $product, $local_settings) {

	global $show_featured_as_video_data;
	if ( !is_array($show_featured_as_video_data) )
		$show_featured_as_video_data = array();

	$product_id = $product->get_id();

	if ( empty($show_featured_as_video_data) || !array_key_exists($product_id, $show_featured_as_video_data)) return $image;

    $size = $local_settings['image_size'] != 'custom' ? $local_settings['image_size'] : 'woocommerce_thumbnail';

    $video_sources_shown = 0;
	
	if ( isset($show_featured_as_video_data[$product_id]['video_attachments']) && count( $show_featured_as_video_data[$product_id]['video_attachments'] ) > 0 ): $video_sources_shown = 0; 
		ob_start(); ?>
	    <video <?php echo implode(' ', $show_featured_as_video_data[$product_id]['product_video_params']); ?>>
	        <?php foreach ( $show_featured_as_video_data[$product_id]['video_attachments'] as $video ):
	            if ( $video_sources_shown > 0 ) break; ?>
	            <?php $video_ogg = $video_mp4 = $video_webm = false; ?>
	            <?php if ( $video->post_mime_type == 'video/mp4' && ! $video_mp4 ): $video_mp4 = true; ?>
	                <source src="<?php echo esc_url( $video->guid ); ?>"
	                        type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
	            <?php
	            $video_sources_shown++;
	            endif; ?>
	            <?php if ( $video->post_mime_type == 'video/webm' && ! $video_webm ): $video_webm = true; ?>
	                <source src="<?php echo esc_url( $video->guid ); ?>"
	                        type='video/webm; codecs="vp8, vorbis"'>
	            <?php
	            $video_sources_shown++;
	            endif; ?>
	            <?php if ( $video->post_mime_type == 'video/ogg' && ! $video_ogg ): $video_ogg = true; ?>
	                <source src="<?php echo esc_url( $video->guid ); ?>"
	                        type='video/ogg; codecs="theora, vorbis"'>
	                <?php esc_html_e( 'Video is not supporting by your browser', 'xstore' ); ?>
	            <?php
	            $video_sources_shown++;
	            endif; ?>
	        <?php endforeach; ?>
	    </video>
	    <?php return ob_get_clean() . str_replace('class="', 'class="hidden ', $image); ?> 
	<?php endif;

	return $image; 
}, 10, 3);

add_filter('etheme_product_grid_list_product_element_image_wrapper_class', function($class, $product) {
	global $show_featured_as_video_data;
	if ( !is_array($show_featured_as_video_data) )
		$show_featured_as_video_data = array();

	$product_id = $product->get_id();

	if ( empty($show_featured_as_video_data) || !array_key_exists($product_id, $show_featured_as_video_data)) return $class;

	if ( isset($show_featured_as_video_data[$product_id]['video_attachments']) && count( $show_featured_as_video_data[$product_id]['video_attachments'] ) > 0 ) {
		$class .= ' product-video-as-image';
	}

	return $class;
}, 10, 2);
Updated on October 1, 2025
Was this Article helpful?