Sustituir la imagen de producto por un vídeo en Woocommerce

Sustituir la imagen de producto por un vídeo en Woocommerce

¿Qué vamos a ver?

En este tutorial veremos como sustituir la imagen de producto de WooCommerce por un vídeo, tanto en la propia página de producto como en la página de la tienda, es decir, en el archive.

En este último, ya que no necesitamos el audio, haremos que el vídeo tenga autoplay.

Lo mejor de todo es que no hace falta que el vídeo esté alojado en nuestra web, lo haremos con enlaces a vídeos subidos a YouTube y asi mejoraremos la carga de la web.

Vamos a ver varias opciones para conseguir esto sin necesidad de plugins, sólo con fragmentos de código añadidos a Code Snippets o al archivo functions de tu web (esto último no te lo aconsejo).

Para crear el campo personalizado donde indicaremos la URL del vídeo a mostrar, simplemente usaremos un fragmento de código que también de dejaré.

Crear el Snippet que creará el campo "URL del vídeo"

Copia y pega este fragmento de código en un nuevo Snippet de Code Snippets:

Si no tienes instalado el plugin Code Snippets, hazlo ya ,te explico como se usa aquí.

				
					/**
 * Campo personalizado:
 * URL vídeo del producto
 */

add_action( 'woocommerce_product_options_general_product_data', 'ayra_campo_video_producto' );

function ayra_campo_video_producto() {

    woocommerce_wp_text_input( array(
        'id'          => '_video_producto',
        'label'       => 'Vídeo del producto',
        'placeholder' => 'https://youtube.com/...',
        'desc_tip'    => true,
        'description' => 'Introduce la URL del vídeo de YouTube.'
    ) );
}


/**
 * Guardar campo personalizado
 */

add_action( 'woocommerce_process_product_meta', 'ayra_guardar_video_producto' );

function ayra_guardar_video_producto( $post_id ) {

    if ( isset( $_POST['_video_producto'] ) ) {

        update_post_meta(
            $post_id,
            '_video_producto',
            esc_url_raw( $_POST['_video_producto'] )
        );
    }
}
				
			

Ahora verás que todos los productos (nuevos y creados) tienen un campo nuevo llamado vídeo del producto en la primera pestaña (cerca de donde ponemos el precio).

Ahí deberás indicar la URL del video subido a YouTube.

De momento ya hemos indicado la URL pero ahora nos falta conseguir que aparezca en la página del producto y también en la de la tienda, es decir, en el grid donde aparecen todos los productos.

Snippet para la página de producto único

He de decir que para mostrar un vídeo en lugar de la imagen de producto, la página de producto (la single) debe estar construida con el maquetador de temas de elementor Pro, ya que tendremos que sustituir el widget de «Imagen de producto» por un shortcode.

				
					function ayra_media_principal_producto() {
    global $product;

    if ( ! $product ) {
        $product = wc_get_product( get_the_ID() );
    }

    if ( ! $product ) {
        return '';
    }

    $product_id  = $product->get_id();
    $video_url   = get_post_meta( $product_id, '_video_producto', true );
    $featured_id = $product->get_image_id();
    $gallery_ids = $product->get_gallery_image_ids();

    $items = array();

    // Añadir vídeo si existe
    if ( ! empty( $video_url ) ) {
        $items[] = array(
            'type'  => 'video',
            'embed' => wp_oembed_get( $video_url ),
            'thumb' => '',
        );
    }

    // Imagen destacada
    if ( $featured_id ) {
        $items[] = array(
            'type'  => 'image',
            'html'  => wp_get_attachment_image( $featured_id, 'large' ),
            'thumb' => wp_get_attachment_image_url( $featured_id, 'thumbnail' ),
        );
    }

    // Galería del producto
    foreach ( $gallery_ids as $image_id ) {
        $items[] = array(
            'type'  => 'image',
            'html'  => wp_get_attachment_image( $image_id, 'large' ),
            'thumb' => wp_get_attachment_image_url( $image_id, 'thumbnail' ),
        );
    }

    if ( empty( $items ) ) {
        return '';
    }

    ob_start();
    ?>

    <div class="producto-media-gallery">

        <div class="producto-media-main">
            <?php echo $items[0]['type'] === 'video' ? $items[0]['embed'] : $items[0]['html']; ?>
        </div>

        <?php if ( count( $items ) > 1 ) : ?>

            <div class="producto-media-thumbs">

                <?php foreach ( $items as $index => $item ) : ?>

                    <button class="producto-media-thumb <?php echo $index === 0 ? 'active' : ''; ?>"
                            type="button"
                            data-content="<?php echo esc_attr( $item['type'] === 'video' ? $item['embed'] : $item['html'] ); ?>">

                        <?php if ( $item['type'] === 'video' ) : ?>

                            <div class="producto-video-thumb">
                                <span class="producto-video-icon">▶</span>
                            </div>

                        <?php elseif ( ! empty( $item['thumb'] ) ) : ?>

                            <img decoding="async" src="<?php echo esc_url( $item['thumb'] ); ?>" alt="">

                        <?php endif; ?>

                    </button>

                <?php endforeach; ?>

            </div>

        <?php endif; ?>

    </div>

    <script>
    document.addEventListener('click', function(e) {

        const thumb = e.target.closest('.producto-media-thumb');

        if (!thumb) return;

        const gallery = thumb.closest('.producto-media-gallery');
        const main = gallery.querySelector('.producto-media-main');

        main.innerHTML = thumb.dataset.content;

        gallery.querySelectorAll('.producto-media-thumb').forEach(btn => {
            btn.classList.remove('active');
        });

        thumb.classList.add('active');

    });
    </script>

    <?php
    return ob_get_clean();
}

