Holen Sie sich WooCommerce-Produkte aus einer bestimmten Kategorie

Lesezeit: 5 Minuten

Benutzer-Avatar
Maramal

Ich versuche, ein WooCommerce-Element einzufügen, um “Produkte” (Kurse) aus einer bestimmten Kategorie auf einer Seite anzuzeigen.

Ich musste diese Produkte auch für diese spezielle Kategorie ausblenden und es funktionierte wie erwartet. Ich habe gerade einen Filter in der functions.php hinzugefügt und war es:

/*
 * Exclude "packages" category from "Archive Products" on page 811
 * Ref. URL: https://docs.woocommerce.com/document/exclude-a-category-from-the-shop-page/
 */
function exclude_category_archive_products( $q ) {
   $tax_query = (array) $q->get( 'tax_query' );

    $tax_query[] = array(
           'taxonomy' => 'product_cat',
           'field' => 'slug',
           'terms' => array( 'packages' ),
           'operator' => 'NOT IN'
    );


    $q->set( 'tax_query', $tax_query );

}
if( $current_post_id != "811" ) {
    add_filter( 'woocommerce_product_query', 'exclude_category_archive_products' );
}
/* END Exclude "packages" category from "Archive Products" on page 811 */

Ich habe nach Möglichkeiten gesucht, das Gegenteil zu erreichen, und ich habe nichts “aus diesem Jahr oder in der Nähe” gefunden. Ich habe versucht, den Operator “IN” oder “=” zu verwenden, aber es hat nicht funktioniert (es zeigt alles an):

/*
 * Display "packages" category only
 */
function show_only_category_in_page( $q ) {
    var_dump("It reaches the function");
    $tax_query = (array) $q->get( 'tax_query' );

    $tax_query[] = array(
           'taxonomy' => 'product_cat',
           'field' => 'slug',
           'terms' => array( 'packages' ),
           'operator' => '='
    );

    $q->set( 'tax_query', $tax_query );
}
if( $current_post_id == "811" ) {
    var_dump("It reaches the page");
    add_filter( 'woocommerce_product_query', 'show_only_category_in_page' );
}
/*  END Display "packages" category only */

Der vorherige Code schreibt die string(23) "It gets reachs the page" nur. Was mache ich falsch?

Sie sollten dies ausprobieren, damit Sie Produkte aus einer bestimmten Kategorie erhalten können

Lösung 1:

$prod_categories = array(1, 2,3);
$product_args = array(
  'numberposts' => $limit,
  'post_status' => array('publish', 'pending', 'private', 'draft'),
  'post_type' => array('product', 'product_variation'),
  'orderby' => 'ID',
  'suppress_filters' => false,
  'order' => 'ASC',
  'offset' => 0
);

if (!empty($prod_categories)) {
   $product_args['tax_query'] = array(
      array(
        'taxonomy' => 'product_cat',
        'field' => 'id',
        'terms' => $prod_categories,
        'operator' => 'IN',
   ));
 }

 $products = get_posts($product_args);

Wobei 1,2,3 Ihre Kategorie-ID ist.

Lösung 2

Erstellen Sie eine benutzerdefinierte Seite und zeigen Sie bestimmte Produktkategorien an:

<?php
/**
* Template Name: Courses template
*
*/
defined( 'ABSPATH' ) || exit;


get_header();
?>
    <div id="content" class="content" role="main">

        <ul class="products">
            <?php
                $args = array( 
                    'post_type' => 'product', 
                    'posts_per_page' => -1, 
                    'product_cat' => 'clothing', // Category slug "clothing"
                    'orderby' => 'rand' 
                );
                $loop = new WP_Query( $args );
                while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>
            
                    <h2>Courses</h2>
            
                        <li class="product">    
            
                            <a href="<?php%20echo%20get_permalink(%20$loop->post->ID%20)%20?>" title="<?php echo esc_attr($loop->post->post_title ? $loop->post->post_title : $loop->post->ID); ?>">
            
                                <?php woocommerce_show_product_sale_flash( $post, $product ); ?>
            
                                <?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="300px" height="300px" />'; ?>
            
                                <h3><?php the_title(); ?></h3>
            
                                <span class="price"><?php echo $product->get_price_html(); ?></span>                    
            
                            </a>
            
                            <?php woocommerce_template_loop_add_to_cart( $loop->post, $product ); ?>
            
                        </li>
            
            <?php endwhile; ?>
            <?php wp_reset_query(); ?>
        </ul>
    </div><!-- #content -->

