Шаблон архива для терминов таксономии
У меня зарегистрирован произвольный тип записи [equipment] и таксономия [equipment_type], внутри которой есть родительские и дочерние категории. Например:
Equipment (Произвольный тип записи)
Equipment Types (Таксономия)
Cameras (Родительский термин)
Camera A (Дочерний термин)
Camera B
Я хочу создать страницу архива для терминов таксономии. Чтобы при выборе 'Cameras' или 'Camera A' отображалось, например, 12 записей с заголовком и миниатюрой (ссылки на отдельную запись), а также пагинация.
Я пробовал стандартный WP запрос и цикл, но в результате всегда отображаются все записи таксономии во всех терминах.
В настоящее время у меня настроен шаблон taxonomy-equipment_types.php
для обработки запроса.

Я хочу задокументировать это, так как недавно нашел ответ.
Проблема с таксономиями заключается в том, что большинство разработчиков ожидают увидеть таксономию внутри URL-адреса post_type
в формате:
http://hostname/post_type/taxonomy_term
Однако на самом деле URL будет выглядеть так:
http://hostname/taxonomy_slug/taxonomy_term
Это означает, что мы часто можем создавать шаблон правильно, например:
taxonomy-taxonomy_slug-taxonomy_term.php
Но правильный способ его использования — ожидать его внутри URL-адреса:
http://hostname/taxonomy_slug/taxonomy_term
Чтобы увидеть правильный URL для таксономии, мы можем использовать:
get_the_term_list($post->ID,'taxonomy_slug')
И проверить, куда именно ведет ссылка.

Иерархия шаблонов WordPress предоставляет точный файл шаблона, который вам нужен: taxonomy-{taxonomy}-{term}.php
.
Таким образом, чтобы создать пользовательский шаблон для термина cameras
таксономии equipment_types
, вам нужно создать файл с именем taxonomy-equipment_types-cameras.php
.
(Примечание: вы также можете создать файл шаблона для самой таксономии; просто опустите слаг {term}
: taxonomy-{taxonomy}.php
, или taxonomy-equipment_types.php
в вашем случае.)
Вы можете условно выводить контент на основе иерархии, запрашивая либо родительский термин через свойства объекта, возвращаемые функцией get_term()
, либо дочерние термины через get_term_children()
.

Спасибо, Chip, я думал, что шаблон WP предоставляет то, что мне нужно, как вы предложили: taxonomy-equipment_types.php
Думаю, моя сложность в том, чтобы разобраться, как выводить контент/записи на основе выбранных пользователем терминов как для родительских, так и/или дочерних категорий, например cameras или cameras-a.
Вы предлагаете использовать 'get_term()' для определения, какой контент/записи должны выводиться в цикле?
Я довольно новичок в PHP и сейчас учусь через Lynda.com. Так что мне нужно немного углубиться и попытаться понять процесс.
Не могли бы вы привести примерный пример, чтобы помочь мне понять, что нужно сделать?

У меня была похожая проблема. Основной недостаток приведенных выше решений в том, что все они требуют явного указания типа записи (CPT), таксономии или термина.
Если вам нужно динамически получать эти данные в зависимости от того, на странице какого типа записи находится пользователь (как вы указали), попробуйте следующее решение (которое работает у меня) - оно отображает все таксономии для текущего типа записи.
(изначально из этого поста с помощью GhostToast)
<?php get_header(); ?>
<div id="content">
<div id="main">
<ul>
<? // Начало запроса архивов терминов таксономий
$post_type = get_post_type(); // получаем название CPT
$taxonomies = get_object_taxonomies($post_type); // Находим таксономии
if($taxonomies){
foreach($taxonomies as $taxonomy){
// нужны только иерархические - без тегов
if(is_taxonomy_hierarchical($taxonomy)){
$terms = get_terms($taxonomy, array(
'orderby' => 'name',
'order' => 'Asc',
'hide_empty' => true ));
foreach ( $terms as $term ) {
// пример вывода ниже ?>
<li>
<h1><a href="<?php echo get_term_link($term->slug, $taxonomy); ?> "><? echo $term->name; ?></a></h1>
<div class="imgBox">
<a href="<?php echo get_term_link($term->slug, $taxonomy); ?> " title="<? echo $term->name; ?>" >
<img src="<?php echo get_template_directory_uri(); ?>/timthumb.php?src=/library/images/dingy-placeholder.png&h=196&w=285&zc=1" alt="<?php the_title(); ?>" /></a>
</div>
<div class="the-excerpt">
<a href="<?php echo get_term_link($term->slug, $taxonomy); ?> "><? echo $term->description; // это можно добавить в админке ?> - нажмите для подробностей</a>
</div>
</li>
<?
}
}
}
}?>
</ul>
<?php wp_reset_query(); ?>
</div> <!-- конец #main -->
</div> <!-- конец #content -->
<?php get_footer(); ?>
Сохраните приведенный выше код в файле с названием типа archive-mycpt.php, затем в archive.php добавьте после вызова header следующее:
<?php get_header(); ?>
<?php // это один из наших CPT? Если да, перенаправляем на кастомную страницу архива
if ( is_custom_post_type() ){
include (TEMPLATEPATH . '/archive-mycpt.php');
// если нет, продолжаем...
} else { ?>
<!-- содержимое archive.php -->
<? } ?>
