Visualizza i prodotti in vetrina attraverso il loop personalizzato in woocommerce sulla pagina del modello


19

Vorrei visualizzare 6 prodotti in vetrina dal mio negozio di woocommerce sul mio modello home-page.php. Dopo alcune ricerche ho scoperto che il modo giusto per farlo era attraverso un ciclo personalizzato (non desidero utilizzare i codici brevi perché vorrei aggiungere ulteriori classi per lo stile, ecc.) Ho anche scoperto che la chiave che il woocommerce utilizza per il i prodotti in vetrina sono "_featured". Ho messo insieme il codice qui sotto per visualizzare tutti i prodotti che ho scelto di essere presenti nel mio negozio, ma non funziona ... Qualsiasi aiuto è apprezzato.

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

Aggiungi il risultato da var_dump( get_meta_values( '_featured', 'product' );dove la funzione get_meta_valuesè supportata dalla funzione personalizzata spiegata in questa risposta
Pieter Goosen

Risposte:


17

Cambia i tuoi argomenti in questo modo:

$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
);

Se vai su wp-content / plugins / woocommerce / Includes / class-wc-shortcodes.php (@ 595) puoi scoprire come è fatto per gli shortcode WC.


3
La chiave da notare è che "_featured" non è memorizzato come valore numerico. È memorizzato come una stringa 'yes' o 'no'. Tutto il resto nella domanda OP dovrebbe funzionare, ha funzionato per me.
i_a,

1
A partire da WooCommerce 3.0, questa soluzione non funziona più. Si prega di consultare la mia risposta aggiornata di seguito.
dpruth,

22

Questo è cambiato in WooCommerce 3.0. Non è semplicemente una meta_query, ma ora include una tax_query. Gli argomenti sono ora:

    $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,
    );

Vedi woocommerce / Includes / class-wc-shortcodes.php


1
Proprio quello che stavo cercando!
joshkrz,

Anche per Woocommerce 3.0, si consiglia di utilizzare wc_placeholder_img_srcanziché woocommerce_placeholder_img_src.
Robotnicka,

6

Prodotti in vetrina Loop in 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();
?>

5

Secondo il wiki di WooCommerce :

La creazione di query WP_Queries personalizzate o di database [per recuperare prodotti] è suscettibile di violare il codice nelle versioni future di WooCommerce mentre i dati si spostano verso tabelle personalizzate per prestazioni migliori.

I sostenitori di WooCommerce utilizzano wc_get_products()o WC_Product_Query()invece di WP_Query()o get_posts().

Ho scritto un post con il codice che ho usato per ottenere quello che vuoi qui: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/


scusa, senza vedere un po 'di codice scritto, è difficile capire il tuo articolo. Potete per favore includere un po 'di codice?
HOY

@HOY il plugin di incorporamento era rotto; è stato risolto ora e puoi vedere il codice!
cfr

grazie, mentre cercavo soluzioni, ne ho inventato uno qui sotto. Non sono sicuro di come differisca dal tuo poiché non sono stato in grado di verificarlo fino in fondo, ma è molto breve e mi ha aiutato con un ciclo di prodotti personalizzato. kathyisawesome.com/woocommerce-modifying-product-query
HOY

1

So che questo è piuttosto vecchio, ma ho appena condiviso una soluzione alternativa qui e penso che possa aiutare anche quelli a raggiungere questo argomento.

Invece di usare meta_queryo tax_query, puoi usare anche 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 );

Spero possa essere d'aiuto!


1

Basato su: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

Proverei:

anello esterno:

$args = array (
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,

 );

 $products = wc_get_products( $args );

nel loop:

$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();

0

se dai un'occhiata al database nella wp_postmetatabella vedrai meta_keyche sarà _featurede meta_valuesarà yesono meno invece di valore 0o 1scrittura yesono

<?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
<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 prega di modificare la risposta , e aggiungere una spiegazione: perché potrebbe che risolvere il problema?
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.