Есть дизайнерские решения в виде раздела "проекты". Нужно вывести плитку главных категорий (картинка + заголовок ссылка на дочерние кат.) на странице "проекты" с переходом в дочерние категории и в конечной категории, что бы были проекты с переходом в одиночный пост "проекта".
Был создан раздел "Проекты" в админке и зарегистрированы таксономии:
# Проекты
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();
И схема как должно быть: