¿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();
?>
1 ) : ?>
$item ) : ?>
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 '
';
}
}
// Si no hay vídeo → imagen destacada
return '
' . get_the_post_thumbnail( $product_id, 'large' ) . '
';
}
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.