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