Дерево категорий WooCommerce со всеми продуктами

Мне нужно отобразить дерево категорий и полный список продуктов по каждой категории.

Я использовал WP_Query, чтобы получить полный список продуктов, но все еще не мог показать категории / подкатегории и перечислить связанные продукты под каждым из них. Я ищу способ, который потребовал бы минимально возможных запросов к базе данных.

Любая помощь? (нет HTML или JQuery, мне просто нужен массив результатов)

0

Решение

Конечный результат будет примерно таким.

ПОДКАТ 1

—— Продукт 1

—— Продукт 2

—— Подкатегория 1 SUBCAT 1

——— Продукт 1

——— Продукт 2

——— Продукт 3

ПОДКАТ 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');
?>

Взято из ответа Прафулла Кумар Саху К этому вопрос

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector