web-dev-qa-db-fra.com

Affichez les produits en vedette via une boucle personnalisée dans woocommerce sur une page de modèle

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

Changez vos arguments pour être comme ça:

$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 pouvez trouver comment cela fonctionne pour les codes abrégés de WC.

16
Hooman Askari

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

20
dpruth

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

Selon le WooCommerce Wiki :

La construction de WP_Queries ou de requêtes de base de données personnalisées [pour récupérer des produits] est susceptible de rompre votre code dans les futures versions de WooCommerce lorsque 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 réaliser ce que vous voulez ici: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

4
cfx

Basé sur: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

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

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

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

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

1
Felipe Elia
<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-->
0
Dhaval

si vous regardez dans la base de données de la table wp_postmeta, vous verrez que meta_key sera _featured et meta_value sera yes ou no donc 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;
?>
0
Aamer Shahzad