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(); 
?>

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.


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


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();
?>

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/


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!


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();

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;
?>

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

Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.