Mostrar productos destacados a través de bucles personalizados en woocommerce en la página de plantilla

19

Me gustaría mostrar 6 productos destacados de mi tienda woocommerce en mi plantilla home-page.php. Después de investigar un poco, descubrí que la forma correcta de hacerlo era a través de un bucle personalizado (no deseo usar códigos cortos porque me gustaría agregar clases adicionales para el estilo, etc.) También encontré que la clave que utiliza WooCommerce para los productos destacados están '_featured'. Puse el siguiente código para mostrar los productos que elegí para ser presentados en mi tienda, pero no funciona ... Se agradece cualquier ayuda.

<?php

    $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="Placeholder" width="65px" height="115px" />'; 
            ?>
            <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(); 
?>
steamfunk
fuente
Agregue el resultado desde var_dump( get_meta_values( '_featured', 'product' );donde la función get_meta_valueses compatible con la función personalizada explicada en esta respuesta
Pieter Goosen

Respuestas:

17

Cambia tus argumentos para que sean 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 va a wp-content / plugins / woocommerce / includes / class-wc-shortcodes.php (@ 595) puede encontrar cómo se hace para los shortcodes de WC.

Hooman Askari
fuente
3
La clave para tener en cuenta es que '_featured' no se almacena como un valor numérico. Se almacena como una cadena 'sí' o 'no'. Todo lo demás en la pregunta de OP debería funcionar, funcionó para mí.
i_a
1
A partir de WooCommerce 3.0, esta solución ya no funciona. Por favor, vea mi respuesta actualizada a continuación.
dpruth
22

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

    $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

dpruth
fuente
1
¡Justo lo que estaba buscando!
joshkrz
También para Woocommerce 3.0, recomiendan usar en wc_placeholder_img_srclugar de woocommerce_placeholder_img_src.
Robotnicka
6

Productos destacados Loop 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 products found' );
}
wp_reset_postdata();
?>
Mostafa Norzade
fuente
5

De acuerdo con el Wiki de WooCommerce :

Es probable que crear WP_Queries o consultas de bases de datos personalizadas [para recuperar productos] rompa su código en futuras versiones de WooCommerce a medida que los datos se muevan hacia tablas personalizadas para un mejor rendimiento.

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

He escrito una publicación con el código que usé para lograr lo que quieres aquí: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

cfx
fuente
lo siento, sin ver un código escrito, es difícil entender tu artículo. ¿Puedes incluir algo de codificación?
HOY
@HOY el complemento de inserción estaba roto; ¡ya está arreglado y puedes ver el código!
cfx
gracias, mientras buscaba soluciones, se me ocurrió esta a continuación. No estoy seguro de cómo difiere de la suya, ya que no pude verificarla a fondo, pero es muy corta y me ayudó con un ciclo de producto personalizado. kathyisawesome.com/woocommerce-modifying-product-query
HOY
1

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

En lugar de usar meta_queryo tax_query, también puede 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!

Felipe Elia
fuente
1

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

Lo intentaré:

bucle exterior:

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

 );

 $products = wc_get_products( $args );

en el lazo:

$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();
conschneider
fuente
0

si echa un vistazo a la base de datos en la wp_postmetatabla, verá meta_keyserá _featuredy meta_valueserá más yeso nomenos en lugar de valor 0o 1escribir yesono

<?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();
            // display product info
        endwhile; wp_reset_query();
    endif;
?>
Aamer Shahzad
fuente
0
<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 products found' );
        }
        wp_reset_postdata();
    ?>
</ul><!--/.products-->
Dhaval
fuente
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia