【问题标题】:Making custom WooCommerce loop制作自定义 WooCommerce 循环
【发布时间】:2012-10-27 08:32:20
【问题描述】:

我正在使用已经为 wordpress 设计的主题,现在我想展示 WooCommerce 产品(我认为是自定义帖子类型)而不是常规博客文章。

这是带有显示循环的当前查询:

<?php 
                $args = array(
                    //'posts_per_page' => '2',
                    'paged' => get_query_var('paged')
                );
                $homepage_query = new WP_Query($args);
            ?>
            <?php //query_posts('posts_per_page=4&paged='.get_query_var('paged')); ?>
            <?php if ( have_posts() ) : ?>  
                <?php while ( $homepage_query->have_posts() ) : $homepage_query->the_post(); ?>
                    <?php if($style == 'blog_style') { ?>
                    <div id="blog-style" class="post-box">
                        <?php get_template_part('content', 'blog'); ?>
                    </div>
                    <?php } else { ?>
                    <div class="post-box grid_4 <?php aero_post_box_class(); ?>">
                        <?php get_template_part('content', ''); ?>
                    </div>
                    <?php } ?>
                <?php endwhile; ?>

有没有办法向$args 添加选项,以便循环显示 WooCommerce 产品?我也在这个循环中使用分页,这是这个项目所必需的,所以这就是为什么使用这个循环很重要。

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

    您应该能够通过循环访问产品,将post_type arg 设置为product:

    <?php
    
    // Setup your custom query
    $args = array( 'post_type' => 'product', ... );
    $loop = new WP_Query( $args );
    
    while ( $loop->have_posts() ) : $loop->the_post(); ?>
    
        <a href="<?php echo get_permalink( $loop->post->ID ) ?>">
            <?php the_title(); ?>
        </a>
    
    <?php endwhile; wp_reset_query(); // Remember to reset ?>
    

    【讨论】:

    • 是的,它现在正在循环播放,太好了!
    • 如果你想得到价格等,你可能想做:$product = get_product($loop-&gt;post);,然后像使用WC_Product一样使用它:echo $product-&gt;get_price_html();等。
    • get_product() 现已弃用,使用 $product = new WC_Product($loop->post->ID);
    【解决方案2】:

    这是重新创建和自定义 WooCommerce 产品循环的正确方法:

      if(!function_exists('wc_get_products')) {
        return;
      }
    
      $paged                   = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1; // if your custom loop is on a static front page then check for the query var 'page' instead of 'paged', see https://developer.wordpress.org/reference/classes/wp_query/#pagination-parameters
      $ordering                = WC()->query->get_catalog_ordering_args();
      $ordering['orderby']     = array_shift(explode(' ', $ordering['orderby']));
      $ordering['orderby']     = stristr($ordering['orderby'], 'price') ? 'meta_value_num' : $ordering['orderby'];
      $products_per_page       = apply_filters('loop_shop_per_page', wc_get_default_products_per_row() * wc_get_default_product_rows_per_page());
    
      $products_ids            = wc_get_products(array(
        'status'               => 'publish',
        'limit'                => $products_per_page,
        'page'                 => $paged,
        'paginate'             => true,
        'return'               => 'ids',
        'orderby'              => $ordering['orderby'],
        'order'                => $ordering['order'],
      ));
    
      wc_set_loop_prop('current_page', $paged);
      wc_set_loop_prop('is_paginated', wc_string_to_bool(true));
      wc_set_loop_prop('page_template', get_page_template_slug());
      wc_set_loop_prop('per_page', $products_per_page);
      wc_set_loop_prop('total', $products_ids->total);
      wc_set_loop_prop('total_pages', $products_ids->max_num_pages);
    
      if($products_ids) {
        do_action('woocommerce_before_shop_loop');
        woocommerce_product_loop_start();
          foreach($products_ids->products as $featured_product) {
            $post_object = get_post($featured_product);
            setup_postdata($GLOBALS['post'] =& $post_object);
            wc_get_template_part('content', 'product');
          }
          wp_reset_postdata();
        woocommerce_product_loop_end();
        do_action('woocommerce_after_shop_loop');
      } else {
        do_action('woocommerce_no_products_found');
      }
    

    使用上面的代码,您可以自定义 wc_get_products() 参数以获取所需产品的 ID(如果您有特定条件)。一旦该代码到位,您就可以使用原生 WooCommerce 循环的所有功能——分页、排序等。This method is superior to WP_Query and get_posts() because those two methods can break。

    我在这里写了一篇关于自定义 WooCommerce 循环的更详细的博客文章:https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

    【讨论】:

    • 如果循环是针对infinite scrolling 而不是针对pagination 怎么办?将显示重复的产品。
    • 如果你明白这里发生了什么,那么让它适应无限滚动应该不是一件容易的事。然而,仅仅因为你可以做某事,并不意味着你应该这样做!
    【解决方案3】:

    您还可以使用此代码获取类别

           $terms = get_terms('product_cat');
    
           foreach ($terms as $term) {
             $term_link =  get_term_link( $term, 'product_cat' );
             echo '<li><a href="' . $term_link . '">' . $term->name . '</a></li>';
           }
    

    如果您只想要父类别,那么

    wp_list_categories('taxonomy=product_cat&orderby=order&title_li=&depth=1'); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多