Мне нужен простой обзор категорий и их подкатегорий. При щелчке по родительской категории отображаются только подкатегории этой категории. Но я также хочу, чтобы подкатегории отображались в другой подкатегории одного и того же родителя. Я понимаю, что queried_object_id (); изменяется при нажатии на подкатегорию. Но как мне сообщить об этом запросу?
Мой следующий код:
<ul>
<?php
$parentid = get_queried_object_id();
$taxonomy = 'product_cat';
$orderby = 'name';
$show_count = 0; // 1 for yes, 0 for no
$pad_counts = 0; // 1 for yes, 0 for no
$hierarchical = 1; // 1 for yes, 0 for no
$title = '';
$empty = 0;
$args = array(
'taxonomy' => $taxonomy,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$all_categories = get_categories( $args );
foreach ($all_categories as $cat) {
if ($cat->category_parent == 0) {
$category_id = $cat->term_id;
//echo $category_id;
echo '<li><a href = "'. get_term_link($cat->slug, 'product_cat') .'">'. $cat->name .' - '. $category_id .'</a></li>';
//echo $parentid;
if ($parentid == $category_id) {
//$cat = get_queried_object();
$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $category_id,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$sub_cats = get_categories( $args2 );
if ($sub_cats) {
echo '<ul>';
foreach($sub_cats as $sub_category) {
//echo $parentid;
echo '<li><a href = "'. get_term_link($sub_category->slug, 'product_cat') .'">'. $sub_category->name .' - '. $sub_category->term_id .'</a></li>';
//echo $sub_category->name ;
}
echo '</ul>';
}
}
}
}
?>
</ul>






Почему вы просто не используете виджет woocommerce для категорий продуктов с функцией Wordpress the_widget(), поскольку вы получите все таким образом:
the_widget( 'WC_Widget_Product_Categories', array( 'hide_empty' => false, 'hierarchical' => true, 'show_children_only' => true ) );
Он отобразит иерархический вертикальный список связанных категорий продуктов.
With
the_widget()function you can with:
- the 2nd parameter argument make changes in the Query
- the 3rd parameter argument make changes in the html output
виджет работает отлично, но я хочу показать только подкатегории родительской категории. И при нажатии на подкатегорию меню должно оставаться в неизменном состоянии.
в основном, когда в подкатегории получают queried_object и используют его для сравнения
@Solomax Я обновил свой ответ, добавив 'show_children_only' => true в массив аргументов ... может это то, что вы хотите. Попробуйте еще раз, пожалуйста.
По какой-то причине "show_children_only" у меня не работает. Если я вставляю виджет в область виджетов на панели управления, он работает, но если я вставляю его программно с помощью функции «the_widget», установка для show_children_only значения true (или 1) ничего не меняет. Отображаются все категории, а не только подкатегории текущей категории.
Я понял, что мне нужно установить «иерархический» в 0, чтобы «show_children_only» работало.
вы можете исключить текущую категорию / термин
'exclude' => $catID
в аргументах.
Я изменил код на основе получения $ parentid2 = получить_запрос_объект ();
Примечание: этот код находится в /woocommerce/archive-product.php
и я добавил оператор elseif с разными аргументами.
Может, многовато, но работает
<ul>
<?php
$parentid2 = get_queried_object();
$parentid = get_queried_object_id();
$taxonomy = 'product_cat';
$orderby = 'name';
$show_count = 0; // 1 for yes, 0 for no
$pad_counts = 0; // 1 for yes, 0 for no
$hierarchical = 1; // 1 for yes, 0 for no
$title = '';
$empty = 0;
$args = array(
'taxonomy' => $taxonomy,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$all_categories = get_categories( $args );
foreach ($all_categories as $cat) {
if ($cat->category_parent == 0) {
$category_id = $cat->term_id;
echo '<li><a href = "'. get_term_link($cat->slug, 'product_cat') .'">'. $cat->name .'</a></li>';
if ($parentid == $category_id) {
$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $category_id,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$sub_cats = get_categories( $args2 );
if ($sub_cats) {
echo '<ul>';
foreach($sub_cats as $sub_category) {
//echo $parentid;
echo '<li><a href = "'. get_term_link($sub_category->slug, 'product_cat') .'">'. $sub_category->name .'</a></li>';
//echo $sub_category->name ;
}
echo '</ul>';
}
}
elseif ($parentid2->parent == $category_id) {
$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $parentid2->parent,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$sub_cats = get_categories( $args2 );
if ($sub_cats) {
echo '<ul>';
foreach($sub_cats as $sub_category) {
//echo $parentid;
echo '<li><a href = "'. get_term_link($sub_category->slug, 'product_cat') .'">'. $sub_category->name .'</a></li>';
//echo $sub_category->name ;
}
echo '</ul>';
}
}
}
}
?>
</ul>
@LoicTheAztec у вас всегда есть чудо решения, когда дело доходит до этого;)