我想在home-page.php模板上显示woocommerce商店中的6种特色产品。经过一番研究后,我发现正确的方法是通过自定义循环((我不想使用短代码,因为我想添加其他类来设置样式等。))我还发现woocommerce用于特色产品为“ _featured”。我将以下代码放在一起,以显示我选择在商店中成为特色产品的任何产品,但此方法无法正常工作。不胜感激。

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


评论

添加var_dump(get_meta_values('_featured','product');的结果;其中,get_meta_values函数由该答案中说明的自定义函数支持

#1 楼

更改您的参数,使其像这样:

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


如果您去wp-content / plugins / woocommerce / includes / class-wc-shortcodes.php(@ 595)您可以找到如何完成WC短代码。

评论


他们要注意的关键是“ _featured”未存储为数值。它存储为字符串“是”或“否”。 OP问题中的其他所有内容都应该对我有用。

– i_a
16年7月3日在17:02

从WooCommerce 3.0开始,此解决方案不再起作用。请在下面查看我更新的答案。

– dpruth
18年6月12日在19:02

#2 楼

这已在WooCommerce 3.0中更改。它不仅是meta_query,而且现在包括tax_query。参数现在是:

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


请参阅woocommerce / includes / class-wc-shortcodes.php

评论


正是我想要的!

–joshkrz
18年5月10日在22:09

同样对于Woocommerce 3.0,他们建议使用wc_placeholder_img_src而不是woocommerce_placeholder_img_src。

–机器人尼克
18年5月25日在0:46

#3 楼

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


#4 楼

根据WooCommerce Wiki:


构建定制的WP_Queries或数据库查询(以检索产品)很可能会破坏WooCommerce的未来版本中的代码,因为数据将移向定制表以提高性能。


WooCommerce提倡使用wc_get_products()WC_Product_Query()代替WP_Query()get_posts()

我写了一篇帖子,上面写的代码用来在这里实现您想要的: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

评论


抱歉,没有看到任何书面代码,很难理解您的文章。您能提供一些编码吗?

–嗨
19年5月5日在14:59

@HOY嵌入插件已损坏;现在已修复,您可以看到代码!

–cfx
19年6月5日在20:07



谢谢,在寻找解决方案时,我提出了以下解决方案。我不确定它与您的产品有何不同,因为我无法彻底检查您的产品,但是它很短,可以帮助我进行自定义产品循环。 kathyisawesome.com/woocommerce-modifying-product-query

–嗨
19-6-5 '20:28



#5 楼

我知道这已经很老了,但是我刚刚在这里分享了一个替代解决方案,我认为它也可以帮助那些达到此主题的人。

您可以使用wc_get_featured_product_ids()代替meta_querytax_query太好了:

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


希望对您有所帮助!

#6 楼

基于:https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

我会尝试:

外部循环:

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

 );

 $products = wc_get_products( $args );


循环中:

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


#7 楼

人们应该开始使用wc_get_products,因为woocommerce表示这是检索产品的标准方法。 wc_get_products具有一个仅需设置为true的参数。因此代码就在下面。
 <?php 

// Display featured products by category. on this case its "shirts" which is the slug of the category.
$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>

在此处查看完整文章:https://jameshwartlopez.com/plugin/get-featured-products-of-a-category/

#8 楼

如果您查看wp_postmeta表中的数据库,您会看到meta_key将是_featured,而meta_value将是yesno,因此要写01而不是值yesno

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


#9 楼

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


评论


请编辑您的答案,并添加解释:为什么这可以解决问题?

– fuxia♦
19年4月3日在14:40