Zeigen Sie vorgestellte Produkte über eine benutzerdefinierte Schleife im Woocommerce auf der Vorlagenseite an


19

Ich möchte 6 vorgestellte Produkte aus meinem Woocommerce-Shop auf meiner Homepage.php-Vorlage anzeigen. Nach einigen Recherchen stellte ich fest, dass der richtige Weg dies über eine benutzerdefinierte Schleife zu tun war (ich möchte keine Shortcodes verwenden, da ich zusätzliche Klassen für das Stylen usw. hinzufügen möchte) Empfohlene Produkte ist '_featured'. Ich habe den folgenden Code zusammengestellt, um alle Produkte anzuzeigen, die ich als empfohlene Produkte in meinem Shop ausgewählt habe, aber es funktioniert nicht ... Jede Hilfe wird gebeten.

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

Fügen Sie das Ergebnis hinzu, von var_dump( get_meta_values( '_featured', 'product' );dem aus die Funktion get_meta_valuesvon der in dieser Antwort
Pieter Goosen

Antworten:


17

Ändere deine Argumente so:

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

Unter wp-content / plugins / woocommerce / includes / class-wc-shortcodes.php (@ 595) können Sie nachlesen, wie dies für WC-Shortcodes gemacht wird.


3
Der Schlüssel zu beachten ist, dass '_featured' nicht als numerischer Wert gespeichert wird. Es wird als Zeichenfolge "Ja" oder "Nein" gespeichert. Alles andere in der OP-Frage sollte funktionieren, hat bei mir funktioniert.
i_a

1
Ab WooCommerce 3.0 funktioniert diese Lösung nicht mehr. Bitte sehen Sie meine aktualisierte Antwort unten.
Dpruth

22

Dies hat sich in WooCommerce 3.0 geändert. Es ist nicht nur eine meta_query, sondern enthält jetzt eine tax_query. Die Argumente sind jetzt:

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

Siehe woocommerce / includes / class-wc-shortcodes.php


1
Genau das, wonach ich gesucht habe!
Joshkrz

Auch für Woocommerce 3.0 empfehlen sie die Verwendung von wc_placeholder_img_srcanstelle von woocommerce_placeholder_img_src.
Robotnicka

6

Vorgestellte Produkte 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

Laut dem WooCommerce Wiki :

Wenn Sie benutzerdefinierte WP_Queries oder Datenbankabfragen [zum Abrufen von Produkten] erstellen, wird Ihr Code wahrscheinlich in zukünftigen Versionen von WooCommerce beschädigt, wenn Daten für eine bessere Leistung in benutzerdefinierte Tabellen verschoben werden .

WooCommerce befürwortet die Verwendung von wc_get_products()oder WC_Product_Query()anstelle von WP_Query()oder get_posts().

Ich habe einen Beitrag mit dem Code geschrieben, mit dem ich erreicht habe, was Sie hier wollen: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/


Entschuldigung, ohne einen geschriebenen Code zu sehen, ist es schwer Ihren Artikel zu verstehen. Können Sie bitte eine Codierung beifügen?
HOY

@HOY das Embed-Plugin war kaputt; Es ist jetzt behoben und Sie können den Code sehen!
CFX

Vielen Dank, während ich nach Lösungen suchte, bin ich auf die folgende Idee gekommen. Ich bin mir nicht sicher, wie es sich von Ihrem unterscheidet, da ich nicht in der Lage war, Ihr Produkt vollständig zu überprüfen, aber es ist sehr kurz und hat mir bei einer benutzerdefinierten Produktschleife geholfen. kathyisawesome.com/woocommerce-modifying-product-query
HOY

1

Ich weiß, dass dies ziemlich alt ist, aber ich habe hier gerade eine alternative Lösung vorgestellt , und ich denke, dies kann auch denjenigen helfen, die dieses Thema erreichen.

Anstelle von meta_queryoder tax_querykönnen Sie auch wc_get_featured_product_ids () verwenden :

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

Ich hoffe, es hilft!


1

Basierend auf: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

Ich würde versuchen:

Außenschleife:

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

 );

 $products = wc_get_products( $args );

in der Schleife:

$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

wenn Sie einen Blick in die Datenbank aufnehmen wp_postmetaTabelle werden Sie sehen , meta_keywird _featuredund meta_valuewird sein yesoder noso statt Wert 0oder 1Schreib yesoderno

<?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-->

Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte dies das Problem lösen?
Fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.