Mostrar productos destacados a través de un bucle personalizado en WooCommerce en página de plantilla

24 jul 2015, 00:51:58
Vistas: 94.1K
Votos: 24

Me gustaría mostrar 6 productos destacados de mi tienda WooCommerce en mi plantilla home-page.php. Después de investigar, descubrí que la forma correcta de hacerlo era a través de un bucle personalizado (no deseo usar shortcodes porque me gustaría agregar clases adicionales para estilos, etc.). También encontré que la clave que WooCommerce usa para los productos destacados es '_featured'. Armé el código siguiente para mostrar cualquier producto que elegí como destacado en mi tienda, pero no funciona... Cualquier ayuda es apreciada.

<?php

    // Argumentos para la consulta de productos destacados
    $args = array(
        'post_type'   => 'product',
        'stock'       => 1,
        'showposts'   => 6,
        'orderby'     => 'date',
        'order'       => 'DESC' ,
        'meta_query'  => array(
            array(
                'key'     => '_featured',
                'value'   => 0,
                'compare' => '>',
                'type'    => 'numeric'
            )
        )
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>

        <li>    
            <?php 
                if ( has_post_thumbnail( $loop->post->ID ) ) 
                    echo get_the_post_thumbnail( $loop->post->ID, 'shop_catalog' ); 
                else 
                    echo '<img src="' . woocommerce_placeholder_img_src() . '" alt="Imagen de producto temporal" width="65px" height="115px" title="Imagen de producto temporal" />'; 
            ?>
            <h3><?php the_title(); ?></h3>

            <?php 
                echo $product->get_price_html(); 
                woocommerce_template_loop_add_to_cart( $loop->post, $product );
            ?>    
        </li>

<?php 
    endwhile;
    wp_reset_query(); 
?>
1
Comentarios

Añade el resultado de var_dump( get_meta_values( '_featured', 'product' ); donde la función get_meta_values está soportada por la función personalizada explicada en esta respuesta

Pieter Goosen Pieter Goosen
24 jul 2015 07:34:48
Todas las respuestas a la pregunta 10
2
25

Esto ha cambiado en WooCommerce 3.0. Ya no es simplemente un meta_query, sino que ahora incluye un tax_query. Los argumentos ahora son:

    $meta_query  = WC()->query->get_meta_query();
    $tax_query   = WC()->query->get_tax_query();
    $tax_query[] = array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'featured',
        'operator' => 'IN',
    );

    $args = array(
        'post_type'           => 'product',
        'post_status'         => 'publish',
        'ignore_sticky_posts' => 1,
        'posts_per_page'      => $atts['per_page'],
        'orderby'             => $atts['orderby'],
        'order'               => $atts['order'],
        'meta_query'          => $meta_query,
        'tax_query'           => $tax_query,
    );

Ver woocommerce/includes/class-wc-shortcodes.php

8 may 2017 17:27:17
Comentarios

¡Justo lo que estaba buscando!

joshkrz joshkrz
11 may 2018 01:09:17

También para Woocommerce 3.0, recomiendan usar wc_placeholder_img_src en lugar de woocommerce_placeholder_img_src.

Robotnicka Robotnicka
25 may 2018 03:46:17
2
18

Cambia tus argumentos para que queden así:

$meta_query   = WC()->query->get_meta_query();
$meta_query[] = array(
    'key'   => '_featured',
    'value' => 'yes'
);
$args = array(
    'post_type'   =>  'product',
    'stock'       =>  1,
    'showposts'   =>  6,
    'orderby'     =>  'date',
    'order'       =>  'DESC',
    'meta_query'  =>  $meta_query
);

Si vas a wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php (@595) puedes encontrar cómo se hace para los shortcodes de WC.

15 sept 2015 13:52:35
Comentarios

Lo importante a tener en cuenta es que '_featured' no se almacena como un valor numérico. Se almacena como una cadena 'yes' o 'no'. Todo lo demás en la pregunta del OP debería funcionar, funcionó para mí.

i_a i_a
3 jul 2016 20:02:55

A partir de WooCommerce 3.0, esta solución ya no funciona. Por favor, consulta mi respuesta actualizada más abajo.

dpruth dpruth
12 jun 2018 22:02:29
0

Bucle de Productos Destacados en WooCommerce 3

<ul class="products">
<?php
$args = array(
    'post_type' => 'product',
    'posts_per_page' => 12,
    'tax_query' => array(
            array(
                'taxonomy' => 'product_visibility',
                'field'    => 'name',
                'terms'    => 'featured',
            ),
        ),
    );
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) {
    while ( $loop->have_posts() ) : $loop->the_post();
        wc_get_template_part( 'content', 'product' );
    endwhile;
} else {
    echo __( 'No se encontraron productos' );
}
wp_reset_postdata();
?>
24 dic 2017 09:59:23
3

Según el Wiki de WooCommerce:

Construir WP_Queries personalizados o consultas a la base de datos [para recuperar productos] probablemente romperá tu código en futuras versiones de WooCommerce, ya que los datos se están moviendo hacia tablas personalizadas para un mejor rendimiento.

