Afisare produse recomandate prin buclă personalizată în WooCommerce pe pagina de șablon
Doresc să afișez 6 produse recomandate din magazinul meu WooCommerce pe șablonul home-page.php. După ce am cercetat, am aflat că metoda corectă este prin utilizarea unei bucle personalizate (nu doresc să folosesc shortcode-uri pentru că vreau să adaug clase adiționale pentru stilizare etc.). De asemenea, am descoperit că cheia pe care WooCommerce o folosește pentru produsele recomandate este '_featured'. Am creat codul de mai jos pentru a afișa produsele pe care le-am marcat ca recomandate în magazin, dar nu funcționează... Orice ajutor este binevenit.
<?php
$args = array(
'post_type' => 'product', // Tipul postului - produs
'stock' => 1, // Doar produsele în stoc
'showposts' => 6, // Numărul de produse de afișat
'orderby' => 'date', // Sortează după dată
'order' => 'DESC' , // Ordine descrescătoare
'meta_query' => array( // Interogare meta pentru produse recomandate
array(
'key' => '_featured', // Cheia pentru produse recomandate
'value' => 0,
'compare' => '>', // Compară cu valori mai mari decât 0
'type' => 'numeric' // Tipul valorii este 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="Imagine implicită" 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();
?>

Aceasta s-a schimbat în WooCommerce 3.0. Nu mai este doar un meta_query, ci acum include și un tax_query. Argumentele sunt acum:
$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,
);
Vezi woocommerce/includes/class-wc-shortcodes.php

Modifică argumentele tale astfel:
$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
);
Dacă mergi la wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php (@595) poți vedea cum este implementat pentru shortcode-urile WC.

Important de reținut este că '_featured' nu este stocat ca o valoare numerică. Este stocat ca șir de caractere 'yes' sau 'no'. Orice altceva din întrebarea OP ar trebui să funcționeze, a funcționat pentru mine.

Buclă pentru Produse Recomandate în 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 __( 'Nu au fost găsite produse' );
}
wp_reset_postdata();
?>

Conform Wiki WooCommerce:
Construirea de interogări personalizate WP_Query sau interogări directe în baza de date [pentru a prelua produse] poate duce la defecțiuni în codul tău în viitoarele versiuni de WooCommerce, deoarece datele vor fi mutate în tabele personalizate pentru performanță sporită.
WooCommerce recomandă utilizarea funcțiilor wc_get_products()
sau WC_Product_Query()
în loc de WP_Query()
sau get_posts()
.
Am scris un articol cu codul pe care l-am folosit pentru a obține ceea ce dorești aici: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

scuze, fără să văd niște cod scris, este greu să înțeleg articolul tău. Poți, te rog, să incluzi niște cod?

@HOY pluginul de embed nu funcționa; acum este reparat și poți vedea codul!

mulțumesc, în timp ce căutam soluții, am dat peste aceasta de mai jos. Nu sunt sigur cum diferă de a ta deoarece nu am putut să o verific în detaliu, dar este foarte scurtă și m-a ajutat cu un loop de produse personalizat. https://www.kathyisawesome.com/woocommerce-modifying-product-query/

Știu că această metodă este destul de veche, dar tocmai am împărtășit o soluție alternativă aici și cred că poate ajuta și pe cei care ajung la acest subiect.
În loc să folosești meta_query
sau tax_query
, poți utiliza și 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 );
Sper să vă fie de folos!

Bazat pe: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query
Aș încerca:
în afara buclei:
$args = array (
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,
);
$products = wc_get_products( $args );
în buclă:
$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();

Oamenii ar trebui să înceapă să folosească funcția wc_get_products deoarece WooCommerce a declarat că aceasta este metoda standard de a prelua produse. Funcția wc_get_products are un argument numit "featured" care trebuie doar setat pe true. Codul este simplu, așa cum este prezentat mai jos.
<?php
// Afișează produsele recomandate după categorie. În acest caz, este "shirts" care este slug-ul categoriei.
$query_args = array(
'featured' => true,
'category' => array( 'shirts' ),
);
$products = wc_get_products( $query_args );
global $post;
$columns = wc_get_loop_prop( 'columns' );
?>
<div class="woocommerce columns-<?php echo esc_attr( $columns ); ?>">
<?php
woocommerce_product_loop_start();
foreach ($products as $product) {
$post = get_post($product->get_id());
setup_postdata($post);
wc_get_template_part('content', 'product');
}
wp_reset_postdata();
woocommerce_product_loop_end();
?>
</div>
Vezi postarea completă aici: https://jameshwartlopez.com/plugin/get-featured-products-of-a-category/

dacă te uiți în baza de date în tabelul wp_postmeta
vei vedea că meta_key
va fi _featured
iar meta_value
va fi yes
sau no
, deci în loc de valoarea 0
sau 1
scrie yes
sau no
<?php
$q = new WP_Query([
'post_type' => 'product', // tipul postului
'stock' => 1, // doar produsele în stoc
'showposts' => 3, // numărul de produse afișate
'orderby' => 'date', // ordonează după dată
'order' => 'DESC', // ordine descrescătoare
'meta_query' => [
['key' => '_featured', 'value' => 'yes' ] // doar produsele recomandate
]
]);
if ( $q->have_posts() ) :
while ( $q->have_posts() ) : $q->the_post();
// afișează informațiile despre produs
endwhile; wp_reset_query();
endif;
?>

<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 __( 'Nu s-au găsit produse' );
}
wp_reset_postdata();
?>
</ul><!--/.products-->

Actualizare pentru 2021 - Trebuie să folosiți wc_get_products()
De asemenea, exemplul de cod de la Jameshwart (mai sus) nu a funcționat pentru mine, așa am configurat postdata & utilizat wc_get_template. Testat & funcțional.
$args = array(
'status' => 'publish',
'limit' => 20,
'paginate' => true, //trebuie să fie true pentru a obține ->total
'return' => 'ids',
);
$products = wc_get_products( $args );
if ($products->total >= 1):
woocommerce_product_loop_start();
foreach($products->products as $pid):
do_action( 'woocommerce_shop_loop' );
$product = get_post($pid);
setup_postdata($GLOBALS['post'] =& $product);
wc_get_template_part('content', 'product');
endforeach;
wp_reset_postdata();
woocommerce_product_loop_end();
endif; //avem produse