<?php get_footer(); ?>

Schritte:

  1. Gehen Sie zu Ihrem aktiven Thema und erstellen Sie eine neue Seite wie course-tpl.php
  2. Kopieren Sie den obigen Code und fügen Sie ihn auf Ihrer benutzerdefinierten Seite course-tpl.php ein und ändern/ersetzen Sie den Kategorie-Slug „Kleidung“ in „Ihr Kategorie-Slug“ und speichern Sie ihn.
  3. Dashboard öffnen – auf Seiten gehen und Seite “Neu hinzufügen” einen Seitentitel eingeben und “Kursvorlage” zuweisen und speichern
  4. Neue Seite öffnen
  5. Seiten-CSS und -HTML entsprechend aktualisieren/verwalten.

Erhalten Sie Produkte einer bestimmten Produktkategorie (nach Kategorie-Slug oder ID):

Ich möchte die Lösung von Rajeev Singh aktualisieren, insbesondere die Lösung zum Anzeigen von Produkten bestimmter Produktkategorien.

Problem:

Laut Woocommerce-Dokumentation WP_Query() oder get_posts() sollte nicht benutzt werden:

wc_get_products und WC_Product_Query bieten eine Standardmethode zum Abrufen von Produkten, die sicher zu verwenden ist und nicht aufgrund von Datenbankänderungen in zukünftigen WooCommerce-Versionen beschädigt wird. Das Erstellen benutzerdefinierter WP_Queries oder Datenbankabfragen wird Ihren Code in zukünftigen Versionen von WooCommerce wahrscheinlich beschädigen, da Daten für eine bessere Leistung in benutzerdefinierte Tabellen verschoben werden. Dies ist die bewährte Methode für Plug-in- und Theme-Entwickler, um mehrere Produkte abzurufen. wc_get_products und WC_Product_Query ähneln WordPress get_posts und WP_Query. Genau wie diese übergeben Sie ein Array von Argumenten, die die Kriterien für die Suche definieren.

WooCommerce-Dokumentation

Lösung 1 – Produkte nach Kategorie Slug erhalten

Hinweis: Das Kategorieargument erfordert ein Array von Slugs, keine IDs.

Wenn Sie die ID der Produktkategorie auf der spezifischen Kategoriearchivseite verwenden möchten, überprüfen Sie Lösung 2. Das Abrufen der ID der aktuellen Kategorie aus der Kategoriearchivseitenvorlage ist nicht Teil dieser Lösung.

 <?php
    $product_term_slugs = array('shirts');
    
    $product_args = array(
        'post_status' => 'publish',
        'limit' => -1,
        'category' => $product_term_slugs,
        //more options according to wc_get_products() docs
    );
    $products = wc_get_products($product_args);
   ?>

Lösung 2 – Produkte nach Kategorie-ID abrufen:

 $product_term_ids = array(12);
    
    $product_term_args = array(
        'taxonomy' => 'product_cat',
        'include' => $product_term_ids,
        'orderby'  => 'include'
    );
    $product_terms = get_terms($product_term_args);
    
    $product_term_slugs = [];
    foreach ($product_terms as $product_term) {
        $product_term_slugs[] = $product_term->slug;
    }
    
    $product_args = array(
        'post_status' => 'publish',
        'limit' => -1,
        'category' => $product_term_slugs,
        //more options according to wc_get_products() docs
    );
    $products = wc_get_products($product_args);
  

Lösung – Produkte anzeigen

<?php foreach ($products as $product) {
 $product_id = $product->get_id();
 $product_type = $product->get_type();
 $product_title = $product->get_title();
 $product_permalink = $product->get_permalink();
 $product_regular_price = $product->get_regular_price();
 $product_sale_price = $product->get_sale_price();
 $product_short_desc = $product->get_short_description();
 $product_categories = $product->get_categories(); 
 ?>
 <!-- display product html -->
 <?php } ?>

(Getestet und funktioniert mit WordPress 5.9.3 & WooCommerce 6.4.1.)

Bildnachweis: @Christian Lescuyer

1017020cookie-checkHolen Sie sich WooCommerce-Produkte aus einer bestimmten Kategorie

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy