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

19

Je voudrais afficher 6 produits en vedette de ma boutique woocommerce sur mon modèle home-page.php. Après quelques recherches, j'ai trouvé que la bonne façon de le faire était via une boucle personnalisée, (je ne souhaite pas utiliser de shortcodes parce que je voudrais ajouter des classes supplémentaires pour le style, etc.) J'ai également constaté que la clé que woocommerce utilise pour le les produits en vedette sont «_en vedette». J'ai rassemblé le code ci-dessous pour afficher tous les produits que j'ai choisis pour être présentés dans mon magasin, mais cela ne fonctionne pas ... Toute aide est appréciée.

<?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
la source
Ajoutez le résultat de l' var_dump( get_meta_values( '_featured', 'product' );endroit où la fonction get_meta_valuesest prise en charge par la fonction personnalisée expliquée dans cette réponse
Pieter Goosen

Réponses:

17

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 pouvez trouver comment cela se fait pour les shortcodes WC.

Hooman Askari
la source
3
La clé à noter est que '_featured' n'est pas stocké en tant que valeur numérique. Il est stocké sous la forme d'une chaîne «oui» ou «non». Tout le reste dans la question OP devrait fonctionner, a fonctionné pour moi.
i_a
1
Depuis WooCommerce 3.0, cette solution ne fonctionne plus. Veuillez voir ma réponse mise à jour ci-dessous.
dpruth
22

Cela a changé dans WooCommerce 3.0. Ce n'est pas simplement une meta_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

dpruth
la source
1
Exactement ce que je cherchais!
joshkrz
Aussi pour Woocommerce 3.0, ils recommandent d'utiliser wc_placeholder_img_srcau lieu de woocommerce_placeholder_img_src.
Robotnicka
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();
?>
Mostafa Norzade
la source
5

Selon le WooCommerce Wiki :

La création de WP_Queries personnalisées ou de requêtes de base de données [pour récupérer des produits] est susceptible de casser votre code dans les futures versions de WooCommerce à mesure que les données se déplacent vers des tables personnalisées pour de meilleures performances.

WooCommerce préconise 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'ai utilisé pour réaliser ce que vous voulez ici: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

cfx
la source
désolé, sans voir du code écrit, il est difficile de comprendre votre article. Pouvez-vous s'il vous plaît inclure du codage?
HOY
@HOY le plugin d'intégration a été cassé; c'est corrigé maintenant et vous pouvez voir le code!
cfx
merci, en cherchant des solutions, j'ai trouvé celle-ci ci-dessous. Je ne sais pas en quoi il diffère du vôtre car je n'ai pas pu vérifier le vôtre en profondeur, mais il est très court et m'a aidé avec une boucle de produit personnalisée. kathyisawesome.com/woocommerce-modifying-product-query
HOY
1

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_queryou tax_query, vous pouvez également utiliser 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 );

J'espère que ça aide!

Felipe Elia
la source
1

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();
conschneider
la source
0

si vous jetez un oeil dans la base de données dans le wp_postmetatableau, vous verrez meta_keysera _featuredet meta_valuesera yesou noalors au lieu de valeur 0ou 1écrire yesouno

<?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
la source
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
la source
Veuillez modifier votre réponse et ajouter une explication: pourquoi cela pourrait-il résoudre le problème?
fuxia