Вопрос или проблема
Как отобразить две отдельные архивы таксономий для двух типов записей, которые используют одну общую таксономию?
У меня есть нестандартный тип контента «продукты», который использует таксономию категорий с записями. Мы используем записи для обсуждения и обзора продуктов. Идея состоит в том, чтобы иметь два отдельных URL:
- /discussion/category/term/ : Отображает список записей, относящихся к конкретному термину, с областью «связанные продукты», извлекаемой из того же термина
- /products/category/term/ : Отображает список продуктов, относящихся к этому термину, с областью «связанные обсуждения», извлекаемой из того же термина
Я могу использовать стандартные шаблоны категории/архива с постоянной ссылкой для записей, и первый вариант решается по умолчанию. Но поскольку каждая таксономия имеет только один набор шаблонов, как я могу добиться второго?
Указанные выше URL являются примерами, и все типы архивов, в идеале, должны работать с обычными структурами перманентных ссылок после первоначальной части/слага.
Смотря на похожие вопросы, я видел предложения использовать две разные таксономии с одинаковыми терминами, но начиная с WordPress 3.7 термины двух разных таксономий больше не могут иметь одинаковый слаг, поэтому связь между ними является проблематичной для нетехнического администратора сайта.
Я также знаю, как использовать get_query_var(‘post_type’), чтобы различать два типа записей, но это не решает вопрос отдельных URL.
Любая помощь будет очень ценна!
Согласно WordPress Codex
archive-{post_type}.php
Таким образом, в вашем случае (в зависимости от вашего наименования):
archive-products.php
Если у вас есть архив нестандартной таксономии, тогда задача заключается в том, чтобы структурировать ваш архив для правильного представления шаблона таксономии.
Если вам нужно иметь архив нестандартной таксономии, я бы порекомендовал использовать приведённую выше структуру архива типа записи, а затем в файле архива определить, какая таксономия используется, и загрузить часть шаблона.
Пример псевдокода (в archive-products.php):
$tax = get_query_var( 'taxonomy' );
$term = get_query_var( 'term' );
if ($tax == 'your_taxonomy') {
get_template_part('my_slug', 'my_name');
} else {
// получить часть шаблона по умолчанию...
}
Ответ или решение
Для реализации двух отдельных архивов таксономий для двух типов постов, использующих общую таксономию, вам нужно создать специальную логику в вашей теме WordPress. Ваша задача состоит в том, чтобы разделить вывод постов и продуктов на основе одной и той же таксономии, используя некоторые пользовательские шаблоны. Ниже приведены шаги по реализации этого решения.
Шаг 1: Создайте пользовательские шаблоны архивов
-
Создание
archive-products.php
:
Создайте файлarchive-products.php
в директории вашей темы. Этот шаблон будет отвечать за отображение всех продуктов с конкретной категорией.<?php get_header(); ?> <h1><?php single_term_title(); ?></h1> <?php if (have_posts()) : ?> <ul> <?php while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php else : ?> <p><?php _e('Нет продуктов для отображения.'); ?></p> <?php endif; ?> <h2>Связанные обсуждения</h2> <?php // Получаем связанные посты $term = get_queried_object(); $related_posts = new WP_Query(array( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term->slug, ), ), )); if ($related_posts->have_posts()) : ?> <ul> <?php while ($related_posts->have_posts()) : $related_posts->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php else : ?> <p><?php _e('Нет обсуждений для отображения.'); ?></p> <?php endif; ?> <?php get_footer(); ?>
-
Создание
archive.php
илиtaxonomy.php
:
Если вы хотите, чтобы архивы постов отображались на стандартном шаблоне для категорий, вы можете использоватьarchive.php
илиtaxonomy.php
в зависимости от ваших потребностей. Обычноtaxonomy.php
предпочтительнее, так как он предоставляет больше возможностей для настройки.<?php get_header(); ?> <h1><?php single_term_title(); ?></h1> <?php if (have_posts()) : ?> <ul> <?php while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php else : ?> <p><?php _e('Нет обсуждений для отображения.'); ?></p> <?php endif; ?> <h2>Связанные продукты</h2> <?php // Получаем связанные продукты $term = get_queried_object(); $related_products = new WP_Query(array( 'post_type' => 'products', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term->slug, ), ), )); if ($related_products->have_posts()) : ?> <ul> <?php while ($related_products->have_posts()) : $related_products->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php else : ?> <p><?php _e('Нет продуктов для отображения.'); ?></p> <?php endif; ?> <?php get_footer(); ?>
Шаг 2: Настройка постоянных ссылок
Убедитесь, что у вас правильно настроены постоянные ссылки в разделе "Настройки" → "Постоянные ссылки". Это важно для того, чтобы WordPress правильно обрабатывал новые URL-адреса, такие как /discussion/category/term/
и /products/category/term/
.
Шаг 3: Проверка и отладка
После того как вы создали шаблоны, протестируйте их на соответствующих страницах, чтобы убедиться, что они правильно отображают результаты. Если вы столкнетесь с проблемами, проверьте наличие кэша и убедитесь, что ваши настройки постоянных ссылок обновлены.
Заключение
С помощью этих шагов вы сможете создать два отдельных архива таксономий для ваших постов и продуктов, используя одну и ту же таксономию. Таким образом, у вас будут отдельные страницы для обсуждений и продуктов, каждая из которых будет ссылаться на связанные записи.