Vayamos al grano, he estado navegando por la web durante horas y no he encontrado nada parecido, y entre un poco de allí, de acá y chatgpt conseguí dar con la tecla.
El objetivo es mostrar en una web WordPress con Woocommerce, todas las variaciones de los productos de la tienda que tengan un valor determinado en un atributo.
Este código genera un shortcode para usar con parámetro que será el valor del atributo «medida«, puedes colocarlo en el fichero functions.php del tu tema y cambias el texto en negrita por attribute_nombreatributo. Su uso por ejemplo es [mostrar_productos valor_atributo=’90×190′].
Simplemente COPIA, PEGA, DISFRUTA!.
function mostrar_productos_por_atributo( $atts ) {
$atts = shortcode_atts( array(
'valor_atributo' => '',
), $atts );
$valor_atributo = $atts['valor_atributo'];
ob_start();
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
);
$products = new WP_Query( $args );
if ( $products->have_posts() ) {
while ( $products->have_posts() ) {
$products->the_post();
global $product;
if ( $product->is_type( 'variable' ) ) {
$variations = $product->get_available_variations();
foreach ( $variations as $variation ) {
$variation_attributes = $variation['attributes'];
// Verifica si la variación cumple con el valor de atributo deseado
if ( isset( $variation_attributes['attribute_medidas'] ) && $variation_attributes['attribute_medidas'] === $valor_atributo ) {
$image_url = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' )[0];
$title = get_the_title();
$price = $product->get_price_html();
$variation_id = $variation['variation_id'];
?>
<div class="product" style="width:33%;float:left;padding:5px">
<img src="<?php echo $image_url; ?>" alt="<?php echo $title; ?>">
<h2><?php echo $title; ?></h2>
<span class="price"><?php echo $price; ?></span>
<?php echo do_shortcode( '[add_to_cart id="' . $variation_id . '"]' ); ?>
</div>
<?php
}
}
}
}
} else {
echo 'No se encontraron productos con el valor de atributo especificado.';
}
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode( 'mostrar_productos', 'mostrar_productos_por_atributo' );