@Rengen3883

Как создать плитку категорий с вложением подкатегорий и проектов в wordpress?

Есть дизайнерские решения в виде раздела "проекты". Нужно вывести плитку главных категорий (картинка + заголовок ссылка на дочерние кат.) на странице "проекты" с переходом в дочерние категории и в конечной категории, что бы были проекты с переходом в одиночный пост "проекта".

Был создан раздел "Проекты" в админке и зарегистрированы таксономии:
# Проекты
function custom_post_type_projects() {
    // Регистрация типа записи "Проекты"
    $labels = array(
        'name'               => 'Проекты',
        'singular_name'      => 'Проект',
        'menu_name'          => 'Проекты',
        'name_admin_bar'     => 'Проекты',
        'add_new'            => 'Добавить новый',
        'add_new_item'       => 'Добавить новый проект',
        'new_item'           => 'Новый проект',
        'edit_item'          => 'Редактировать проект',
        'view_item'          => 'Просмотреть проект',
        'all_items'          => 'Все проекты',
        'search_items'       => 'Искать проекты',
        'parent_item_colon'  => 'Родительский проект:',
        'not_found'          => 'Проекты не найдены',
        'not_found_in_trash' => 'Проекты в корзине не найдены',
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'menu_icon'          => 'dashicons-portfolio', // Иконка для раздела "Проекты". Можете выбрать другую иконку из списка Dashicons.
        'has_archive'        => true,
        'supports'           => array( 'title', 'editor', 'thumbnail' ), // Поддержка заголовка, редактора и миниатюры
        'rewrite'            => array( 'slug' => 'projects' ), // Слаг, под которым будет доступен раздел
    );

    register_post_type( 'projects', $args );

    // Регистрация таксономии "Категории" для типа записи "Проекты"
    $labels_taxonomy = array(
        'name'              => 'Категории',
        'singular_name'     => 'Категория',
        'search_items'      => 'Искать категории',
        'all_items'         => 'Все категории',
        'parent_item'       => 'Родительская категория',
        'parent_item_colon' => 'Родительская категория:',
        'edit_item'         => 'Редактировать категорию',
        'update_item'       => 'Обновить категорию',
        'add_new_item'      => 'Добавить новую категорию',
        'new_item_name'     => 'Название новой категории',
        'menu_name'         => 'Категории',
    );

    $args_taxonomy = array(
        'labels' => $labels_taxonomy,
        'hierarchical' => true,
        'rewrite' => array( 'slug' => 'project-category' ), // Слаг, под которым будет доступна таксономия
        'show_admin_column' => true, // Добавляем столбец в админке для отображения миниатюр
        'meta_box_cb' => 'post_categories_meta_box', // Добавляем метабокс для отображения миниатюр
    );

    register_taxonomy( 'project-category', 'projects', $args_taxonomy );
    
     // Регистрация таксономии "Теги" для типа записи "Проекты"
      $labels_tags = array(
        'name'              => 'Теги',
        'singular_name'     => 'Тег',
        'search_items'      => 'Искать теги',
        'all_items'         => 'Все теги',
        'edit_item'         => 'Редактировать тег',
        'update_item'       => 'Обновить тег',
        'add_new_item'      => 'Добавить новый тег',
        'new_item_name'     => 'Название нового тега',
        'menu_name'         => 'Теги',
    );

    $args_tags = array(
        'labels' => $labels_tags,
        'hierarchical' => false,
        'rewrite' => array( 'slug' => 'project-tags' ), // Слаг, под которым будет доступна таксономия
    );

    register_taxonomy( 'project-tags', 'projects', $args_tags );
        
}
add_action( 'init', 'custom_post_type_projects' );


Но получилось только вывести категории верхнего уровня c переходом в дочерние на одной странице.

Вот шаблон вывода:
<?php
/*
Template Name: Проекты - Категории
*/

get_header(); // Выводим заголовок сайта
?>

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <h1><?php single_term_title(); ?></h1> <!-- Выводим название текущей категории -->
        </div>
    </div>
    <div class="row">
        <?php
        $terms = get_terms( array(
            'taxonomy' => 'project-category', // Указываем таксономию, которую нужно вывести
            'parent' => 0, // Выводим только главные категории
            'hide_empty' => false, // Выводим все категории, включая пустые
        ) );
        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
            foreach ( $terms as $term ) {
                $thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true ); // Получаем ID изображения категории
                $image = wp_get_attachment_image_src( $thumbnail_id, 'thumbnail' ); // Получаем URL изображения миниатюры
                ?>
                <div class="col-md-4">
                    <a href="<?php echo esc_url( get_term_link( $term ) ); ?>"> <!-- Формируем ссылку на текущую категорию -->
                        <img src="<?php echo esc_url( $image[0] ); ?>" alt="<?php echo esc_attr( $term->name ); ?>" /> <!-- Выводим картинку с миниатюрой категории -->
                        <h3><?php echo esc_html( $term->name ); ?></h3> <!-- Выводим название категории -->
                    </a>
                </div>
                <?php
            }
        } else {
            echo '<p>Категории не найдены</p>'; // Выводим сообщение, если категории не найдены
        }
        ?>
    </div>
    <div class="row">
        <?php
        // Проверяем, есть ли у текущей категории дочерние категории
        $child_terms = get_terms( array(
            'taxonomy' => 'project-category', // Указываем таксономию, которую нужно вывести
            'parent' => get_queried_object_id(), // Указываем текущую категорию как родительскую
            'hide_empty' => false, // Выводим все категории, включая пустые
        ) );
        if ( ! empty( $child_terms ) && ! is_wp_error( $child_terms ) ) {
            foreach ( $child_terms as $child_term ) {
                // Получаем проекты из текущей дочерней категории
                $projects = get_posts( array(
                    'post_type' => 'project', // Указываем тип поста "Проект"
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'project-category', // Указываем таксономию
                            'field' => 'term_id',
                            'terms' => $child_term->term_id,
                            'include_children' => false, // Не включать дочерние категории
                        ),
                    ),
                    'posts_per_page' => -1, // Выводим все проекты
                    ) );
    ?>
            <div class="col-md-4">
                <a href="<?php echo esc_url( get_term_link( $child_term ) ); ?>"> <!-- Формируем ссылку на текущую дочернюю категорию -->
                    <h3><?php echo esc_html( $child_term->name ); ?></h3> <!-- Выводим название дочерней категории -->
                </a>
                <ul>
    <?php
                     if ( ! empty( $projects ) ) {
                         foreach ( $projects as $project ) {
                             ?>
                    <li><a href="<?php echo esc_url( get_permalink( $project->ID ) ); ?>"><?php echo esc_html( $project->post_title ); ?></a></li> <!-- Выводим список проектов из текущей дочерней категории -->
    <?php
                         }
                     } else {
                         echo '<li>Проекты не найдены</li>'; // Выводим сообщение, если проекты не найдены
                     }
                     ?>
                </ul>
            </div>
    <?php
         }
     }
     ?>
    </div>
</div>
                                                            
<?php
get_footer();


И схема как должно быть:
64469d86e1a11835722438.png
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы