Afficher les produits présentés via une boucle personnalisée dans woocommerce sur une page de modèle

16

Je souhaite afficher 6 produits en vedette de ma boutique woocommerce sur mon modèle home-page.php. Après quelques recherches, j'ai découvert que la bonne façon de procéder consistait à utiliser une boucle personnalisée (je ne souhaite pas utiliser de code abrégé, car j'aimerais ajouter des classes supplémentaires pour le style, etc.). J'ai également constaté que la clé utilisée par woocommerce pour la les produits en vedette sont '_featured'. J'ai rassemblé le code ci-dessous pour afficher tous les produits que j'ai choisis comme produits en vedette dans mon magasin, mais cela ne fonctionne pas ... Toute aide est la bienvenue.

<?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(); 
?>
    
posée steamfunk 23.07.2015 - 23:51

7 réponses

16

Modifiez vos arguments comme suit:

$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 vous allez dans wp-content / plugins / woocommerce / includes / class-wc-shortcodes.php (@ 595), vous trouverez comment cela se passe pour les codes courts WC.

    
réponse donnée Hooman Askari 15.09.2015 - 12:52
17

Cela a changé dans WooCommerce 3.0. Ce n'est pas simplement une méta_query, mais inclut maintenant une tax_query. Les arguments sont maintenant:

    $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,
    );

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

    
réponse donnée dpruth 08.05.2017 - 16:27
6

Boucle de produits en vedette dans 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();
?>
    
réponse donnée Mostafa Norzade 24.12.2017 - 08:59
1

Selon le Wiki de WooCommerce :

  

La création de WP_Queries ou de requêtes de base de données personnalisées [pour récupérer des produits] risque de casser votre code dans les futures versions de WooCommerce, car les données se déplacent vers les tables personnalisées pour améliorer les performances.

WooCommerce recommande d'utiliser wc_get_products() ou WC_Product_Query() au lieu de WP_Query() ou get_posts() .

J'ai écrit un article avec le code que j'avais utilisé pour obtenir ce que vous voulez ici: enlace

    
réponse donnée cfx 24.05.2018 - 20:58
1

Basé sur: enlace

Je voudrais essayer:

boucle extérieure:

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

 );

 $products = wc_get_products( $args );

dans la boucle:

$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();
    
réponse donnée conschneider 26.09.2018 - 14:09
0

Si vous consultez la base de données dans la table wp_postmeta , vous verrez que meta_key sera _featured et meta_value sera yes ou no so au lieu de la valeur 0 ou 1 écrire yes ou 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;
?>
    
réponse donnée Aamer Shahzad 11.07.2016 - 22:02
0

Je sais que c'est assez ancien, mais je viens de partager une solution alternative ici et je pense que cela peut aider. ceux qui atteignent ce sujet aussi.

Au lieu d'utiliser meta_query ou tax_query , vous pouvez utiliser wc_get_featured_product_ids () . aussi:

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

J'espère que ça aide!

    
réponse donnée Felipe Elia 29.04.2018 - 00:14

Lire d'autres questions sur les étiquettes