Отображение всех категорий и сообщений на одной странице в иерархии

Мой клиент настаивает на том, чтобы все категории и сообщения отображались на одной странице. Плохая идея, я знаю, но мне нужно это сделать.

В любом случае, структура выглядит примерно так:

Заголовок категории 1-го уровня> Заголовок категории 2-го уровня> …> Заголовок категории n-го уровня> Содержание сообщения.

Это будет структурировано в HTML что-то вроде:

<div class="cat primary">
<h2>1st Level Category Title</h2>
<div class="cat secondary">
<h3>2nd Level Category Title</h3>
<div class="cat tertiary">
<h4>3rd Level Category Title</h4>
...
<div class="cat tertairy">
<h4>nth Level Category Title</h4>
<div class="product">
<p>Post Content</p>
</div>
</div>
...
</div>
</div>
<div class="cat secondary">
<h3>2nd Level Category Title</h3>
<div class="product">
<p>Post Content</p>
</div>
</div>
</div>

Объяснение функциональности:

  • Первая категория получает класс «первичный», вторая — «вторичный» и все последующие «третичные». Я могу обойти это с помощью CSS, если это будет необходимо.
  • <h2> используется для основного названия, <h3> используется для вторичного заголовка, <h4> используется для всего последующего. Я могу обойти это с помощью CSS, если это будет необходимо.
  • Самый глубокий уровень категории в дереве отображает любые продукты в этой категории.

Я пробовал несколько вещей с get_terms() а также get_categories(), но я не могу понять, как определить, находится ли категория на самом глубоком уровне, и я не могу понять, как бесконечно глубоко войти в дерево категорий (в итоге мне приходится дублировать мой код для каждого нового слоя ).

Я сейчас экспериментирую с этим:

$categories = get_terms("product-category");
if ($categories && !is_wp_error($categories)) {
foreach($categories as $category) {
$children = get_terms("product-category", array(
"parent"   => $category->term_id,
));
if (count($children) == 0) {
echo $category->name;
}
}
}

Это проверяет, является ли оно самым глубоким в дереве, но на самом деле оно не создает дерево. Я буду продолжать играть с этим и сообщать о любом прогрессе. Помощь будет очень цениться.


ОБНОВЛЕНИЕ 4: С большой помощью @Nemutaisama я смог понять это! Вот мой окончательный код (слегка измененный по сравнению с ответом ниже):

function loadCategories($categories, $level) {
foreach($categories as $category) {
$cat_class = "";
$heading_tag = "";
if ($level == 1) {
$cat_class = "primary";
$heading_tag = "h2 style='text-align:center;'";
} elseif ($level == 2) {
$cat_class = "secondary";
$heading_tag = "h3";
} else {
$cat_class = "tertiary";
$heading_tag = "h4";
}
echo "<section class='cat $cat_class'>";
echo "<header>";
echo "<$heading_tag>{$category->name}<button>Expand</button></$heading_tag>";
if ($level == 1) {
echo "<hr  class='short' />";
}
echo "</header>";
if ($level > 1) {
echo "<div class='expander'>";
}
$children = get_terms("product-category", array(
"parent"   => $category->term_id,
));
if (count($children) == 0) {
$posts = get_posts(array(
"post_type" => "products",
"tax_query" => array(
array(
"field"    => "term_id",
"taxonomy" => "product-category",
"terms"    => $category->term_id,
)),
));
foreach ($posts as $post) {
if ($level < 2) {
$cat_class = "secondary";
$heading_tag = "h3";
} else {
$cat_class = "tertiary";
$heading_tag = "h4";
}
echo "<section class='cat $cat_class'>";
echo "<header><$heading_tag>{$post->post_title}<button>Expand</button></$heading_tag></header>";
echo "<div class='expander'>";
echo "<article>";
if (get_field("product_number", $post->ID)) {
echo "<div class='productNumber'><p># " . get_field("product_number", $post->ID) . "</p></div>";
}
echo "<div class='content'>";
echo wpautop($post->post_content);
echo "</div><!--/.content-->";
echo "</article>";
echo "</div><!--/.expander-->";
echo "</section><!--/.cat.$cat_class-->";
}
}
loadCategories($children, $level+1);
if ($level > 1) {
echo "</div><!--/.expander-->";
}
echo "</section><!--/.cat.$cat_class-->";
}
}
$categories = get_terms("product-category", array(
"parent" => 0,
));
if ($categories && !is_wp_error($categories)) {
loadCategories($categories, 1);
}

0

Решение

Я думаю, рекурсивная функция поможет вам.
что-то вроде этого

function loadCategories($categories, $level) {
foreach($categories as $category) {
$children = get_terms("product-category", array(
"parent"   => $category->term_id,
));
$cat_class = "";
$heading_tag = "";
if ($level == 1) {
$cat_class = "primary";
$heading_tag = "h2 style='text-align:center;'";
} elseif ($level == 2) {
$cat_class = "secondary";
$heading_tag = "h3";
} else {
$cat_class = "tertiary";
$heading_tag = "h4";
}
echo "<section class='cat $cat_class'>";
echo "<header>";
echo "<$heading_tag>{$category->name}<button>Expand</button></$heading_tag>";
if ($level == 1) {
echo "<hr  class='short' />";
}
echo "</header>";
if ($level > 1) {
echo "<div class='expander'>";
}
if (count($children) == 0) {
$posts = get_posts(array(
"post_type" => "products",
"tax_query" => array(
array(
"field"    => "term_id",
"taxonomy" => "product-category",
"terms"    => $category->term_id,
)),
));
foreach ($posts as $post) {
if ($level < 2) {
$cat_class = "secondary";
$heading_tag = "h3";
} else {
$cat_class = "tertiary";
$heading_tag = "h4";
}
echo "<section class='cat $cat_class'>";
echo "<header><$heading_tag>{$post->post_title}<button>Expand</button></$heading_tag></header>";
echo "<div class='expander'>";
echo "<article>";
if (get_field("product_number", $post->ID)) {
echo "<div class='productNumber'><p># " . get_field("product_number", $post->ID) . "</p></div>";
}
echo "<div class='content'>";
echo wpautop($post->post_content);
echo "</div><!--/.content-->";
echo "</article>";
echo "</div><!--/.expander-->";
echo "</section><!--/.cat.$cat_class-->";
}
}
loadCategories($children, $level+1);
if ($level > 1) {
echo "</div><!--/.expander-->";
}
echo "</section><!--/.cat.$cat_class-->";
}
}
$categories = get_terms("product-category");
if ($categories && !is_wp_error($categories)) {
loadCategories($categories, 1);
}
1

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

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

По вопросам рекламы [email protected]