WordPress – Список подкатегорий и подподкатегорий с записями

Вопрос или проблема

У меня есть следующий код. Он позволяет мне показывать подкатегории и документы внутри них. Дело в том, что подкатегория может содержать дальнейшие подкатегории. Код ниже покажет документы, принадлежащие подподкатегории (внуку), на уровне подкатегории (родителя).

Пожалуйста, может кто-то объяснить, как решить эту проблему, чтобы документы отображались только под категорией, к которой они относятся напрямую? Кроме того, как выделить, что такое подподкатегория (внук)? Все заголовки постов должны быть связаны с соответствующим постом.

<?php
$categories =  get_categories('child_of=34');  
foreach  ($categories as $category) {
    //Отображение информации о подкатегории с использованием значений $category, таких как $category->cat_name
    echo '<h3>'.$category->name.'</h3>';
    echo '<ul>';

    foreach (get_posts('cat=".$category->term_id) as $post) {
        setup_postdata( $post );
        echo "<li><a href='".get_permalink($post->ID)."'>".get_the_title().'</a></li>';   
    }  
    echo '</ul>';
}
?>

Что-то вроде следующего:

  • Подкатегория 1
    • Пост 1
    • Пост 2
  • Подкатегория 2
    • Подподкатегория 1
      • Пост 3
    • Подподкатегория 2
      • Пост 4

Попробуйте это:

<!-- Начало архива категории -->
<ul class="catArchive">
<?php
$catQuery = $wpdb->get_results("SELECT * FROM $wpdb->terms AS wterms INNER JOIN $wpdb->term_taxonomy AS wtaxonomy ON ( wterms.term_id = wtaxonomy.term_id ) WHERE wtaxonomy.taxonomy = 'category' AND wtaxonomy.parent = 0 AND wtaxonomy.count > 0");

$catCounter = 0;

foreach ($catQuery as $category) {

    $catCounter++;

    $catStyle="";
    if (is_int($catCounter / 2)) $catStyle=" class="catAlt"";

    $catLink = get_category_link($category->term_id);

    echo '<li'.$catStyle.'><h3><a href="'.$catLink.'" title="'.$category->name.'">'.$category->name.'</a></h3>';
        echo '<ul style="margin-left:15px;">';

        query_posts('category__in='.$category->term_id.'&showposts=5');?>

        <?php while (have_posts()) : the_post(); ?>
            <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>

            <li><a href="<?php echo $catLink; ?>" title="<?php echo $category->name; ?>">Больше <strong><?php echo $category->name; ?></strong></a></li>
     <li> <?php
     $sub_cat_id = $category->term_id;
     $get_sub_args = array('child_of' =>$sub_cat_id);
             $categories_arr =  get_categories($get_sub_args);  
             //print_r ($categories_arr);
    foreach  ($categories_arr as $sacategory) {
            //Отображение информации о подкатегории с использованием значений $category, таких как $category->cat_name
            echo '<h2>'.$sacategory->name.'</h2>';
            echo '<ul style="margin-left:15px;">';

            foreach (get_posts('cat=".$sacategory->term_id) as $post) {
                setup_postdata( $post );
                echo "<li><a href='".get_permalink($post->ID)."'>".get_the_title().'</a></li>';   
            }  
            echo '</ul>';
        }

     ?></li>



        </ul>
    </li>
    <?php } ?>
</ul>
<!-- Конец архива категории -->
    </div>

.

Ответ или решение

Как отобразить подкатегории и посты в WordPress

Вам необходимо организовать структуру отображения подкатегорий и их постов в WordPress таким образом, чтобы посты из подподкатегорий (внуков) не смешивались с постами из их родительских категорий. Давайте разберем, как это можно реализовать на практике.

Основные задачи:

  1. Отобразить подкатегории и связанные с ними посты так, чтобы каждая подкатегория показывала только свои посты.
  2. Подсветить подподкатегории (внуков).
  3. Сделать названия постов кликабельными, чтобы пользователи могли перейти к полным записям.

Пример кода

Ниже представлен код, который выполнит указанные задачи. В нем используется WordPress функции для получения категорий и постов:

<div class="s-prose js-post-body" itemprop="text">
<ul class="catArchive">
<?php
// Получаем все корневые категории - это может быть изменено на вашу нужную категорию
$catQuery = $wpdb->get_results("SELECT * FROM $wpdb->terms AS wterms INNER JOIN $wpdb->term_taxonomy AS wtaxonomy ON ( wterms.term_id = wtaxonomy.term_id ) WHERE wtaxonomy.taxonomy = 'category' AND wtaxonomy.parent = 0 AND wtaxonomy.count > 0");

foreach ($catQuery as $category) {
    // Ссылка на родительскую категорию
    $catLink = get_category_link($category->term_id);
    echo '<li><h3><a href="' . esc_url($catLink) . '">' . esc_html($category->name) . '</a></h3>';
    echo '<ul style="margin-left:15px;">';

    // Получаем посты из родительской категории
    query_posts('category__in=' . $category->term_id . '&showposts=5');
    while (have_posts()) : the_post();
        echo '<li><a href="' . get_permalink() . '" rel="bookmark">' . get_the_title() . '</a></li>';
    endwhile;

    // Получаем подкатегории
    $subCategories = get_categories(array('parent' => $category->term_id));
    foreach ($subCategories as $subCategory) {
        echo '<h4>' . esc_html($subCategory->name) . '</h4>';
        echo '<ul style="margin-left:15px;">';

        // Получаем посты из подкатегории
        foreach (get_posts(array('category' => $subCategory->term_id)) as $post) {
            setup_postdata($post);
            echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title() . '</a></li>';  
        }
        wp_reset_postdata();
        echo '</ul>';
    }

    echo '</ul></li>';
}
?>
</ul>
</div>

Пояснения к коду:

  1. Получение корневых категорий:
    Используется SQL-запрос к таблицам terms и term_taxonomy, чтобы получить только те категории, у которых нет родителя.

  2. Отображение постов:
    Функция query_posts() используется для извлечения постов из каждой категории.

  3. Получение подкатегорий:
    Внутренний цикл используется для получения подкатегорий текущей категории. Для каждой подкатегории выполняется тот же процесс получения и отображения постов.

  4. Структура HTML:
    Структура HTML организована так, что подкатегории и их посты отображаются в виде вложенных списков.

  5. Безопасность:
    Используются функции esc_url() и esc_html() для экранирования значений, что помогает защитить ваши данные от XSS атак.

SEO и читаемость

  • SEO-оптимизация: Использование заголовков (<h3>, <h4>) и описательных ссылок улучшает индексируемость поисковыми системами.
  • Читаемость: Код структурирован и комментирован, что облегчает его понимание и модификацию в будущем.

Этот подход предоставляет вам гибкое и эффективное решение для отображения иерархии категорий и постов в WordPress, обеспечивая при этом порядок и доступность данных для ваших пользователей.

Оцените материал
Добавить комментарий

Капча загружается...