php 从特定类别获取WooCommerce产品

nwlls2ji  于 2023-03-11  发布在  PHP
关注(0)|答案(2)|浏览(166)

我正在尝试插入WooCommerce元素,以将特定类别的“产品”(课程)显示到页面中。
我还必须隐藏这个特定类别的这些产品,它的工作如预期。我只是添加了一个过滤器内functions.php和它是:

/*
 * 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 */

我一直在寻找方法来达到相反的效果,但我没有找到任何“从今年或接近”。我尝试使用“IN”或“=”操作符,但它不工作(它显示所有内容):

/*
 * 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 */

前面的代码只写了string(23) "It gets reachs the page",我做错了什么?

lsmepo6l

lsmepo6l1#

你应该试试这个,你可以从一个特定的类别的产品

解决方案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);

其中1,2,3表示类别ID。

溶液2

创建自定义页面并显示特定类别的产品:

<?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 echo get_permalink( $loop->post->ID ) ?>" 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(); ?>

步骤:
1.转到当前主题创建一个类似course-tpl. php的新页面
1.复制并粘贴上述代码到您的自定义页面course-tpl.php,并更改/替换类别slug“clothing”为“your category slug”,然后保存。
1.打开 Jmeter 板-转到页面和“添加新”页面,输入页面标题,分配“课程模板”并保存
1.打开新页面
1.相应地更新/管理页面CSS和HTML。

yhived7q

yhived7q2#

获取特定产品类别的产品(按类别slug或id):

我想更新Rajeev Singh的解决方案,特别是用于显示特定产品类别的产品的解决方案。

问题:

根据Woocommerce文档**WP_Query()get_posts()**不应使用:
wc_get_products和WC_Product_Query提供了检索产品的标准方法,使用安全,不会因未来WooCommerce版本中的数据库更改而中断。构建自定义WP_Queries或数据库查询可能会在WooCommerce的未来版本中中断您的代码,因为数据会移向自定义表格以获得更好的性能。这是插件和主题开发人员检索多个产品的最佳方法。get_products和WC_Product_Query类似于WordPress的get_posts和WP_Query,就像它们一样,传入一个参数数组来定义搜索条件。
WooCommerce Docs

解决方案1 -按类别获取产品slug

  • 注意:category参数需要一个slug数组,而不是ID。*

如果您想在特定类别存档页面上使用产品类别的ID,请检查解决方案2。如何从类别存档页面模板中获取当前类别的ID不是此解决方案的一部分。

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

解决方案2 -按类别ID获取产品:

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

解决方案-显示产品

<?php 
if(!empty($products):
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
endif;
endforeach;
 ?>

(测试和工作与WordPress 5.9.3和WooCommerce 6.4.1.)
Credit: @Christian Lescuyer

相关问题