add_shortcode( 'media_principal_producto', 'ayra_media_principal_producto' );
				
			

El shortcode que hemos de poner en lugar del widget de imagen de producto es:

[media_principal_producto]

También vamos a añadir algo de CSS para poder controlar un poco el aspecto de esta imagen de producto y su galería.

Aquí te dejo el CSS que has de pegar, puedes hacerlo en el propio widget de shortcode, en Avanzado, ir a CSS personalizado y pegarlo.

Luego si quieres, podrás modificar aspectos como el tamaño de las miniaturas, la separación, bordes…

				
					.producto-media-main iframe,
.producto-media-main img {
    width: 100%;
    display: block;
}

.producto-media-main iframe {
    aspect-ratio: 16 / 9;
    height: auto;
}

.producto-media-thumbs {
    display: flex;
    gap: 2px;
    margin-top: 6px;
    flex-wrap: wrap;
    justify-content: center;
}

.producto-media-thumb {
    position: relative;
    width: 18%;
    aspect-ratio: 1 / 1;
    padding: 0;
    border: 1px solid #ddd;
    border-radius: 0 !important;
    background: transparent;
    cursor: pointer;
    overflow: hidden;
}

.producto-media-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.producto-media-thumb.active {
    border-color: #111;
}

.producto-video-thumb {
    width: 100%;
    height: 100%;
    background: #111;
    display: flex;
    align-items: center;
    justify-content: center;
}

.producto-video-icon {
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    color: #fff;
    background: rgba(0,0,0,0.35);
    font-size: 30px;
    line-height: 1;
}
				
			

El Snippet para la página de la tienda

 

Ya tenemos la página de producto con su correspondiente vídeo (si lo hemos puesto) pero en la página de la tienda sigue apareciendo la imagen principal del producto.

Lógicamente, tal como hemos hacho antes, la página que muestra los productos de la tienda (el archive de productos) también ha de estar construida con el maquetador de temas de elementor, y donde antes teníamos el widget de imagen de producto en el listing item, ahora debemos poner otro shortcode que lo sustituye.

En este caso, vamos a hacer que el item de producto se reproduzca solo y así darle a la página de la tienda un aspecto mas dinámico.

Crea un nuevo snippet, pon el título que quieras, y pega este fragmento:

				
					function ayra_video_o_imagen_loop_producto() {

    global $product;

    if ( ! $product ) {
        $product = wc_get_product( get_the_ID() );
    }

    if ( ! $product ) {
        return '';
    }

    $product_id  = $product->get_id();
    $product_url = get_permalink( $product_id );

    // Obtener URL del vídeo sin ACF
    $video_url = get_post_meta( $product_id, '_video_producto', true );

    // Si hay vídeo de YouTube
    if ( ! empty( $video_url ) ) {

        preg_match(
            '/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\?\/]+)/',
            $video_url,
            $matches
        );

        if ( ! empty( $matches[1] ) ) {

            $video_id = $matches[1];

            return '
            <a href="/en/' . esc_url( $product_url ) . '/" class="producto-loop-link">
                <div class="producto-loop-video">
                    <iframe loading="lazy"
                        src="about:blank"
                        frameborder="0"
                        allow="autoplay; encrypted-media"
                        allowfullscreen data-rocket-lazyload="fitvidscompatible" data-lazy-src="https://www.youtube.com/embed/&#039;%20.%20esc_attr(%20$video_id%20)%20.%20&#039;?autoplay=1&#038;mute=1&#038;loop=1&#038;playlist=&#039;%20.%20esc_attr(%20$video_id%20)%20.%20&#039;&#038;controls=0&#038;modestbranding=1&#038;rel=0&#038;playsinline=1">
                    </iframe><noscript><iframe
                        src="https://www.youtube.com/embed/' . esc_attr( $video_id ) . '?autoplay=1&mute=1&loop=1&playlist=' . esc_attr( $video_id ) . '&controls=0&modestbranding=1&rel=0&playsinline=1"
                        frameborder="0"
                        allow="autoplay; encrypted-media"
                        allowfullscreen>
                    </iframe></noscript>
                </div>
            </a>';
        }
    }

    // Si no hay vídeo → imagen destacada
    return '
    <a href="/en/' . esc_url( $product_url ) . '/" class="producto-loop-link">
        <div class="producto-loop-imagen">
            ' . get_the_post_thumbnail( $product_id, 'large' ) . '
        </div>
    </a>';
}

add_shortcode( 'media_loop_producto', 'ayra_video_o_imagen_loop_producto' );
				
			

Ahora debes ir al maquetador de temas, y sustituir del item de producto, el widget de imagen de producto por el shortcode [media_loop_producto]

Y en ese mismo widget de shortcode, en avanzado / CSS Personalizado pegaremos el siguiente código:

				
					.producto-loop-link {
    display: block;
    text-decoration: none;
    color: inherit;
}

.producto-loop-video,
.producto-loop-imagen {
    width: 100%;
    aspect-ratio: 1 / 1;
    overflow: hidden;
    position: relative;
}

.producto-loop-video iframe {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 178%;
    height: 100%;
    transform: translate(-50%, -50%);
    pointer-events: none;
}

.producto-loop-imagen img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
				
			

Ahora tanto en la página de la tienda, como en el propio producto, aparecerá un vídeo que se reproduce solo, en sustitución de la imagen destacada.

¿Aún no tienes elementor Pro?

Share in your social networks

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp

Suscríbete a nuestra Newsletter y consigue un descuento en tu primera compra

Sólo por registrarte, te regalamos un cupón para que consigas elementor Pro aún mas barato.

Suscríbete a nuestra Newsletter para estar informado de todas las novedades y descuentos