Afisare produse recomandate prin buclă personalizată în WooCommerce pe pagina de șablon

24 iul. 2015, 00:51:58
Vizualizări: 94.1K
Voturi: 24

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

Adaugă rezultatul din var_dump( get_meta_values( '_featured', 'product' ); unde funcția get_meta_values este susținută de funcția personalizată explicată în acest răspuns

Pieter Goosen Pieter Goosen
24 iul. 2015 07:34:48
Toate răspunsurile la întrebare 10
2
25

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

8 mai 2017 17:27:17
Comentarii

Exact ceea ce căutam!

joshkrz joshkrz
11 mai 2018 01:09:17

De asemenea, pentru Woocommerce 3.0, ei recomandă folosirea wc_placeholder_img_src în loc de woocommerce_placeholder_img_src.

Robotnicka Robotnicka
25 mai 2018 03:46:17
2
18

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.

15 sept. 2015 13:52:35
Comentarii

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.

i_a i_a
3 iul. 2016 20:02:55

Începând cu WooCommerce 3.0, această soluție nu mai funcționează. Vă rugăm să consultați răspunsul meu actualizat mai jos.

dpruth dpruth
12 iun. 2018 22:02:29
0

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();
?>
24 dec. 2017 09:59:23
3

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/

24 mai 2018 21:58:39
Comentarii

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 HOY
5 iun. 2019 17:59:30

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

cfx cfx
5 iun. 2019 23:07:32

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/

HOY HOY
5 iun. 2019 23:28:38
0

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

29 apr. 2018 01:14:51
0

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();
26 sept. 2018 15:09:39
0

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/

12 iul. 2020 15:35:24
0

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;
?>
11 iul. 2016 23:02:39
1
<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-->
3 apr. 2019 15:37:13
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva această soluție problema?

fuxia fuxia
3 apr. 2019 17:40:12
0

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
4 aug. 2021 17:55:03