WooCommerce recomienda usar wc_get_products() o WC_Product_Query() en lugar de WP_Query() o get_posts().

He escrito un artículo con el código que usé para lograr lo que necesitas aquí: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

24 may 2018 21:58:39
Comentarios

lo siento, sin ver algo de código escrito, es difícil entender tu artículo. ¿Podrías incluir algún fragmento de código?

HOY HOY
5 jun 2019 17:59:30

@HOY el plugin de incrustación estaba roto; ya está solucionado y ahora puedes ver el código.

cfx cfx
5 jun 2019 23:07:32

gracias, mientras buscaba soluciones, encontré esta que te muestro a continuación. No estoy seguro de en qué se diferencia de la tuya ya que no pude revisar la tuya a fondo, pero es muy corta y me ayudó con un bucle de productos personalizado. https://www.kathyisawesome.com/woocommerce-modifying-product-query/

HOY HOY
5 jun 2019 23:28:38
0

Sé que esto es bastante antiguo, pero acabo de compartir una solución alternativa aquí y creo que puede ayudar a quienes lleguen a este tema también.

En lugar de usar meta_query o tax_query, también puedes usar wc_get_featured_product_ids():

$args = array(
    'post_type'           => 'product',
    'posts_per_page'      => 6,
    'orderby'             => 'date',
    'order'               => 'DESC',
    'post__in'            => wc_get_featured_product_ids(),
);

$query = new WP_Query( $args );

¡Espero que ayude!

29 abr 2018 01:14:51
0

Basado en: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

Yo intentaría:

fuera del bucle:

$args = array (
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,

 );

 $products = wc_get_products( $args );

en el bucle:

$query = new WC_Product_Query( array(
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,
'return' => 'ids',

 ) );

 $products = $query->get_products();
26 sept 2018 15:09:39
0

Las personas deberían empezar a usar wc_get_products porque WooCommerce indicó que esta es la forma estándar de recuperar productos. wc_get_products tiene un argumento "featured" que solo necesita establecerse en true. Así que el código simplemente es el siguiente:

<?php 

// Mostrar productos destacados por categoría. En este caso es "shirts" que es el slug de la categoría.
$query_args = array(
    'featured' => true,  
    'category' => array( 'shirts' ),
);
$products = wc_get_products( $query_args );

global $post;
$columns = wc_get_loop_prop( 'columns' );
?>
<div class="woocommerce columns-<?php echo esc_attr( $columns ); ?>">
  <?php
    woocommerce_product_loop_start();
    foreach ($products as $product) {
        $post = get_post($product->get_id());
        setup_postdata($post);
        wc_get_template_part('content', 'product');
    }
    wp_reset_postdata();
    woocommerce_product_loop_end();
  ?>
</div>

Ver publicación completa aquí: https://jameshwartlopez.com/plugin/get-featured-products-of-a-category/

12 jul 2020 15:35:24
0

si miras en la base de datos en la tabla wp_postmeta verás que meta_key será _featured y meta_value será yes o no, así que en lugar del valor 0 o 1 escribe yes o no

<?php
    $q = new WP_Query([
      'post_type'   =>  'product',
      'stock'       =>  1,
      'showposts'   =>  3,
      'orderby'     =>  'date',
      'order'       =>  'DESC',
      'meta_query'  =>  [ 
        ['key' => '_featured', 'value' => 'yes' ]
        ]
    ]);
    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();
            // mostrar información del producto
        endwhile; wp_reset_query();
    endif;
?>
11 jul 2016 23:02:39
1
<ul class="products">
    <?php
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => 12,
            'tax_query' => array(
                    array(
                        'taxonomy' => 'product_visibility',
                        'field'    => 'name',
                        'terms'    => 'featured',
                    ),
                ),
            );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) {
            while ( $loop->have_posts() ) : $loop->the_post();
               echo '<p>'.get_the_title().'</p>';
            endwhile;
        } else {
            echo __( 'No se encontraron productos' );
        }
        wp_reset_postdata();
    ?>
</ul><!--/.products-->
3 abr 2019 15:37:13
Comentarios

Por favor, [edita] tu respuesta y añade una explicación: ¿por qué podría eso resolver el problema?

fuxia fuxia
3 abr 2019 17:40:12
0

Actualizado para 2021 - Debes usar wc_get_products()

Además, el ejemplo de código de Jameshwart (arriba) no funcionó para mí, así es como configuré los postdata y usé wc_get_template. Probado y funcionando.

$args = array(
    'status' => 'publish',
    'limit' => 20,
    'paginate' => true, //debe ser true para obtener ->total
    'return' => 'ids',
);
$products = wc_get_products( $args );

if ($products->total >= 1):

    woocommerce_product_loop_start();

    foreach($products->products as $pid):

        do_action( 'woocommerce_shop_loop' );

        $product = get_post($pid);
        setup_postdata($GLOBALS['post'] =& $product);
        wc_get_template_part('content', 'product');

    endforeach;
    wp_reset_postdata();

    woocommerce_product_loop_end();


endif; //si tenemos productos
4 ago 2021 17:55:03