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

16

Me gustaría mostrar 6 productos destacados de mi tienda de 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 el comercio electrónico usa para Los productos destacados son '_featured'. Reuní el código a continuación para mostrar los productos que elegí como productos destacados en mi tienda, pero no funcionan ... 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(); 
?>
    
pregunta steamfunk 23.07.2015 - 23:51

7 respuestas

16

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 vas a wp-content / plugins / woocommerce / includes / class-wc-shortcodes.php (@ 595) puedes encontrar información sobre cómo hacerlo con los códigos cortos de WC.

    
respondido por el Hooman Askari 15.09.2015 - 12:52
17

Esto ha cambiado en WooCommerce 3.0. No es simplemente un meta_query, pero ahora incluye un 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

    
respondido por el dpruth 08.05.2017 - 16:27
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();
?>
    
respondido por el Mostafa Norzade 24.12.2017 - 08:59
1

Según el Wiki de WooCommerce :

  

La creación de consultas WP_Queries o de base de datos personalizadas [para recuperar productos] probablemente rompa su código en futuras versiones de WooCommerce a medida que los datos se mueven hacia tablas personalizadas para un mejor rendimiento.

Los defensores de WooCommerce utilizan wc_get_products() o WC_Product_Query() en lugar de WP_Query() o get_posts() .

He escrito una publicación con el código que usé para lograr lo que quieres aquí: enlace

    
respondido por el cfx 24.05.2018 - 20:58
1

Basado en: enlace

Lo intentaría:

bucle externo:

$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();
    
respondido por el conschneider 26.09.2018 - 14:09
0

si echa un vistazo a la base de datos en la tabla wp_postmeta verá que meta_key será _featured y meta_value será yes o no , así que en lugar del valor 0 o 1 write 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();
            // display product info
        endwhile; wp_reset_query();
    endif;
?>
    
respondido por el Aamer Shahzad 11.07.2016 - 22:02
0

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

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

$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!

    
respondido por el Felipe Elia 29.04.2018 - 00:14

Lea otras preguntas en las etiquetas