【问题标题】:WooCommerce category tree with all products包含所有产品的 WooCommerce 类别树
【发布时间】:2018-01-23 03:46:51
【问题描述】:

我需要显示类别树和每个类别下的完整产品列表。

我使用 WP_Query 获取产品的完整列表,但仍然无法显示类别/子类别并在每个类别下列出相关产品。我正在寻找一种需要对数据库进行最少查询的方法。

有什么帮助吗? (不需要 html 或 jquery,我只需要结果数组)

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    最终的结果会是这样的。

    SUBCAT 1

    ----- 产品1

    ----- 产品 2

    ----- SUBCAT 1 的子类 1

    -------- 产品1

    -------- 产品2

    -------- 产品3

    SUBCAT 2

    ----- 产品1

    ----- 产品 2

    ----- 产品 3

        <?php
        // Remove breadcrumb if needed
        $post_id = yiw_post_id();
        if( get_post_meta( $post_id, '_show_breadcrumbs_page', true ) == 'no' ) {
            remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0 );
        }
    
        if( get_post_meta( $post_id, '_slogan_page', true ) ) {
            get_template_part('slogan');
        }
        /**
         * woocommerce_before_main_content hook
         *
         * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
         * @hooked woocommerce_breadcrumb - 20
         */
        do_action('woocommerce_before_main_content');
    ?>
    
        <h1 class="page-title"><?php if( get_post_meta( yiw_post_id(), '_show_title_page', true ) == 'yes' ) woocommerce_page_title(); ?></h1>
    
        <div class="clear"></div>
    
        <?php if ( is_tax() && get_query_var( 'paged' ) == 0 ) : ?>
            <?php echo '<div class="term-description">' . yiw_addp( term_description() ) . '</div>'; ?>
        <?php elseif ( ! is_search() && get_query_var( 'paged' ) == 0 && ! empty( $shop_page ) && is_object( $shop_page ) ) : ?>
            <?php echo '<div class="page-description">' . apply_filters( 'the_content', $shop_page->post_content ) . '</div>'; ?>
        <?php endif; ?>
    
        <?php if ( have_posts() ) : ?>
            <?php
            $args = array(
                'taxonomy' => 'product_cat',
            );
    
            $cats = get_categories($args);
    
            foreach ( $cats as $cat ):
                if ( !$cat->parent ):
                    echo '<div class="clear"></div><h1>' . $cat->name . '</h1>';
    
                    // display products which are directly associated with the product category TODO: display only direct products
                    $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => $cat->slug, 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $cat->slug, 'include_children' => false  ) ) );
    
                    $wp_query = new WP_Query( $args );
    
                    ?>
                    <?php
                    /**
                    * woocommerce_pagination hook
                    *
                    * @hooked woocommerce_pagination - 10
                    * @hooked woocommerce_result_count - 20
                    * @hooked woocommerce_catalog_ordering - 30
                    */
                    do_action( 'woocommerce_before_shop_loop' );
                    ?>
    
                    <?php woocommerce_product_loop_start(); ?>
    
                    <?php woocommerce_product_subcategories(); $woocommerce_loop['loop'] = 0; $woocommerce_loop['columns'] = 0; ?>
    
                    <?php while ( have_posts() ) : the_post(); ?>
    
                        <?php woocommerce_get_template_part( 'content', 'product' ); ?>
    
                    <?php endwhile; // end of the loop. ?>
    
                    <?php                   
                    // get children product categories
                    $subcats = get_categories( array( 'hide_empty' => 0, 'parent' => $cat->term_id, 'taxonomy' => 'product_cat' ) );
    
                    if ( count($subcats) > 0 ):
                        $original_query = $wp_query;
    
                        foreach ( $subcats as $subcat ):
                            set_query_var('category_header_level', 2);
                            set_query_var('category', $subcat);
                            woocommerce_get_template_part( 'archive-product-child-category', 'loop' ); 
                        endforeach;
                        $wp_query = null;
                        $wp_query = $original_query;
                        wp_reset_postdata(); 
                    endif;
                    else:
                    /*  $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => $cat->slug );
                        $wp_query = new WP_Query( $args );
                        ?>
                        <?php
                        /**
                        * woocommerce_pagination hook
                        *
                        * @hooked woocommerce_pagination - 10
                        * @hooked woocommerce_result_count - 20
                        * @hooked woocommerce_catalog_ordering - 30
                        */
                    /*  do_action( 'woocommerce_before_shop_loop' );
                        ?>
    
                        <?php woocommerce_product_loop_start(); ?>
    
                        <?php woocommerce_product_subcategories(); $woocommerce_loop['loop'] = 0; $woocommerce_loop['columns'] = 0; ?>
    
                        <?php while ( have_posts() ) : the_post(); ?>
    
                            <?php woocommerce_get_template_part( 'content', 'product' ); ?>
    
                        <?php endwhile; // end of the loop. ?>
                        <?php */
    
                    endif;
            endforeach;
            $wp_query = null;
            $wp_query = $original_query;
            wp_reset_postdata();
            ?>  
            <?php woocommerce_product_loop_end(); ?>
    
            <?php do_action('woocommerce_after_shop_loop'); ?>
    
        <?php else : ?>
    
            <?php if ( ! woocommerce_product_subcategories( array( 'before' => woocommerce_product_loop_start( false ), 'after' => woocommerce_product_loop_end( false ) ) ) ) : ?>
                <div class="clear"></div>
                <p><?php _e( 'No products found which match your selection.', 'woocommerce' ); ?></p>
    
            <?php endif; ?>
    
        <?php endif; ?>
    
    
        <div class="clear"></div>
    
        <?php
            /**
             * woocommerce_pagination hook
             *
             * @hooked woocommerce_pagination - 10
             * @hooked woocommerce_catalog_ordering - 20
             */
            do_action( 'woocommerce_pagination' );
        ?>
    
    <?php
        /**
         * woocommerce_after_main_content hook
         *
         * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
         */
        do_action('woocommerce_after_main_content');
    ?>
    
    <?php
        /**
         * woocommerce_sidebar hook
         *
         * @hooked woocommerce_get_sidebar - 10
         */
        do_action('woocommerce_sidebar');
    ?>
    

    取自Prafulla Kumar Sahu对此question的回答

    【讨论】:

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